Форма пользователя, ссылающаяся на другой лист Ошибка времени выполнения '1004': - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь получить окно списка формы пользователя для заполнения значений в диапазоне с другого листа и получаю эту ошибку. Я потратил так много времени, работая над этим, но безрезультатно. Я понимаю, что Excel не может видеть ссылочные листы "Продукты" и "Местоположения", но я не понимаю, почему.

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

1 Ответ

1 голос
/ 21 февраля 2020

Используйте полные ссылки на диапазон

Прежде всего было бы правильно объявить все переменные в 1-й строке кода As Range, в противном случае они видны As Variant:

   Dim LocationsList As Range, ProductsList As Range, Location As Range, Product As Range

2nd) Основная проблема, вызывающая ошибку 1004, заключается в том, что недопустимая ссылка на диапазон Range("B2").End(xlDown) всегда относится к диапазону в активной рабочей таблице. Поскольку в одном из обоих параметров внутренний диапазон относится к другому листу, вы не можете избежать ошибки.

Дополнительная подсказка: укажите промежуточную точку для проверки и изменения выбора листа вручную перед запуском пользовательской формы. Поэтому неверно говорить, что The first one seems to work, miraculously., это только потому, что активная рабочая таблица может быть лист Locations.

Рабочий код

Длинный вариант установки первого диапазона в память будет, например,

 Set LocationsList = ThisWorkbook.Worksheets("Locations").Range("B2", ThisWorkbook.Worksheets("Locations").Range("B2").End(xlDown))

. Это можно сократить, используя лист CodeName, например, Sheet1 (конечно, вы можете изменить его в окне инструментов редактора VB ~> (Name) на normal имя листа Excel)

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

...