Возникли проблемы с синтаксисом для заполнения списка

Я начинающий программист и делаю макрос VBA для своего старшего проекта. Я пытаюсь заполнить список данными в «столбце». Он должен быть динамическим, потому что пользователь будет редактировать данные. Я знаю, что это просто для опытного программиста, но у меня проблемы с синтаксисом. Любая помощь приветствуется!

Private Sub UserForm_Initialize()

Dim LastRowControllers, LastRowBrakes As Integer
Dim Brakes, Controllers As Range

With Worksheets("ControllersInventory")
LastRowControllers = .Cells(.Rows.Count, "A").End(xlUp).Row
End With

With Worksheets("BrakesInventory")
LastRowBrakes = .Cells(.Rows.Count, "A").End(xlUp).Row
End With

Set Controllers = Range(Cells(1, 1), Cells(LastRowControllers, 1))
Set Brakes = Range(Cells(1, 1), Cells(LastRowBrakes, 1))

'Populate Controller_List
Worksheets("ControllerInventory").Select
With Controller_List
.RowSource "= Controllers"
End With

'Populate Brake_List
Worksheets("BrakeInventory").Select

With Brake_List
   .RowSource "= Brakes"
End With
End Sub

Я нашел альтернативный способ заполнения списков, однако мой синтаксис неверен, и я хотел бы использовать правильные методы кодирования, используя объявленные диапазоны.

Brake_List.RowSource = Worksheets("BrakeInventory").Range(Cells(1, 1), Cells(LastRowControllers, 1)).Address

person Jack Lusk    schedule 20.03.2015    source источник
comment
Попробуйте изменить .address на .value   -  person Davesexcel    schedule 21.03.2015


Ответы (3)


Например:

Dim Rws As Long, Rng As Range
Rws = Cells(Rows.Count, "A").End(xlUp).Row
Set Rng = Range(Cells(1, 1), Cells(Rws, 1))
ListBox1.List = Rng.Value
person Davesexcel    schedule 20.03.2015
comment
@ Патрик Лепельтье: Как вы понимаете, что диапазон не является динамическим? - person Davesexcel; 22.03.2015
comment
listbox1.list заполняет его так же, как массив, чтобы динамически использовать listbox1.rowsource. Прежде чем задать дополнительные вопросы, откройте VBE и попробуйте... - person Patrick Lepelletier; 23.03.2015

Откажитесь от .Select, это ничего вам не купит

.RowSource ожидает диапазон. Вы пытаетесь присвоить ему строковое значение (обозначаемое ""), но вы не заходите так далеко, потому что знак = находится в кавычках.

With Controller_List
  .RowSource = Controllers
End With

'Populate Brake_List
With Brake_List
 .RowSource = Brakes
End With
person FreeMan    schedule 21.03.2015
comment
это выдает ошибку несоответствия типа и в любом случае будет работать только для диапазонов в активном листе, вам нужно ссылаться на листы! (смотри мой ответ) - person Patrick Lepelletier; 22.03.2015

Я вижу, вы часто забываете ссылаться на рабочий лист при использовании Range или Cells.

Option Explicit


Private Sub UserForm_Initialize()

'first error when declaring variables, you declared some as variant
Dim LastRowControllers as Long, LastRowBrakes As Long 'rows can go more than 65535 (integer limit) , so i use Long
Dim Brakes as Range, Controllers As Range

With Worksheets("ControllersInventory")
    LastRowControllers = .Cells(.Rows.Count, "A").End(xlUp).Row
    Set Controllers = .Range(.Cells(1, 1), .Cells(LastRowControllers, 1))
End With

With Worksheets("BrakesInventory")
    LastRowBrakes = .Cells(.Rows.Count, "A").End(xlUp).Row
    Set Brakes = .Range(.Cells(1, 1), .Cells(LastRowBrakes, 1))
End With

'Populate Controller_List

With Controller_List
    '.List= Controllers.value 'works but not dynamic
    .Rowsource = Controllers.Parent.Name & "!" & Controllers.Address
End With

'Populate Brake_List
With Brake_List
   '.List = Brakes.value 'works but not dynamic
   .Rowsource = Brakes.Parent.Name & "!" & Brakes.Address ' example  = "Sheet1!$A$1:$A$10"
End With

Set Brakes = Nothing
Set Controllers = Nothing

End Sub

Также обратите внимание, если данные должны быть динамическими, я думаю, что пользовательская форма должна называться следующим образом:

Userform1.Show False
person Patrick Lepelletier    schedule 22.03.2015