2016-09-29 2 views
0

J'essaie de réutiliser du code et donc de faire en sorte que les commandes dans une fonction appellent des résultats différents. Le problème semble être d'obtenir des références aux différents contrôleurs que je veux mettre à jour.Utilisation de commandes Excel VBA avec des variables

Function populate(num1, num2) 

Dim index As Integer 
index = ComboBox1.ListIndex 

ComboBox2.Clear 

Select Case index 
    Case Is = 0 
     With ComboBox2 
      ComboBox2.List = Worksheets("Sheet1").Range("A1:A10").Value 
     End With 
    Case Is = 1 
     With ComboBox2 
      ComboBox2.List = Worksheets("Sheet2").Range("A1:A10").Value 
     End With 
    Case Is = 2 
     With ComboBox2 
      ComboBox2.List = Worksheets("Sheet3").Range("A1:A10").Value 
     End With 
End Select 

End Function 

Private Sub ComboBox1_Change() 
Call populate(1, 2) 
End Sub 

Private Sub ComboBox3_Change() 
Call populate(3, 4) 
End Sub 

Private Sub ComboBox5_Change() 
Call populate(5, 6) 
End Sub 

Naturellement, pour chaque combobox que j'appelle (nombres impairs), il doit mettre à jour les valeurs du 2ème combobox (numéros pairs). Mais au lieu de copier le code sur chaque combobox impaire, je souhaite avoir une sorte de code qui est effectivement réutilisé par les appels de fonction comme indiqué ci-dessus.

Malheureusement, je ne suis pas sûr de la façon de faire fonctionner cela dans VBA. Inutile de dire que je voudrais que ce soit quelque chose comme (ce qui ne fonctionne pas):

Function populate(num1, num2) 

Dim index As Integer 
index = ComboBox + num1 + .ListIndex 

ComboBox + num1 + .Clear 

Select Case index 
    Case Is = 0 
     With ComboBox + num2 
      ComboBox + num2 + .List = Worksheets("Sheet1").Range("A1:A10").Value 
     End With 
    Case Is = 1 
     With ComboBox + num2 
      ComboBox + num2 + .List = Worksheets("Sheet2").Range("A1:A10").Value 
     End With 
    Case Is = 2 
     With ComboBox + num2 
      ComboBox + num2 + .List = Worksheets("Sheet3").Range("A1:A10").Value 
     End With 
End Select 

End Function 

Il y avait également un regard sur la question dupliquée possible, difficile qui n'a pas résolu mon problème. En fait, même si le sujet semble dupique, je ne pense pas que la question soit. J'essaie de combiner une commande partielle et une variable afin de créer la commande que je veux utiliser, alors que le duplicata possible semble vouloir quelque chose de légèrement différent ... Je me trompe peut-être, mais c'est ce que j'ai ressenti.

+1

double possible de [Excel Referencing Userform contrôle Nom Valeur partir d'une chaîne (VBA)] (http://stackoverflow.com/questions/24083717/reference-excel-userform-control-nom-valeur-de-chaîne-vba) – GSerg

Répondre

1

Au lieu de passer un numéro à votre sous-programme populate, passer les ComboBoxes que vous souhaitez traiter:

Sub populate(cb1 As ComboBox, cb2 As ComboBox) 
    Dim index As Integer 
    index = cb1.ListIndex 

    With cb2 
     .Clear 

     Select Case index 
      Case 0 
       .List = Worksheets("Sheet1").Range("A1:A10").Value 
      Case 1 
       .List = Worksheets("Sheet2").Range("A1:A10").Value 
      Case 2 
       .List = Worksheets("Sheet3").Range("A1:A10").Value 
     End Select 
    End With 
End Sub 

Private Sub ComboBox1_Change() 
    populate ComboBox1, ComboBox2 
End Sub 

Private Sub ComboBox3_Change() 
    populate ComboBox3, ComboBox4 
End Sub 

Private Sub ComboBox5_Change() 
    populate ComboBox5, ComboBox6 
End Sub 
1

Vous pouvez référencer vos listes déroulantes et d'autres contrôles à l'aide de la collection Sheet.Drawingobjects, comme:

ActiveSheet.DrawingObjects("ComboBox" & num2) 
1

En supposant que vous avez comboboxes UserForm alors votre code peut réduire jusqu'à:

Option Explicit 

Sub populate(num1, num2) 
    Dim shtName As String 

    shtName = "Sheet" & (Me.Controls("Combobox" & num1).ListIndex + 1) 
    With Me.Controls("Combobox" & num2) 
     .Clear 
     .List = Worksheets(shtName).Range("A1:A10").Value 
    End With 
End Sub 

Dans le cas contraire, si vous avez des comboboxes ActiveX Excel, alors il change légèrement pour:

Option Explicit 

Sub populate(num1, num2) 
    Dim shtName As String 

    shtName = "Sheet" & (ActiveSheet.DrawingObjects("ComboBox" & num1).Object.ListIndex + 1) 
    With ActiveSheet.DrawingObjects("Combobox" & num2).Object 
     .Clear 
     .List = Worksheets(shtName).Range("A1:A10").Value 
    End With 
End Sub 
+0

N'utilisant pas les userforms, les contrôleurs activeX sont là sur le classeur. Mon beau-père essaie de l'utiliser comme un document de toutes sortes. – SkyRaider

+0

hah me battre avec un montage :) Intéressant. Je vais vérifier demain – SkyRaider

+0

@ user2546442, voir la réponse éditée pour les comboboxes ActiveX Excel. Si j'ai répondu à votre question, veuillez marquer la réponse comme acceptée. Je vous remercie – user3598756