使用VBA在Excel ComboBox中动态设置ListFillRange

时间:2010-11-17 01:26:18

标签: vba excel-vba excel

我尝试过这样的事情:

 cmbMyBox.ListFillRange = "E2"

但是这个组合框似乎没有填充。

7 个答案:

答案 0 :(得分:11)

首先,要尝试从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))"

你去......

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

答案 1 :(得分:2)

好的,不要故意再次回答我自己的问题,但是这个用于Excel的combobox上的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),无法调整。

答案 2 :(得分:1)

Private Sub ComboBox1_Change()

Me.ComboBox2.ListFillRange = "=" & ComboBox1.Value

End Sub

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

答案 3 :(得分:1)

我遇到了类似的问题,无法使用从单元格验证规则中查看的列表引用来填充ActiveX ComboBox。

与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

答案 4 :(得分:0)

或者,我就是这样做的:

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

然后使用偏移函数定义以下数据范围名称sans the header和trailer记录。

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

答案 5 :(得分:0)

这在Excel 2010上运行正常:

我在列#34; AN"中有一个项目列表每周都会变化(变大/变短)。我创建了一个名为" c"的变量。其中包含列表中的项目数。通过使用此变量,ComboBox(位于单元格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

答案 6 :(得分:0)

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

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

ActiveX OLEObject非常简单。