Как я могу заполнить выпадающий список в ячейке на основе значений таблицы? - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь создать динамический выпадающий список c в ячейке, используя VBA. В настоящее время у меня есть выпадающий список на основе значений, которые я ввел. Однако, поскольку я предвидел рост использования этой программы, я хотел бы сделать раскрывающийся список динамическим c. Есть ли способ провести VBA l oop через таблицу и заполнить раскрывающийся список на основе значений в столбце 1 (например)?

Ниже приведен код, который у меня есть в настоящее время; как вы можете видеть, значения формулы stati c основаны на значениях, которые я жестко запрограммировал:

Sub Dropdown_Setup()
'Setup appropriate template dropdowns on 'template' sheet

    Set wB = ThisWorkbook
    Set tempSht = ThisWorkbook.Sheets("Template")

'Populate 'machine' dropdown
    With tempSht.Range("$B$15").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Formula1:="H1 - EOS M280, H2 - SLM, H4 - CL M2, H5 - EOS M400, H6 - SLM 2.0"
        .IgnoreBlank = True
        .InCellDropdown = True
    End With

End Sub

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете l oop через каждую ячейку в первом столбце вашего объекта-списка и создать строку, разделенную запятыми, которую можно назначить для проверки Formula1.

Я предположил, что Sheet2 содержит ваш список объектов, и этот список называется Table1. Измените эти имена соответственно.

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

Sub Dropdown_Setup()
'Setup appropriate template dropdowns on 'template' sheet

'Set the source table
    Dim sourceTable As ListObject
    Set sourceTable = ThisWorkbook.Sheets("Sheet2").ListObjects("Table1")

'Get the items from the first column of the source table
    Dim itemsList As String
    Dim currentCell As Range
    itemsList = ""
    For Each currentCell In sourceTable.ListColumns(1).DataBodyRange
        If Len(currentCell.Value) > 0 Then
            itemsList = itemsList & "," & currentCell.Value
        End If
    Next currentCell
    itemsList = Mid(itemsList, 2)

'Set the template sheet
    Dim tempSht As Worksheet
    Set tempSht = ThisWorkbook.Sheets("Template")

'Populate 'machine' dropdown
    With tempSht.Range("$B$15").Validation
        .Delete
        .Add _
            Type:=xlValidateList, _
            AlertStyle:=xlValidAlertStop, _
            Formula1:=itemsList
        .IgnoreBlank = True
        .InCellDropdown = True
    End With

End Sub
...