Заполните два списка со списком значений таблицы

#excel #vba #combobox #userform

#excel #vba #выпадающий список #пользовательская форма

Вопрос:

У меня есть пользовательская форма, в которой есть два списка со списком.

 Private Sub UserForm_Initialize()

''''''' Preencher com os bancos ''''''

    Dim i As Long
    Dim n As Long
    Dim sh As Worksheet
    
    Set sh = ThisWorkbook.Sheets("Spreads")

    n = sh.Range("A" amp; Application.Rows.Count).End(xlUp).Row

    For i = 2 To n
        Me.BancoBox.AddItem Cells(i, 1)
    Next i
    
''''''' Preencher com os fornecedores ''''''
    
    Dim y As Long
    Dim f As Long
    Dim forn As Worksheet
    
    Set forn = ThisWorkbook.Sheets("Fornecedores")
    
    f = forn.Range("A" amp; Application.Rows.Count).End(xlUp).Row
    
    For y = 2 To f
        Me.FornecedorBox.AddItem Cells(y, 1)
    Next y
    
End Sub
 

Один выпадающий список предназначен для названий банков, а другой — для названий поставщиков, которые находятся в таблицах «Спреды» и «Форнекедоры» соответственно.

Они оба возвращают название банков.

Комментарии:

1. Вам нужно добавить ссылки на листы в обе строки Me.FornecedorBox.AddItem Cells(y, 1) .

2. Нравится Me.FornecedorBox.AddItem f.Cells(y, 1) ?

3. Нет, sh и forn , как вы использовали в других строках, в противном случае предполагается активный лист.

4. Спасибо, это сработало! (вы хотели бы опубликовать его как aswer, чтобы я мог пометить его как решение?)

Ответ №1:

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

 Private Sub UserForm_Initialize()

Dim i As Long
Dim n As Long
Dim sh As Worksheet

Set sh = ThisWorkbook.Sheets("Spreads")
n = sh.Range("A" amp; Application.Rows.Count).End(xlUp).Row

For i = 2 To n
    Me.BancoBox.AddItem sh.Cells(i, 1) 'sheet reference
Next i

Dim y As Long
Dim f As Long
Dim forn As Worksheet

Set forn = ThisWorkbook.Sheets("Fornecedores")
f = forn.Range("A" amp; Application.Rows.Count).End(xlUp).Row

For y = 2 To f
    Me.FornecedorBox.AddItem forn.Cells(y, 1) 'sheet reference
Next y
    
End Sub
 

Обратите внимание, однако, что самый быстрый способ заполнить поле со списком — использовать List свойство, и тогда вы можете вообще избежать циклов, например

 Me.FornecedorBox.List = forn.Range("A2:A" amp; f).Value
 

Ответ №2:

Вы должны активировать листы перед выполнением каких-либо действий с ними.

Комментарии:

1. Это не ответ, и в любом случае нет необходимости активировать лист.