引用另一个 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可能是Locationssheet。

工作代码

将第一个范围设置为内存的长版本例如

 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