Dynamically set ListFillRange in Excel ComboBox

后端 未结 7 748
忘了有多久
忘了有多久 2020-12-01 22:40

I tried doing something like:

 cmbMyBox.ListFillRange = \"E2\"

But the combobox does not seem to populate.

相关标签:
7条回答
  • 2020-12-01 23:20

    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:

    listItems: "=Sheet1!$A$1:INDEX(Sheet1!$A:$A;COUNTA(Sheet1!$A:$A))"
    

    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):

    "=Sheet1!$A$1:INDEX(Sheet1!$A:$A;COUNTA(Sheet1!$A:$A))".

    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.

    0 讨论(0)
  • 2020-12-01 23:21
    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

    0 讨论(0)
  • 2020-12-01 23:26

    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
    
    0 讨论(0)
  • 2020-12-01 23:31

    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).

    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
    
    0 讨论(0)
  • 2020-12-01 23:40

    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)

    0 讨论(0)
  • 2020-12-01 23:41

    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.

    0 讨论(0)
提交回复
热议问题