Используйте полные ссылки на диапазон
Прежде всего было бы правильно объявить все переменные в 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