Я рекомендую использовать 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