Combobox listfillrange из 2-х разных листов - PullRequest
1 голос
/ 05 июня 2019

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

У меня есть эта функция для создания 2 диапазонов, которая работает:

    Dim lst as Range
    Dim lst2 as Range
    Set sht1 = ThisWorkbook.Worksheets("BaseAliments")
    Set sht2 = ThisWorkbook.Worksheets("BaseRecettes")
    Set lst = Range(sht1.Range("A1").address, sht1.Range("A" & sht1.Rows.Count).End(xlUp).address)
    Set lst2 = Range(sht2.Range("A1").address, sht2.Range("A" & sht2.Rows.Count).End(xlUp).address)

Но потом, когда я пытаюсь заполнить список, заполнить диапазон:

  Set Ctrl =Worksheets("Menu").OLEObjects.Add(ClassType:="Forms.ComboBox.1")
  With Ctrl
      .Name = "CB"
      '.ListFillRange = 'Something to concatenate lst and lst2
  End With
  • Союз не работает между листами
  • Мне нужно использовать поле со списком ActiveX (потому что они доступны для записи)

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Union просто не будет работать на разных листах. Я думаю, что лучше всего было бы добавить эти элементы по отдельности:

Set Ctrl = ActiveSheet.Shapes.AddFormControl(xlDropDown, Left:=Cells(1, 1).Left, Top:=Cells(2, 1).Top, Width:=100, Height:=20)

With Ctrl
    .Name = "CB"
    For Each cell In lst
        .ControlFormat.AddItem cell.Value
    Next cell
    For Each cell In lst2
        .ControlFormat.AddItem cell.Value
    Next cell
End With
1 голос
/ 05 июня 2019

I очень рекомендую подход с использованием For-Each, подобный тому, который продемонстрировал Jvdv, так как он прост, интуитивен и элегантен.

Если, однако, вам абсолютно необходимо сделать это по-своему (объединяя два списка в один), то вот мое предложение:

Sub initializeCombo()
Dim sht1 As Worksheet
Dim sht2 As Worksheet
Dim sht3 As Worksheet
Dim rng1 As Range
Dim rng2 As Range
Dim lst1 As Variant
Dim lst2 As Variant
Dim lst3 As Variant
Dim i As Long

Set sht1 = ThisWorkbook.Worksheets("WS1") 'The worksheet where the first list is
Set sht2 = ThisWorkbook.Worksheets("WS2") 'The worksheet where the second list is
Set sht3 = ThisWorkbook.Worksheets("WS3") 'The worksheet where the ComboBoxt is

Set rng1 = sht1.Range(sht1.Range("A1"), sht1.Range("A" & sht1.Rows.Count).End(xlUp))
Set rng2 = sht2.Range(sht2.Range("A1"), sht2.Range("A" & sht2.Rows.Count).End(xlUp))

lst1 = rng1
lst2 = rng2

''''''''''''Combine the 2 lists into one'''''''''''''
ReDim lst3(1 To UBound(lst1) + UBound(lst2))        '
For i = LBound(lst1) To UBound(lst1) Step 1         '
    lst3(i) = lst1(i, 1)                            '
Next i                                              '
For i = UBound(lst1) + 1 To UBound(lst3) Step 1     '
    lst3(i) = lst2(i - UBound(lst1), 1)             '
Next i                                              '
'''''''''''''''''''''''''''''''''''''''''''''''''''''

sht3.OLEObjects("ComboBox1").Object.List() = lst3
End Sub 

Наконец, если вы хотите программно создать, например, комбинированный список ActiveX в рабочем листе sht3 и назначить его с lst3, вы должны сделать это так:

    Dim Ctrl As Object
    Set Ctrl = sht3.OLEObjects.Add(ClassType:="Forms.ComboBox.1").Object
    Ctrl.List() = lst3

UPDATE

Версия JvdV, модифицированная для работы со списком ActiveX, будет выглядеть так:

Sub initializeCombo2()
Dim sht1 As Worksheet, sht2 As Worksheet, sht3 As Worksheet
Dim lst1 As Range, lst2 As Range, cell As Range
Dim Ctrl As Object

Set sht1 = ThisWorkbook.Worksheets("BaseAliments") 'The worksheet where the first list is
Set sht2 = ThisWorkbook.Worksheets("BaseRecettes") 'The worksheet where the second list is
Set sht3 = ThisWorkbook.Worksheets("Menu") 'The worksheet where the ComboBoxt is
Set lst1 = sht1.Range(sht1.Range("A1"), sht1.Range("A" & sht1.Rows.Count).End(xlUp))
Set lst2 = sht2.Range(sht2.Range("A1"), sht2.Range("A" & sht2.Rows.Count).End(xlUp))
Set Ctrl = sht3.OLEObjects.Add(ClassType:="Forms.ComboBox.1").Object

For Each cell In lst1
    Ctrl.AddItem cell.Value
Next cell
For Each cell In lst2
    Ctrl.AddItem cell.Value
Next cell

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...