--- ---更新
感谢您的回复,我发现DragonSamu的更新答案非常有效。
---原帖---
我一直试图找出过去几个小时我出错的地方,但我无法发现它。我认为这是因为脚本试图从活动工作表中绘制值,这不是我想要的。希望有人可以把我放在仪式轨道上 - 我认为答案应该相对明显,但我只是看不到它!
基本上,我正在尝试使用另一个工作表中存在的动态范围值(但在同一工作簿中)填充Combobox。当我在工作表'Materials'(这是动态列表的绘制位置)中运行脚本时,我可以填充Combobox,但是当我在工作表'Products'中运行它时不能。
不幸的是,该脚本旨在使用材料填充产品,因此当“产品”工作表打开并且“材料”工作表因此处于非活动状态时,将在用户窗体中运行。
我还应该注意,这个脚本是根据我在本论坛其他地方找到的代码改编的,所以如果它看起来很熟悉,我会提前感谢你:)
Private Sub UserForm_Initialize()
Dim rRange As Range
On Error GoTo ErrorHandle
'We set our range = the cell B7 in Materials
Set rRange = Worksheets("Materials").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 = Range(rRange, rRange.End(xlDown))
End If
'The range's address is our rowsource
Mat1_Name_ComBox.RowSource = rRange.Address
Mat2_Name_ComBox.RowSource = rRange.Address
Mat3_Name_ComBox.RowSource = rRange.Address
Mat4_Name_ComBox.RowSource = rRange.Address
Mat5_Name_ComBox.RowSource = rRange.Address
BeforeExit:
Set rRange = Nothing
Exit Sub
ErrorHandle:
MsgBox Err.Description
Resume BeforeExit
End Sub
非常感谢任何帮助。
干杯,
西蒙
答案 0 :(得分:1)
从我可以看到你的代码会在这里给出错误:
If Len(rRange.Offset(1, 0).Formula) > 0 Then
Set rRange = Range(rRange, rRange.End(xlDown))
End If
因为您尝试使用rRange
设置Range()
而未先定义Worksheet
。这将从Range
获得ActiveWorksheet
。
将其更改为以下内容:
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
通过正确定义和设置Workbook
和Worksheet
,您可以正确引用它们并且不会出错。
更新
第二个问题是,rRange.Address
只会将Range
位置放在.RowSource
内,而不是Sheet
所需的位置。
变化:
Mat1_Name_ComBox.RowSource = rRange.Address
到:
dim strSheet as String
strSheet = "Materials"
Mat1_Name_ComBox.RowSource = strSheet + "!" + rRange.Address
这样,它会在Sheet
.RowSource
名称