使用另一个工作表中的动态值填充ComboBox

时间:2016-08-26 07:50:08

标签: excel vba excel-vba combobox

--- ---更新

感谢您的回复,我发现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

非常感谢任何帮助。

干杯,

西蒙

1 个答案:

答案 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

通过正确定义和设置WorkbookWorksheet,您可以正确引用它们并且不会出错。

更新

第二个问题是,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名称