在Excel组合框中动态设置ListFillRange

在Excel组合框中动态设置ListFillRange,excel,vba,Excel,Vba,我试过这样做: cmbMyBox.ListFillRange = "E2" 但是组合框似乎没有填充 好的,我不想再次回答我自己的问题,但combobox for Excel上的ListFillRange属性绝对令人恼火。这是我实现的最后一段代码 Sheet1.Range("E3").CurrentRegion.Select Dim example as Range Set example = Selection With cmbMyBox .ListFil

我试过这样做:

 cmbMyBox.ListFillRange = "E2"

但是组合框似乎没有填充

好的,我不想再次回答我自己的问题,但combobox for 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)并且无法调整。

首先,要尝试从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及更高版本中,转到功能区选项卡“公式”,然后单击“名称管理器”按钮 您可以在此处管理所有已定义的命名区域,而不是在左上角的框中选择单元格并为其命名。 创建一个新的,并给它赋值(不带引号):

“=Sheet1!$A$1:INDEX(Sheet1!$A:$A;COUNTA(Sheet1!$A:$A))”

好了


另外,当您更改动态命名范围时,应使用VBA重新设置.ListFillRange,以便组合框将刷新其列表项。

或者,我是这样做的:

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

然后使用offset函数定义以下数据范围名称(无标题和尾部记录)

假设“DataRange”=偏移量(DataList,1,0,行(DataList)-2)

这也行得通。但是,您必须使用已经建议的索引和counta来执行定义的名称,或者您可以在表中引用它们两次。我的意思是,把你的数据做成表格。从Combobox1中引用您想要作为选项标题的列,并在名称中添加一个列,例如水果1,然后定义一个辅助命名范围,该范围引用水果1,称为水果。
这在Excel 2010上运行良好:

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

代码:


我也面临着类似的问题,无法用单元格验证规则中的列表引用填充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

我有一个类似的问题,工作表中有一个ActiveX列表框。对我有效的是:

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

ActiveX对象非常直截了当。

如果您使用上面的listItems建议,则无法修复:“=Sheet1!$A$1:INDEX(Sheet1!$A:$A;COUNTA(Sheet1!$A:$A))”这是可行的,但非常奇怪的是,我们必须定义两个名称。一个是指表格,下一个是指名字。我知道这个答案很古老,但希望你能得到这个评论。我似乎无法在名称管理器中创建此动态范围。当我尝试时,我得到一个错误,这个公式有问题。您正在尝试键入公式吗?等。您的代码似乎无法处理
“=INDIRECT(A1)”
等公式。但是,如果我将
范围
更改为
应用程序.评估
,代码就像一个符咒。
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
Sheets(1).OLEObjects("ListBox1").ListFillRange = "Sheet2!A1:C20"