Vba 使用其他工作表中的动态值填充组合框

Vba 使用其他工作表中的动态值填充组合框,vba,excel,combobox,Vba,Excel,Combobox,---更新--- 感谢您的回复,我发现DragonSamu的更新答案非常有效 ---原职--- 在过去的几个小时里,我一直在想我到底哪里出了问题,但我看不出来。我认为这是因为脚本试图从活动工作表中提取值,这不是我想要的。希望有人能让我走上正轨——我认为答案应该相对明显,但我就是看不到 基本上,我试图用另一个工作表(但在同一工作簿中)中存在的动态值范围填充组合框。当我在工作表“Materials”中运行脚本时(动态列表是从中绘制的),我可以让组合框填充,但当我在工作表“Products”中运行脚

---更新---

感谢您的回复,我发现DragonSamu的更新答案非常有效


---原职---

在过去的几个小时里,我一直在想我到底哪里出了问题,但我看不出来。我认为这是因为脚本试图从活动工作表中提取值,这不是我想要的。希望有人能让我走上正轨——我认为答案应该相对明显,但我就是看不到

基本上,我试图用另一个工作表(但在同一工作簿中)中存在的动态值范围填充组合框。当我在工作表“Materials”中运行脚本时(动态列表是从中绘制的),我可以让组合框填充,但当我在工作表“Products”中运行脚本时,则无法填充组合框

不幸的是,该脚本旨在使用材料填充产品,因此当“产品”工作表打开时,脚本将以用户表单运行,因此“材料”工作表将处于非活动状态

我还应该注意到,这个脚本是根据我在这个论坛的其他地方找到的代码改编的,因此,如果它看起来很熟悉,我提前向您表示感谢:)

非常感谢您的帮助

干杯


Simon

据我所知,您的代码将在此处出现错误:

If Len(rRange.Offset(1, 0).Formula) > 0 Then
    Set rRange = Range(rRange, rRange.End(xlDown))
End If
因为您试图通过使用
Range()
来设置
Range
,而不首先定义
工作表。这将从
活动工作表
中获取
范围

将其更改为以下内容:

If Len(rRange.Offset(1, 0).Formula) > 0 Then
    Set rRange = Worksheets("Materials").Range(rRange, rRange.End(xlDown))
End If
Private Sub UserForm_Initialize()

Dim wb as Workbook
Dim sh as Worksheet
Dim rRange As Range

On Error GoTo ErrorHandle

'Set the Workbook and Worksheet
set wb = Workbooks("products.xlsx")
set sh = wb.Worksheets("Materials")

'We set our range = the cell B7 in Materials
Set rRange = sh.Range("B7")

'Check if the cell is empty
If Len(rRange.Formula) = 0 Then
   MsgBox "The list is empty"
   GoTo BeforeExit
End If

'Finds the next empty row and expands rRange
If Len(rRange.Offset(1, 0).Formula) > 0 Then
   Set rRange = sh.Range(rRange, rRange.End(xlDown))
End If
最佳做法如下:

If Len(rRange.Offset(1, 0).Formula) > 0 Then
    Set rRange = Worksheets("Materials").Range(rRange, rRange.End(xlDown))
End If
Private Sub UserForm_Initialize()

Dim wb as Workbook
Dim sh as Worksheet
Dim rRange As Range

On Error GoTo ErrorHandle

'Set the Workbook and Worksheet
set wb = Workbooks("products.xlsx")
set sh = wb.Worksheets("Materials")

'We set our range = the cell B7 in Materials
Set rRange = sh.Range("B7")

'Check if the cell is empty
If Len(rRange.Formula) = 0 Then
   MsgBox "The list is empty"
   GoTo BeforeExit
End If

'Finds the next empty row and expands rRange
If Len(rRange.Offset(1, 0).Formula) > 0 Then
   Set rRange = sh.Range(rRange, rRange.End(xlDown))
End If
通过正确定义和设置
工作簿
工作表
,您可以正确引用它们,并且不会出现错误

更新:

第二个问题是
rRange.Address
只将
范围
位置放在
行源
中,而不是它需要查看的
工作表

更改:

Mat1_Name_ComBox.RowSource = rRange.Address
致:


通过这种方式,它将
工作表
名称包含到
.RowSource

中,代码在哪里给出错误?代码实际上不会抛出错误,这就是为什么is一直让我如此困惑的部分原因。当产品工作表处于活动状态时,组合框不会填充。谢谢,但不幸的是,同样的问题仍然存在(尽管它使我的代码变得更好)。当“材料”工作表处于活动状态时,组合框填充材料值(它显示从B7到B7的所有条目),但当“产品”工作表处于活动状态时,组合框不填充材料值。此后,我尝试将值插入到产品工作表中的单元格B7到B10中,这些值现在在产品工作表处于活动状态时显示。因此,它看起来仍然在引用活动页面。为了澄清,这两个都是一个工作簿中的工作表。@Simonclebrook它的2倍,得到了第二个问题现在将更新我的答案您可以使用
Mat1\u Name\u ComBox.RowSource=rRange.Address(外部:=True)
。另一种方法是用范围数组填充组合列表:
Mat1\u Name\u ComBox.list=rRange.Value