VBA动力填充combobox
这里是设置,(所有testing代码)
我在名为“Devmod”的工作表上有一个combobox,
我创build了一个名为testing的模块,并在其中创build了以下子模块
Sub setcomb() Sheet1.Devmod.ListFillRange = Range(Sheets("Device_info").Range("l3"), _ Sheets("Device_info").Range("l3").End(xlDown)).Select End Sub
这运行正常,但不填充任何数据的combobox(虽然它确实select我想要的正确的单元格)
现在我知道我可以做这个创build一个名称范围,然后将其分配给combobox。
但我想要做的是当用户点击一个“更新button”每个combobox更新input的值。
从逻辑上讲,这将是
从Device_info工作表中select单元格的范围,单元格L3处开始并计算出最后使用的单元格。 将这些值分配给combobox。
我可以用一行或两行代码来做到这一点吗?
干杯
DevilWAH
回答我的简单function结束了
Function setcomblist(wsheet As String, startrng As String, Optional endrng As Variant) 'used to populate comboboxes from a dynamic lenth range taking named sheet and starting cell as argument. 'use: combobox.ListFillRange = setcombolist("sheetname", "startcell") If IsMissing(endrng) Then setcomblist = Range(Sheets(wsheet).Range(startrng), Sheets(wsheet).Range(startrng).End(xlDown)).Address(External:=True) Else setcomblist = Range(Sheets(wsheet).Range(startrng), Sheets(wsheet).Range(endrng)).Address(External:=True) End If End Function
感谢帮助人
ListFillRange
期望一个范围地址作为一个string。 如果要同时select范围并将其分配给combobox,则必须将其作为两行单独的代码来执行。 此外,因为您的单元格范围在另一个工作表上,所以您需要给出该范围的外部地址。 (否则combobox会认为你的意思是工作表上的范围。)
Sheet1.Devmod.ListFillRange = Range(Sheets("Device_info").Range("l3"), _ Sheets("Device_info").Range("l3").End(xlDown)).Address(External:=True)
为了清楚起见,我会重写它如下。
Sub setcomb() Dim rng as Range Set rng = Sheets("Device_info").Range("L3") Sheet1.Devmod.ListFillRange = Range(rng, rng.End(xlDown)).Address(External:=True) End Sub
另一方面,您也可以使用dynamic命名范围来完成此操作。 我不记得如何创造一个我的头顶,我会查找并稍后添加它。
对于一个dynamic的命名范围,在Refers To
input这样的内容。
=OFFSET(Device_info!$L$3,0,0,COUNTA(Device_info!$L$3:$L$303),1)
COUNTA
函数需要包含要允许的最大行数。 上面的例子创build一个dynamic的命名范围,最多可以增长到300行。 正如我可信的“ Excel Hacks ”一书所说:
在定义
COUNTA
的范围时,请避免包含整列数据的诱惑,以免强制COUNTA
函数计算数千个不必要的单元。
Dim rngList as range With Sheets("Device_info") Set rngList = .Range(.Range("l3"),.Range("l3").End(xlDown)) End With Sheet1.Devmod.ListFillRange = rngList.Address(,,,true)