2017-04-01 6 views
1

Je travaille sur une petite interface graphique/formulaire Excel-VBA pour que l'utilisateur puisse lire et écrire des données depuis/vers un fichier .ini. UserForm a un MultiPage dans lequel l'utilisateur crée des pages à l'exécution et chaque page représentera une section ini. De plus, ces sections sont également indexées dans une section principale pour un traitement ultérieur: à ce stade, je parcours les pages MultiPage pour créer cet index. Le problème est, l'utilisateur doit pouvoir changer l'ordre de cet index. Maintenant, est-il possible de déplacer les pages dans une MultiPage à l'exécution? Je pensais quelque chose à l'effet deExcel-VBA MultiPage: déplacer/réorganiser/indexer des pages à l'exécution?

Me.MultiPage1.Pages(i).Index = i + 1 

mais évidemment cela ne fonctionne pas. Sinon, y a-t-il un moyen de passer un avant: = ou quelque chose de similaire à Multipage.Pages.Add pour contourner le problème? Si rien de tout cela fonctionne, je pense que je vais créer un contrôle ListBox séparé avec les boutons MoveUp/Down. Ouvert pour de meilleures solutions.

Répondre

2

Supposons que vous avez un UserForm qui ressemble à ceci:

enter image description here

Ensuite, vous pouvez inclure le code exemple ci-dessous pour déplacer l'ordre des Page éléments du MultiPage:

Option Explicit 

'moves selected page to left 
Private Sub CommandButton1_Click() 

    Dim pag As MSForms.Page 
    Dim lngPageCount As Long 

    ' get reference to page 
    Set pag = Me.MultiPage1.SelectedItem 
    ' get number of pages in multipage 
    lngPageCount = Me.MultiPage1.Pages.Count 
    ' check if trying to go left beyond first page and put to end 
    ' otherwise decrement pages position in multipage 
    If pag.Index = 0 Then 
     pag.Index = lngPageCount - 1 
    Else 
     pag.Index = pag.Index - 1 
    End If 

    ' update caption 
    Me.Label1.Caption = pag.Name & " is at index " & pag.Index 

End Sub 

'moves selected page to right 
Private Sub CommandButton2_Click() 

    Dim pag As MSForms.Page 
    Dim lngPageCount As Long 

    ' get reference to page 
    Set pag = Me.MultiPage1.SelectedItem 
    ' get number of pages in multipage 
    lngPageCount = Me.MultiPage1.Pages.Count 
    ' check if trying to go right beyond number of pages and put to start 
    ' otherwise increment pages position in multipage 
    If pag.Index = lngPageCount - 1 Then 
     pag.Index = 0 
    Else 
     pag.Index = pag.Index + 1 
    End If 

    ' update caption 
    Me.Label1.Caption = pag.Name & " is at index " & pag.Index 

End Sub 
+0

Merci beaucoup Robin, parfait. Donc Page.Index existe, je devais juste déclarer la page comme un objet séparé d'abord, correct? Depuis que mes pages sont créées au moment de l'exécution, j'ai dû modifier pour coder un peu et mettre dans une classe. Je posterai la solution dans un edit à la question, j'espère que c'est la procédure appropriée ici. Merci. –

+0

Salut - content que cela a aidé. Vous pouvez poster une réponse à votre propre question si vous avez une mise à jour de code qui résout votre problème. C'est probablement une meilleure option plutôt que de changer la question. –

+0

@RobinMackenzie sympa :) –

1

Pour ceux qui sont à la recherche de cela dans le futur, voici la solution complète en utilisant le code de Robin (Merci!), Mais placez une classe pour les pages créées lors de l'exécution. Je ne colle que le code pertinent à cette question, la procédure CopyPage peut également être appelée par l'utilisateur pour ajouter des pages pendant l'exécution. Maintenant, l'utilisateur peut également les déplacer à gauche et à droite entre les pages 2 (index 1) et n.

Dans mon module principal:

Public arrLeftButton() As New CButton 
Public arrRightButton() As New CButton 

Dans mon CButton Module de classe:

Option Explicit 
Public WithEvents CopyButton As MSForms.CommandButton 
Public WithEvents DeleteButton As MSForms.CommandButton 
Public WithEvents MoveLeft As MSForms.CommandButton 
Public WithEvents MoveRight As MSForms.CommandButton 

Private Sub MoveLeft_Click() 
    Dim pag As MSForms.Page 
    Dim lngPageCount As Long 
    Set pag = UFmodproject.MultiPage1.SelectedItem 
    lngPageCount = UFmodproject.MultiPage1.Pages.Count 
    If pag.Index > 1 Then 
     pag.Index = pag.Index - 1 
    End If 
End Sub 

Private Sub MoveRight_Click() 
    Dim pag As MSForms.Page 
    Dim lngPageCount As Long 
    Set pag = UFmodproject.MultiPage1.SelectedItem 
    lngPageCount = UFmodproject.MultiPage1.Pages.Count 
    If pag.Index < lngPageCount - 1 Then 
     pag.Index = pag.Index + 1 
    End If 
End Sub 

Et mon UserForm_Initialize:

Private Sub userform_initialize() 
    ReDim Preserve arrLeftButton(1 To 1) 
    ReDim Preserve arrRightButton(1 To 1) 
    Set arrLeftButton(1).MoveLeft = MultiPage1.Pages(1).Controls("MoveLeft1") 
    Set arrRightButton(1).MoveRight = MultiPage1.Pages(1).Controls("MoveRight1") 
    For i = 2 To GetINIString("Project", "NumberOfShipmentTypes", strINIPATH) 
     Call FormControls.CopyPage 
    Next 
End Sub 

Pourtant, dans un autre module standard, il peut donc être appelé d'ailleurs aussi:

Sub CopyPage() 
    Dim l As Double, r As Double 
    Dim Ctrl As Control 
    Dim newCtrl As Object 
    Dim pCount As Long 
    pCount = UFmodproject.MultiPage1.Pages.Count 

    '[...add pages and copy all controls] 

    For Each newCtrl In UFmodproject.MultiPage1.Pages(pCount).Controls 
     If Left(newCtrl.Name, Len(newCtrl.Name) - 1) = "MoveLeft" Then 
      ReDim Preserve arrLeftButton(1 To pCount) 
      Set arrLeftButton(pCount).MoveLeft = newCtrl 
     End If 
     If Left(newCtrl.Name, Len(newCtrl.Name) - 1) = "MoveRight" Then 
      ReDim Preserve arrRightButton(1 To pCount) 
      Set arrRightButton(pCount).MoveRight = newCtrl 
     End If 
    Next 
End Sub