Очистить каскадный ComboBox при повторном выборе

Я занимаюсь созданием пользовательской формы в excel, которая использует несколько ComboBox. Первый ComboBox перечисляет значения из столбца 1 таблицы, а следующие списки ComboBox перечисляют значения из следующих столбцов. ComboBox 2 также содержит только значения, зависящие от предыдущего. Все ComboBox показывают только уникальные значения.

Вот текущий код, который я использую:

Option Explicit Private Sub ComboBox1_Change() Call cValues(ComboBox1.Value, ComboBox2, 2) End Sub Private Sub ComboBox2_Change() Call cValues(ComboBox2.Value, ComboBox3, 3) End Sub Private Sub ComboBox3_Change() Call cValues(ComboBox3.Value, ComboBox4, 4) End Sub Private Sub ComboBox4_Change() Call cValues(ComboBox4.Value, ComboBox5, 5) End Sub Private Sub ComboBox5_Change() Call cValues(ComboBox5.Value, ComboBox6, 6) End Sub Private Sub UserForm_Initialize() Dim Rng As Range Dim Dn As Range Dim Dic As Object With Sheets("Listuni") Set Rng = .Range(.Range("A2"), .Range("A" & Rows.Count).End(xlUp)) End With Set Dic = CreateObject("scripting.dictionary") Dic.CompareMode = vbTextCompare For Each Dn In Rng: Dic(Dn.Value) = Empty: Next Me.ComboBox1.List = Application.Transpose(Dic.keys) End Sub Sub cValues(txt As String, Obj As Object, col As Integer) Dim Dn As Range Dim Rng As Range Dim Dic As Object With Sheets("Listuni") Set Rng = .Range(.Cells(2, col), .Cells(Rows.Count, col).End(xlUp)) End With Set Dic = CreateObject("Scripting.Dictionary") Dic.CompareMode = 1 For Each Dn In Rng If Dn.Offset(, -1).Value = txt Then If Not Dic.exists(Dn.Value) Then Dic(Dn.Value) = Empty End If End If Next Dn Obj.List = Application.Transpose(Dic.keys) End Sub 

Проблема, с которой я столкнулась, возникает, когда пользователь делает повторный выбор предыдущего ComboBox. Вместо очистки последующих блоков все существующие выборы остаются.

Я ищу способ очистить / по умолчанию значения последующего ComboBox каждый раз, когда производится повторный выбор предыдущего ComboBox. Например, если я сделаю выбор в ComboBox 1 и 2, но затем измените свой выбор на ComboBox 1, я хочу, чтобы ComboBox 2 очистился, а не показывал мой предыдущий выбор. Обратите внимание, что позиция по умолчанию для формы пользователя при запуске не показывает значений в любом ComboBox.

Я попытался использовать метод .clear при изменении, но это всегда зависеть от:

 Obj.List = Application.Transpose(Dic.keys) 

Я подозреваю, что это связано с тем, что явное является технически изменением и поэтому не может переносить список значений в другие поля на основе нулевого значения.

Это очищает все последующие ComboBoxes – если Combo1 изменяется, Combo2, 3, 4, 5 и 6 очищаются

 Option Explicit Private ws As Worksheet Private d As Object Private Sub UserForm_Initialize() Dim cel As Range, txt As String, rng As Range Set ws = Worksheets("Listuni") Set d = CreateObject("Scripting.Dictionary"): d.CompareMode = vbTextCompare Set rng = ws.Range(ws.Cells(2, 1), ws.Cells(ws.Rows.Count, 1).End(xlUp)) For Each cel In rng: d(cel.Value) = Empty: Next ComboBox1.List = Application.Transpose(d.keys) End Sub Private Function setList(ByVal txt As String, ByRef cmb As ComboBox) As Object Dim xID As Long, rng As Range, cel As Range, x As Control xID = Right(cmb.Name, 1) For Each x In Me.Controls If TypeName(x) = "ComboBox" Then If Val(Right(x.Name, 1)) > xID - 1 Then x.Clear Next Set rng = ws.Range(ws.Cells(2, xID), ws.Cells(ws.Rows.Count, xID).End(xlUp)) d.RemoveAll For Each cel In rng If cel.Offset(, -1) = txt Then If Not d.exists(cel.Value) Then d(cel.Value) = Empty End If End If Next If d.Count > 0 Then cmb.List = Application.Transpose(d.keys) Else cmb.Clear End Function Private Sub ComboBox1_Change() setList ComboBox1.Value, ComboBox2 End Sub Private Sub ComboBox2_Change() setList ComboBox2.Value, ComboBox3 End Sub Private Sub ComboBox3_Change() setList ComboBox3.Value, ComboBox4 End Sub Private Sub ComboBox4_Change() setList ComboBox4.Value, ComboBox5 End Sub Private Sub ComboBox5_Change() setList ComboBox5.Value, ComboBox6 End Sub 

каскад

  • Отсутствует свойство Excel VBA «AxisBetweenCategories» в ChartSpace
  • Использование операторов IF & AND с флажками в пользовательской форме
  • Показать текущее время (EST)
  • Добавление проверки в пользовательскую форму
  • Рассчитать общее время между датами в часах и минутах
  • VBA- Итерирование по строковым значениям в массиве и идентификация, если они равны определенному тексту
  • Как установить FileDialog, чтобы не разрешать двойной щелчок
  • Экземпляр контекстного меню Excel VBA
  • VBA Excel 2013: назначение значений массива из другой пользовательской формы
  • Кнопка VBA Options, как подключиться к модулю?
  • Несколько пользователей для пользовательской формы Excel VBA
  • Interesting Posts

    Проводка столбца даты в Excel VBA

    Как получить Excel, чтобы найти следующий вторник, когда дата в ячейке – понедельник, пятница, суббота или воскресенье

    Как сделать HTTP-запрос, который будет работать на 32-битных, 64-битных окнах, а также на Mac (VBA Excel)?

    Ошибка при отсутствии значения в диапазоне – VBA

    SumIf определенные значения находятся в диапазоне

    Передача дат процедуре в VBA

    VBA Loop в Excel с помощью Solver

    График Excel – 2 Линейный график / Каждая строка, представляющая собственный набор данных

    Более строгое форматирование с использованием VBA

    C #: попытайтесь сохранить экспортированный файл excel, но сохраните его как веб-страницу (.html)

    Отображение нескольких элементов в графе Excel и несколько вычислений

    Измените стиль одной ячейки (на Bad), когда другая ячейка была недавно отредактирована

    MS Excel. Консолидация и сумма из столбцов с списком проверки данных и зависимым списком.

    Значения VBA Cell в качестве диапазона дат для выбора файла из папки

    Формула дает неверный результат

    Давайте будем гением компьютера.