【问题标题】:Dynamically set ListFillRange in Excel ComboBox在 Excel ComboBox 中动态设置 ListFillRange
【发布时间】:2020-07-06 10:40:23
【问题描述】:

我尝试做类似的事情:

 cmbMyBox.ListFillRange = "E2"

但组合框似乎没有填充。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    首先,要尝试从 VBA 设置 listfillrange,您需要包含“=”符号,如下所示:

    combobox.ListFillRange = "=E3:E13"
    

    而不是combobox.ListFillRange = "E3:E13",这是行不通的。

    你可以有一个动态的命名范围,例如:

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

    使用 VBA 像这样设置 ListFillRange:combobox.ListFillRange = "=listItems" 再次使用'=' 符号!!

    此动态范围 listItems 会根据您在 A 列中的值动态增长/缩小。

    我知道我回答得太晚了,但我注意到很多人认为命名范围总是必须固定的,而它们也可以是动态的......

    你是怎么做到的? 在 Excel 2007 及更高版本中,您转到功能区选项卡 "Formulas" 并单击“名称管理器”按钮 无需在左上角的框中选择单元格并为其命名,您可以在此处管理所有定义的命名范围。 创建一个新的,并为其赋值(不带引号):

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

    你去...

    附:当您让动态命名范围发生变化时,您应该使用 VBA 重新设置 .ListFillRange 以便组合框将刷新其列表项。

    【讨论】:

    • 我知道这个答案已经很老了,但希望你能得到这个评论。我似乎无法在名称管理器中创建此动态范围。当我尝试时,我收到There's a problem with this formula. Are you trying to type a formula? 等错误。
    【解决方案2】:

    好的,我不想再次回答我自己的问题,但是 Excel 组合框上的 ListFillRange 属性绝对令人抓狂。这是我实现的最终代码。

       Sheet1.Range("E3").CurrentRegion.Select
       Dim example as Range
       Set example = Selection
    
       With cmbMyBox
         .ListFillRange = example.Address(0, 0, x1A1, True)
       End With
    

    这里的问题是我试图使用动态范围来动态设置组合框,该动态范围会根据用户输入的值而变化。据我了解,我不能使用命名范围,因为命名范围是固定的,例如 (A3:Z20) 并且无法调整。

    【讨论】:

    • 如果您使用上面的建议 listItems 将无法修复:"=Sheet1!$A$1:INDEX(Sheet1!$A:$A;COUNTA(Sheet1!$A:$A))"
    【解决方案3】:

    我遇到了类似的问题,无法使用从单元格的验证规则中窥视的列表引用填充 ActiveX 组合框。

    与 Firedrawndagger 自己的解决方案类似,我将验证规则手动转换为 .ListFillRange 可以理解的格式。 我还意识到,它需要采用工作簿范围的格式,否则调用将无法从其他工作表中进行。

    这适用于所有验证源格式,包括:$A$1 / =NamedRange / =INDIRECT("Table1[Col2]") 翻译是:

    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
    

    【讨论】:

    • 您的代码似乎不适用于"=INDIRECT(A1)" 等公式。但是如果我将Range 更改为Application.Evaluate,代码就像一个魅力。
    【解决方案4】:
    Private Sub ComboBox1_Change()
    
    Me.ComboBox2.ListFillRange = "=" & ComboBox1.Value
    
    End Sub
    

    这也有效。但是您必须按照已经建议的那样使用索引和计数来定义名称,或者您可以在表中引用它们两次。我的意思是让你的数据成为一个表格。从 Combobox1 引用您想要作为选项标题的列,并在名称中添加一个,例如 Fruits1,然后定义一个引用 Fruits1 并称为 Fruits 的辅助命名范围Fruits Fruits1

    【讨论】:

    • 这行得通,但很奇怪我们必须定义两个名称。一个指表,下一个名称指第一个名称。
    【解决方案5】:

    或者,我就是这样做的:

    定义一个范围名称,其中包括标题行和尾行以及一个要开始的数据行,例如“DataList”

    然后使用偏移函数定义以下数据范围名称,不包含头尾记录。

    说 "DataRange" = Offset(DataList,1,0,Rows(DataList)-2)

    【讨论】:

      【解决方案6】:

      这在 Excel 2010 上运行良好:

      我在“AN”列中有一个项目列表,每周都会更改(变大/变短)。我创建了一个名为“c”的变量,其中包含列表中的项目数。通过使用此变量,组合框(位于单元格 S7:U7 上)现在将动态显示列表中实际包含的项目(组合框中没有空格或缺少项目)。

      代码:

      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
      

      【讨论】:

        【解决方案7】:

        我遇到了类似的问题,我在工作表中有一个 ActiveX 列表框。对我有用的是:

        Sheets(1).OLEObjects("ListBox1").ListFillRange = "Sheet2!A1:C20"
        

        ActiveX OLEObjects 非常简单。

        【讨论】:

          猜你喜欢
          • 2019-03-23
          • 1970-01-01
          • 1970-01-01
          • 2016-08-02
          • 1970-01-01
          • 2019-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多