Как обращаться к сгенерированным спискам и динамически добавлять элементы в VBA? - PullRequest
1 голос
/ 03 июля 2019

Мне успешно удалось динамически генерировать списки. Но сейчас я борюсь с адресацией и заполнением этих сгенерированных списков. Кроме того, я не могу понять, как активировать свойство MultiSelect этих списков. Это возможно только с ActiveX?

Я впервые попробовал ActiveX - ListBoxes на пользовательской форме. Теперь я переключился на «нормальные» списки на рабочем листе. «FS» - это название моего рабочего листа, над которым я работаю. Для понимания: я перебираю столбцы на листе FS и создаю один ListBox для каждого столбца. В каждом ListBox будут добавлены записи соответствующего столбца.

For i = 1 To 10
    LastRow = FS.Cells(Rows.Count, i).End(xlUp).Row
        With FS
            Set lb = FS.Shapes.AddFormControl(xlListBox, 100, 10, 100, 100)
            lb.ControlFormat.MultiSelect = 2
            For Each cell In FS.Range(Cells(1, i), Cells(LastRow,i)).Cells
                    lb.ControlFormat.AddItem cell.Value 'This is the problematic line
            Next cell
        End With
Next i

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Я предлагаю вам сделать это так:

Sub test()
''''Declarations'''''''''''''''''''''''''''
Dim lb As ListBox                           '
Dim sht As Worksheet                        '
Dim rng As Range                            '
Dim cell As Range                           '
Dim i As Long                               '
'''''''''''''''''''''''''''''''''''''''''''''
Set sht = ThisWorkbook.Worksheets("Name of your worksheet")
For i = 1 To 10
    With sht
        Set rng = .Range(.Cells(1, i), .Cells(.Rows.Count, i).End(xlUp))
        Set lb = sht.ListBoxes.Add(100 * i, 10, 100, 100) 'just an indicative way to create the List boxes without them overlapping
    End With
    lb.Name = "ListBox" & i
    lb.MultiSelect = 2
    For Each cell In rng
        lb.AddItem cell.Value
    Next cell
Next i
End Sub

ОБНОВЛЕНИЕ (для покрытия сделанного комментария)

Я обновил код выше, чтобы присвоить имена спискамкак «ListBox1», «ListBox2» и т. д. вместо «List Box 1» и т. д.

Чтобы обратиться к одному из списков, вам нужно использовать ссылку на коллекцию ListBoxes.Эта коллекция принадлежит листу, на котором расположены списки.Например, чтобы обратиться к «ListBoxi», где i = 1,2 ... n, вам нужно сделать это так:

sht.ListBoxes("ListBox" & i)

К сожалению, нет .SelectedItems.Count или подобного метода, который язнать, что вы можете использовать со списком управления формой.

Имея это в виду, вы можете найти количество выбранных элементов "ListBox1", например, так:

Dim selectedItems As Long
selectedItems = 0
Set lb = sht.ListBoxes("ListBox" & 1)
For i = 1 To lb.ListCount Step 1
    If lb.Selected(i) Then
        selectedItems = selectedItems + 1
    End If
Next i
If selectedItems = 0 Then
    MsgBox "No user selected"
End If

Несколько вещей, о которых следует помнить:

  1. Индекс первого элемента варьируется от 0 до 1 в зависимости от того, находится ли список в пользовательской форме или нет
  2. Чтобы ссылаться на список со своим именем, например Listbox1.DoSomething, он должен быть элементом управления ActiveX, а не элементом формы.
0 голосов
/ 03 июля 2019

Вместо этого используйте .ControlFormat.ListFillRange и установите MultiSelect на 3. Что-то вроде этого должно работать для вас:

Sub tgr()

    Dim FS As Worksheet
    Dim lb As Shape
    Dim i As Long

    Set FS = ActiveWorkbook.Worksheets("FS")
    For i = FS.Columns("A").Column To FS.Cells(1, FS.Columns.Count).End(xlToLeft).Column
        Set lb = FS.Shapes.AddFormControl(xlListBox, (i - 1) * 100 + 10, 10, 100, 100)
        With lb
            .ControlFormat.MultiSelect = 3
            .ControlFormat.ListFillRange = FS.Range(FS.Cells(1, i), FS.Cells(FS.Rows.Count, i).End(xlUp)).Address(External:=True)
        End With
    Next i

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