这是设置,(所有测试代码)
我在第一张页面上有一个名为“Devmod”的组合框
我创建了一个名为testing的模块,并在其中创建了以下子
Sub setcomb()
Sheet1.Devmod.ListFillRange = Range(Sheets("Device_info").Range("l3"), _
Sheets("Device_info").Range("l3").End(xlDown)).Select
End Sub
这运行正常,但没有用任何数据填充组合框(虽然它确实选择了我想要的正确单元格)
现在我知道我可以创建一个名称范围,然后将其分配给组合框。
但我要做的是当用户点击“更新按钮”时,每个组合框都会使用输入的值进行更新。
从逻辑上讲,这将是
从Device_info工作表中选择单元格范围, 从单元格L3开始,计算出最后使用的单元格。 将这些值分配给组合框。
我可以使用一行或两行代码吗?
干杯
DevilWAH
ANSWER 我的简单函数最终为
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
感谢agin帮助人们
答案 0 :(得分:2)
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)
答案 1 :(得分:2)
ListFillRange
期望范围地址为字符串。如果要同时选择范围并将其分配给组合框,则必须将其作为两行单独的代码。此外,由于您的单元格范围位于另一个工作表上,因此您需要提供范围的外部地址。 (否则组合框会认为你的意思是它的工作表上的范围。)
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
另一方面,您也可以使用动态命名范围执行此操作。我不记得如何创建一个我的头顶,我会查找并稍后添加。
对于动态命名范围,请在Refers To
中输入类似内容。
=OFFSET(Device_info!$L$3,0,0,COUNTA(Device_info!$L$3:$L$303),1)
COUNTA
函数需要包含您要允许的最大行数。上面的示例创建了一个动态命名范围,最多可以增加300行。正如我可信赖的“ Excel Hacks ”一书所说:
在定义
COUNTA
的范围时,要抵制包含的诱惑 整列数据,因此您不必强制执行COUNTA
可能会计入数千个不必要的细胞。