J'ai essayé de faire quelque chose comme:ListFillRange dans Dynamiquement défini ComboBox Excel à l'aide VBA
cmbMyBox.ListFillRange = "E2"
Mais le combobox ne semble pas remplir.
J'ai essayé de faire quelque chose comme:ListFillRange dans Dynamiquement défini ComboBox Excel à l'aide VBA
cmbMyBox.ListFillRange = "E2"
Mais le combobox ne semble pas remplir.
Ok, ne veut pas dire de répondre à ma propre question, mais cette propriété ListFillRange sur combobox pour Excel était absolument exaspérante. Voici le code final que j'ai implémenté.
Sheet1.Range("E3").CurrentRegion.Select
Dim example as Range
Set example = Selection
With cmbMyBox
.ListFillRange = example.Address(0, 0, x1A1, True)
End With
Le problème ici est que je tentais de définir dynamiquement la zone de liste déroulante en utilisant une plage dynamique qui change en fonction de ce que les valeurs entrées utilisateur ont été données. Autant que je comprenne je ne pourrais pas employer une gamme nommée parce que les plages nommées sont FIXÉES, par exemple (A3: Z20) et ne peuvent pas être ajustées.
Tout d'abord, pour essayer de régler la ListFillRange de VBA, vous devez inclure le signe comme celui-ci « = »,:
combobox.ListFillRange = "=E3:E13"
et non combobox.ListFillRange = "E3:E13"
, cela ne fonctionnera pas.
Vous pourriez avoir une plage nommée dynamique, par exemple:
listItems: "=Sheet1!$A$1:INDEX(Sheet1!$A:$A;COUNTA(Sheet1!$A:$A))"
Utilisez VBA pour définir la ListFillRange comme ceci: combobox.ListFillRange = "=listItems"
Encore une fois, utilisez le signe '='
!!
Cette listItems gamme dynamique se développe/rétrécit de manière dynamique, en fonction des valeurs que vous avez dans la colonne A.
Je sais que je réponds vraiment en retard, mais j'ai remarqué que beaucoup de gens pensent plages nommées doivent toujours être fixe, alors qu'ils peuvent être dynamiques aussi bien ...
Comment ça marche? Dans Excel 2007 et supérieur, vous allez dans l'onglet "Formulas"
et cliquez sur le bouton "Gestionnaire de noms" Au lieu de sélectionner des cellules et de leur donner un nom dans cette boîte en haut à gauche, vous pouvez gérer toutes les plages nommées ici . Créer un nouveau, et donnez-lui la valeur (sans les guillemets):
"=Sheet1!$A$1:INDEX(Sheet1!$A:$A;COUNTA(Sheet1!$A:$A))"
.
Et voilà ...
P.S. Lorsque vous laissez la plage dynamique nommée changer, vous devez utiliser VBA pour redéfinir le .ListFillRange de sorte que la zone de liste déroulante actualise ses éléments de liste.
Sinon, voici comment je le fais:
Définir un nom de plage comportant des lignes d'en-tête et remorque plus une ligne de données pour commencer, dire « DataList »
Définissez ensuite le nom de la gamme de données suivantes sans les enregistrements d'en-tête et de bas de page utilisant la fonction de décalage.
Say "DataRange" = OFFSET (DataList, 1,0, rangées (DataList) -2)
Private Sub ComboBox1_Change()
Me.ComboBox2.ListFillRange = "=" & ComboBox1.Value
End Sub
Cela fonctionne aussi.Mais vous devez faire les noms définis avec l'index et le compte comme déjà suggéré, ou vous pouvez vous référer à eux deux fois dans un tableau. Ce que je veux dire par là, c'est faire de vos données un tableau. Référez-vous à la colonne que vous voulez comme le titre de votre option de Combobox1 et ajoutez un au nom, par exemple Fruits1, puis définissez une plage secondaire nommée qui fait référence à Fruits1 et s'appelle Fruits. Fruits Fruits1
Cela fonctionne très bien sur Excel 2010:
J'ai une liste d'éléments dans la colonne « AN » qui change (grossir/plus court) chaque semaine. J'ai créé une variable appelée "c" qui contient le nombre d'éléments dans la liste. En utilisant cette variable, le ComboBox (positionné sur les cellules S7: U7) affichera de façon dynamique les éléments réellement contenus dans la liste (pas d'espaces vides ou d'éléments manquants dans la liste déroulante).
code:
Dim rng As Range
Set rng = ActiveSheet.Range("S7:U7")
ActiveSheet.DropDowns.Add(rng.Left, rng.Top, rng.Width, rng.Height).Select
With Selection
.ListFillRange = "AN1:AN" & c
.LinkedCell = "$V$7"
.DropDownLines = 8
.Display3DShading = False
End With
je faisais face problème similaire, ne pas être en mesure de remplir la zone de liste déroulante ActiveX en référence de liste jeté un œil de la règle de validation d'une cellule.
De même que pour la propre solution de Firedrawndagger, je suis allé traduire manuellement la règle de validation dans un format compris par le .ListFillRange. Je me suis également rendu compte qu'il doit être dans un format Workbook-scope, sinon l'appel ne fonctionnera pas à partir d'autres feuilles.
Cela fonctionne avec tous les formats source de validation, y compris: $ A $ 1/= NamedRange/= INDIRECT ("Tableau 1 [Col2]") La traduction était:
Dim xStr As String
xStr = Target.Validation.Formula1
xStr = Right(xStr, Len(xStr) - 1)
xStr = Split(Range(xStr).Address(, , , True), "]")(1)
'...other irrelevant code
.ListFillRange = xStr
Wouldnt être fixé si vous avez utilisé la suggestion ci-dessus listItems: "= Sheet1! $ A $ 1: INDEX (Feuille1! $ A: $ A; COUNTA (Feuille1! $ A: $ A))" – David