Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel vba动态填充组合框_Excel_Vba_Combobox_Range - Fatal编程技术网

Excel vba动态填充组合框

Excel vba动态填充组合框,excel,vba,combobox,range,Excel,Vba,Combobox,Range,这是设置(所有测试代码) 我在第一张纸上有一个组合框,叫做“Devmod” 我创建了一个名为testing的模块,并在其中创建了以下子模块 Sub setcomb() Sheet1.Devmod.ListFillRange = Range(Sheets("Device_info").Range("l3"), _ Sheets("Device_info").Range("l3").End(xlDown)).Select End Sub 这运行

这是设置(所有测试代码)

我在第一张纸上有一个组合框,叫做“Devmod”

我创建了一个名为testing的模块,并在其中创建了以下子模块

Sub setcomb()

    Sheet1.Devmod.ListFillRange = Range(Sheets("Device_info").Range("l3"), _
                      Sheets("Device_info").Range("l3").End(xlDown)).Select
End Sub
这运行正常,但不会用任何数据填充组合框(尽管它确实选择了我想要的正确单元格)

现在我知道我可以创建一个名称范围,然后将其分配给组合框

但我试图做的是,当用户单击“更新按钮”时,每个组合框都会用输入的值进行更新

从逻辑上讲,这将是

从设备信息表中选择单元格范围, 从L3单元开始,计算出最后使用的单元。 将这些值指定给组合框

我可以用一行或两行代码来完成吗

干杯

恶魔

回答 我的简单函数以

    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
希望将范围地址作为字符串。如果要同时选择范围并将其分配给组合框,则必须将其作为两行单独的代码来执行。此外,由于您的单元格区域位于另一个工作表上,因此需要提供该区域的外部地址。(否则,组合框将认为您指的是其工作表上的范围。)

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)
为了清楚起见,我将其改写如下

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
另一方面,您也可以使用动态命名范围来执行此操作。我不记得如何在头顶上创建一个,我会查找它,然后添加它


对于动态命名范围,请在
引用的
中输入类似的内容

=偏移量(设备信息!$L$3,0,0,计数A(设备信息!$L$3:$L$303),1)

COUNTA
函数需要包括要允许的最大行数。上面的示例创建了一个动态命名范围,最多可以扩展到300行。正如我信任的《Excel黑客》一书所说:

定义
COUNTA
的范围时,请抵制包括在内的诱惑 一整列数据,这样您就不会强制
COUNTA
函数 计算潜在的数千个不必要的单元格


ListFillRange
需要一个范围地址作为字符串。如果要同时选择范围并将其分配给组合框,则必须将其作为两行单独的代码来执行。此外,由于您的单元格区域位于另一个工作表上,因此需要提供该区域的外部地址。(否则,组合框将认为您指的是其工作表上的范围。)

为了清楚起见,我将其改写如下

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
另一方面,您也可以使用动态命名范围来执行此操作。我不记得如何在头顶上创建一个,我会查找它,然后添加它


对于动态命名范围,请在
引用的
中输入类似的内容

=偏移量(设备信息!$L$3,0,0,计数A(设备信息!$L$3:$L$303),1)

COUNTA
函数需要包括要允许的最大行数。上面的示例创建了一个动态命名范围,最多可以扩展到300行。正如我信任的《Excel黑客》一书所说:

定义
COUNTA
的范围时,请抵制包括在内的诱惑 一整列数据,这样您就不会强制
COUNTA
函数 计算潜在的数千个不必要的单元格


啊,(External:=True)成功了,我很好地解决了如何到达您发布的单行,但没有“External”参数。无法找出它从表1而不是“设备信息”表中提取范围的原因。谢谢大家,你们很好:)我同意第二个块比较整洁,所以我将在compete函数中实现它。再次感谢大家。@Jean-FrançoisCorbett谢谢。啊,既然(外部:=真)成功了,我很好地解决了如何到达您发布的那一行,但没有“外部”参数。无法找出它从表1而不是“设备信息”表中提取范围的原因。谢谢大家,你们很好:)我同意第二个块比较整洁,所以我将在compete函数中实现它。再次感谢大家。@Jean-FrançoisCorbett谢谢。