Excel VBA для заполнения родительского дочернего выпадающего источника с листа - PullRequest
0 голосов
/ 24 октября 2018

У меня есть лист с данными, как показано ниже, и 2 поля со списком в пользовательской форме с именами ComboBox1 (родительский) и ComboBox2 (дочерний)

Parent |Child
-------|------
  A    |   1
  A    |   2
  A    |   3
  X    |   100
  X    |   101
  X    |   102

С кодом ниже я принял различные значения в родительский комбо.

Dim s As String, r As Integer, nr As Integer, wr, v
Set wr = Sheet1.Range("A1:A10")
nr = wr.Rows.Count
With ComboBox1
 .Clear
 For r = 1 To nr
  v = wr(r, 1)
  If InStr(s, v & ",") = 0 Then
   s = s & v & ","
   .AddItem (v)
  End If
 Next
End With

Я ищу помощь в заполнении дочерней комбинации на основе выбранного значения в родительской комбинации!

1 Ответ

0 голосов
/ 24 октября 2018

Я рекомендую использовать Dictionary, чтобы запомнить, какие записи в ComboBox1 уже существуют, потому что вы можете легко протестировать с помощью dict.Exists(NewItem).

И данные для ComboBox2 должны автоматически повторно инициализироваться на ComboBox1_Change event.

Обратите внимание, что вы должны использовать более описательные имена переменных s, r, nr, wr, v довольно бессмысленны, в то время как такие имена, как ComboRange1 или NewItem, довольно хорошо читаются людьми.Облегчает вашу жизнь и дает меньше ошибок.

Option Explicit

Sub InitComboBox1()
    Dim ComboRange1 As Range
    Set ComboRange1 = Sheet1.Range("A1", Sheet1.Cells(Rows.Count, "A").End(xlUp))

    ComboBox1.Clear

    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim i As Long
    For i = 1 To ComboRange1.Rows.Count
        Dim NewItem As String
        NewItem = ComboRange1.Cells(i, 1).Text

        If Not dict.Exists(NewItem) Then
            dict.Add NewItem, 0
            ComboBox1.AddItem NewItem
        End If
    Next i
End Sub

Private Sub ComboBox1_Change()
    Dim ComboRange2 As Range
    Set ComboRange2 = Sheet1.Range("A1", Sheet1.Cells(Rows.Count, "A").End(xlUp)).Resize(ColumnSize:=2)

    ComboBox2.Clear

    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim i As Long
    For i = 1 To ComboRange2.Rows.Count
        If ComboRange2.Cells(i, 1).Text = ComboBox1.Value Then
            Dim NewItem As String
            NewItem = ComboRange2.Cells(i, 2).Text

            If Not dict.Exists(NewItem) Then
                dict.Add NewItem, 0
                ComboBox2.AddItem NewItem
            End If
        End If
    Next i
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...