2016-11-23 2 views
0

Pour un projet, je souhaite remplir une zone de liste déroulante sur un formulaire utilisateur avec un nombre variable d'options. Le montant des options dépend d'un montant donné plus tôt dans la feuille. L'utilisateur va entrer une valeur et attribuer des noms à toutes ces valeurs. Il se pourrait qu'il n'y ait que 2 noms, mais il pourrait aussi y en avoir 10 par exemple. Je voudrais que le Combobox utilise la valeur donnée (quantité de noms) pour se remplir avec les noms, qui sont stockés à des endroits différents. Mon code actuel est présenté ci-dessous, mais il me donne les éléments suivants Compile erreur et sélectionne alors la partie .AddItem en tant que source de l'erreur ..Utiliser une boucle For pour remplir une zone de liste déroulante

Compile error: Expected Function or variable

Private Sub UserForm_Initialize() 
'Sheet1.Range("A1") contains the value for the amount of names 

If Sheet1.Range("A1") = 0 Or Sheet1.Range("A1") = "" Then 
    'Do Nothing 
Else 
    With ComboBox1 
     For n = 1 To Sheet1.Range("A1") 
      'col determines the column in which the names are found 
      'The first name is in column 2, the next in column 10, etc. 
      col = 2 + 8 * (n - 1) 
      .AddItem = Sheet2.Cells(5, col) 
     Next 
    End With 
End If 

End Sub 

Espérons que mon problème est clair. J'ai le sentiment que je suis déjà très proche de la réponse, mais je ne pouvais pas trouver nulle part en utilisant Google ..

Répondre

4

.Additem est une méthode, pas une propriété que vous pouvez définir. Vous devez fournir l'élément comme un argument, à savoir

.AddItem Sheet2.Cells(5, col) 
+0

Merci beaucoup! – Peleus

1

comme alternative, vous pouvez utiliser la propriété List de ComboBox objet et le remplir par un tableau comme suit:

Private Sub UserForm_Initialize() 
    With Sheet1.Range("A1") 'reference the cell that contains the value for the amount of names 
     If .Value > 0 Then Me.ComboBox1.List = GetValues(.Value) '<--| fill ComboBox via its 'List' property passing it the array returned by GetValues() function 
    End With 
End Sub 

Function GetValues(nCols As Long) As Variant 
    Dim n As Long 

    ReDim vals(1 To nCols) As Variant '<--| size the array to match the amount of names passed in 
    For n = 1 To nCols 
     vals(n) = Sheet2.Cells(5, 2 + 8 * (n - 1)) '<--| fill the array: the first name is in column 2, the next in column 10, etc. 
    Next 
    GetValues = vals '<--| return the filled array 
End Function 

qui sera également votre code plus "modulaire"