Создание зависимого комбинированного списка в Excel VBA - PullRequest
0 голосов
/ 21 марта 2020

У меня есть два столбца A и B

A содержит список лиц B, в столбце A есть список любимых мест назначения человека *

Person     Destination  
Mike       Switzerland  
Mike       Paris  
Samson     Melbourne  
Samson     Mumbai  
Samson     Amsterdam  
Taylor     London  
Taylor     NYC  
Taylor     DC  
Zenith     HK  

В пользовательской форме я хочу два поля со списком - 1 для человека и 2 для избранных.

В поле со списком 1 Я хочу уникальный список людей в столбце Персона
- у меня есть это, но я не могу получить уникальное значение

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Me.person_Combo.List = ws.Range("A2", Range("A" & Rows.Count).End(xlUp)).Value

В зависимости от выбора пользователя в поле со списком 2 должны отображаться все соответствующие пункты назначения для имени этого человека в таблице выше.

1 Ответ

0 голосов
/ 21 марта 2020

Поместите следующий код в модуль userform и добавьте Microsoft Scripting Runtime к своим ссылкам.

Option Explicit
' Add Microsoft Scripting Runtime via Tools References

Const DELIM = ","
Dim dict As Scripting.Dictionary

Private Sub ComboPerson_Change()

    Dim vDat As Variant
    vDat = dict(ComboPerson.Value)

    ComboDestination.Value = ""
    vDat = Split(vDat, DELIM)
    ComboDestination.List = vDat

End Sub

Private Sub UserForm_Initialize()
    Dim ws As Worksheet

    ' Change to your sheet
    ' Set ws = Sheet3
    Set ws = ThisWorkbook.Sheets("Sheet1")

    Set dict = New Dictionary

    Dim vDat As Variant
    With ws
        vDat = .Range("A2", .Range("B" & .Rows.Count).End(xlUp)).Value2
    End With

    ' This will build the list of unique names and add
    ' a comma separated string of their favourite destination
    ' ATTENTION: comma in the destination is therefore a bad idea or replace
    ' the Const DELIM with a unique delimiter

    Dim i As Long
    For i = LBound(vDat, 1) To UBound(vDat, 1)
        If dict.Exists(vDat(i, 1)) Then
            dict(vDat(i, 1)) = dict(vDat(i, 1)) & DELIM & vDat(i, 2)
        Else
            dict.Add vDat(i, 1), vDat(i, 2)
        End If
    Next i

    ComboPerson.List = dict.Keys
End Sub

Я назвал поле со списком для имени человека comboPerson и имя для поля со списком его любимых назначение comboDestination

Дальнейшее чтение для топи c Словарь

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