【问题标题】:Populating ComboBox with dynamic values from another worksheet使用来自另一个工作表的动态值填充 ComboBox
【发布时间】:2016-08-26 20:57:34
【问题描述】:

---更新---

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


---原帖---

在过去的几个小时里,我一直试图找出哪里出错了,但我找不到。我认为这是因为脚本试图从活动工作表中提取值,这不是我想要的。希望有人能把我放在仪式轨道上——我认为答案应该是相对明显的,但我就是看不到!

基本上,我正在尝试使用另一个工作表(但在同一个工作簿中)中存在的动态值范围填充组合框。当我在工作表“材料”(这是动态列表的来源)中运行脚本时,我可以填充组合框,但在工作表“产品”中运行它时却不能。

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

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

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

非常感谢任何帮助。

干杯,

西蒙

【问题讨论】:

  • 代码哪里报错了?
  • 该代码实际上并没有引发错误,这也是为什么一直让我如此困惑的部分原因。当产品工作表处于活动状态时,组合框不会填充。

标签: vba excel combobox


【解决方案1】:

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

If Len(rRange.Offset(1, 0).Formula) > 0 Then
    Set rRange = Range(rRange, rRange.End(xlDown))
End If

因为您尝试使用 Range() 设置 rRange 而没有先定义 Worksheet。这将从ActiveWorksheet 获得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

通过正确定义和设置您的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

【讨论】:

  • 谢谢,但不幸的是,同样的问题仍然存在(尽管它使我的代码更好)。当“材料”工作表处于活动状态(它显示从 B7 开始的所有条目)时,组合框会填充“材料”值,但在“产品”工作表处于活动状态时不会填充材料值。从那以后,我尝试将值插入到产品工作表中的单元格 B7 到 B10 中,现在当产品工作表处于活动状态时会显示这些值。所以看起来它仍在寻找引用活动页面。澄清一下,两者都是一个工作簿中的工作表。
  • @SimonColebrook 它的 2 折,现在得到第二个问题将更新我的答案
  • 你可以使用Mat1_Name_ComBox.RowSource = rRange.Address(External:=True)。另一种方法是使用范围数组填充组合列表:Mat1_Name_ComBox.List = rRange.Value
猜你喜欢
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多