引用另一个 sheet 运行 时的错误“1004”的用户表单:
User Form referencing another sheet Run-time error '1004':
我正在尝试获取一个用户表单列表框来填充另一个 sheet 范围内的值,但出现此错误。我花了很多时间研究它无济于事。我知道 excel 看不到引用的 sheets "Products" 和 "Locations",但我不明白为什么。
Option Explicit
Private Sub UserForm_Initialize()
Dim LocationsList, ProductsList, Location, Product As Range
Set LocationsList = ActiveWorkbook.Sheets("Locations").Range("B2", Range("B2").End(xlDown))
Set ProductsList = ActiveWorkbook.Sheets("Products").Range("B2", Range("B2").End(xlDown))
For Each Location In LocationsList
ListBoxLocations.AddItem Location.Value
Next
For Each Product In ProductsList
ListBoxProducts.AddItem Product.Value
Next
End Sub
使用完全限定范围引用
首先,在第一个代码行 As Range
中声明所有变量是正确的,否则会看到 As Variant
:
Dim LocationsList As Range, ProductsList As Range, Location As Range, Product As Range
2nd) 引发错误 1004 的主要问题是不合格的范围引用 Range("B2").End(xlDown)
始终引用活动工作中的范围 sheet。
由于在这两种设置之一中,内部范围指的是另一个 sheet,您无法避免错误。
进一步提示:在 运行 用户表单之前写一个停止以手动测试和更改您的 sheet 选择。 因此这样说是不正确的那The first one seems to work, miraculously.
,只是因为活跃的工作sheet可能是Locations
sheet。
工作代码
将第一个范围设置为内存的长版本例如
Set LocationsList = ThisWorkbook.Worksheets("Locations").Range("B2", ThisWorkbook.Worksheets("Locations").Range("B2").End(xlDown))
这可以通过使用 sheet 的代号来缩写,例如Sheet1(当然你可以在 VB 编辑器工具 Window ~> (Name)
属性 中将其更改为 normal Excel sheet 姓名)
Set LocationsList = Sheet1.Range("B2", Sheet1.Range("B2").End(xlDown))
或使用如下所示的 With ...
语句
接近您的 OP 的示例代码
Private Sub UserForm_Initialize()
Dim LocationsList As Range, ProductsList As Range, Location As Range, Product As Range
With ThisWorkbook.Worksheets("Locations")
Set LocationsList = .Range("B2", .Range("B2").End(xlDown))
End With
With ThisWorkbook.Worksheets("Products")
Set ProductsList = .Range("B2", .Range("B2").End(xlDown))
End With
For Each Location In LocationsList
ListBoxLocations.AddItem Location.Value
Next
For Each Product In ProductsList
ListBoxProducts.AddItem Product.Value
Next
End Sub
我正在尝试获取一个用户表单列表框来填充另一个 sheet 范围内的值,但出现此错误。我花了很多时间研究它无济于事。我知道 excel 看不到引用的 sheets "Products" 和 "Locations",但我不明白为什么。
Option Explicit
Private Sub UserForm_Initialize()
Dim LocationsList, ProductsList, Location, Product As Range
Set LocationsList = ActiveWorkbook.Sheets("Locations").Range("B2", Range("B2").End(xlDown))
Set ProductsList = ActiveWorkbook.Sheets("Products").Range("B2", Range("B2").End(xlDown))
For Each Location In LocationsList
ListBoxLocations.AddItem Location.Value
Next
For Each Product In ProductsList
ListBoxProducts.AddItem Product.Value
Next
End Sub
使用完全限定范围引用
首先,在第一个代码行 As Range
中声明所有变量是正确的,否则会看到 As Variant
:
Dim LocationsList As Range, ProductsList As Range, Location As Range, Product As Range
2nd) 引发错误 1004 的主要问题是不合格的范围引用 Range("B2").End(xlDown)
始终引用活动工作中的范围 sheet。
由于在这两种设置之一中,内部范围指的是另一个 sheet,您无法避免错误。
进一步提示:在 运行 用户表单之前写一个停止以手动测试和更改您的 sheet 选择。 因此这样说是不正确的那The first one seems to work, miraculously.
,只是因为活跃的工作sheet可能是Locations
sheet。
工作代码
将第一个范围设置为内存的长版本例如
Set LocationsList = ThisWorkbook.Worksheets("Locations").Range("B2", ThisWorkbook.Worksheets("Locations").Range("B2").End(xlDown))
这可以通过使用 sheet 的代号来缩写,例如Sheet1(当然你可以在 VB 编辑器工具 Window ~> (Name)
属性 中将其更改为 normal Excel sheet 姓名)
Set LocationsList = Sheet1.Range("B2", Sheet1.Range("B2").End(xlDown))
或使用如下所示的 With ...
语句
接近您的 OP 的示例代码
Private Sub UserForm_Initialize()
Dim LocationsList As Range, ProductsList As Range, Location As Range, Product As Range
With ThisWorkbook.Worksheets("Locations")
Set LocationsList = .Range("B2", .Range("B2").End(xlDown))
End With
With ThisWorkbook.Worksheets("Products")
Set ProductsList = .Range("B2", .Range("B2").End(xlDown))
End With
For Each Location In LocationsList
ListBoxLocations.AddItem Location.Value
Next
For Each Product In ProductsList
ListBoxProducts.AddItem Product.Value
Next
End Sub