#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. Это не ответ, и в любом случае нет необходимости активировать лист.