Dynamically set ListFillRange in Excel ComboBox using VBA
I tried doing something like:
cmbMyBox.ListFillRange = "E2"
But the combobox does not seem to populate.
First of all, for trying to set the listfillrange from VBA, you need to include the '=' sign, like this:
combobox.ListFillRange = "=E3:E13"
and not combobox.ListFillRange = "E3:E13", this won't work.
You could have a dynamic named range, for example:
Use VBA to set the ListFillRange like this: combobox.ListFillRange = "=listItems" Again, use the '=' sign!!
This dynamic range listItems grows/shrinks dynamically, depending on what values you have in column A.
I know I'm answering really late, but I noticed a lot of people thinking named ranges always have to be fixed, while they can be dynamic as well...
How do you do this? In Excel 2007 and higher, you go to the ribbon-tab "Formulas" and click on the button "Name Manager" Instead of selecting cells and giving them a name in that upper-left box, you can manage all your defined named ranges here. Create a new one, and give it the value (without quotes):
There you go...
P.S. When you let the dynamic named range change, you should use VBA to re-set the .ListFillRange such that the combobox will refresh its list-items.
Ok, don't mean to answer my own question again but this ListFillRange property on combobox for Excel was absolutely maddening. Here's the final code that I implemented.
Sheet1.Range("E3").CurrentRegion.Select Dim example as Range Set example = Selection With cmbMyBox .ListFillRange = example.Address(0, 0, x1A1, True) End With
The trouble here was that I was trying to dynamically set the combobox using a dynamic range which changes depending on what user inputted values were given. As far as I understand I couldn't use a named range because named ranges are FIXED, e.g (A3:Z20) and cannot be adjusted.
Private Sub ComboBox1_Change() Me.ComboBox2.ListFillRange = "=" & ComboBox1.Value End Sub
This also works. But you have to do either the defined names with the index and counta as already suggested, or you can refer to them twice while in a table. What I mean by that, is make your data a table. Refer to the column you want as the title of your option from Combobox1 and add a one to the name, For example Fruits1, then define a secondary named range that refers to Fruits1 and is called Fruits. Fruits Fruits1
I was facing similar issue, not being able to populate the ActiveX ComboBox with list reference peeked from a cell's validation rule.
Similarly to Firedrawndagger's own solution I went for manually translating the validation rule to a format that is understood by the .ListFillRange. I realised also, that it needs to be in a Workbook-scope format, otherwise the call will not work from other sheets.
This works with All validation source formats, including: $A$1 / =NamedRange / =INDIRECT("Table1[Col2]") The translation was:
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
Alternatively, this is how I do it:
Define a range name that includes header and trailer rows plus one data row to start, say "DataList"
Then define the following data range name sans the header and trailer records using the offset function.
Say "DataRange" = Offset(DataList,1,0,Rows(DataList)-2)
This is working fine on Excel 2010:
I have a list of items in column "AN" that changes (get bigger/shorter) every week. I have created a variable called "c" which contains the number of items in the list. By using this variable, the ComboBox (positioned on cells S7:U7) will now dinamically show the items actually contained in the list (no empty spaces or missing items in the combobox).
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