Хорошо, то, что я здесь сделал, использовал цикл для проверки каждой записи в столбце А и некоторые операторы if/elseif
, чтобы определить, какие значения необходимо обновить.Пока данные всегда соответствуют формату, указанному выше, я считаю, что это должно работать.
Он обновляет соответствующий слот данных по мере продвижения вниз по списку уровней, но при нажатии на число он устанавливает каждый уровень, следующий за ним, как NULL
.Я использовал NULL
, потому что он печатает так же, как "" в Excel, но использует меньше памяти.
Я попытался немного ускорить его, выполнив большую часть сравнения в памяти, собрав все данные за раз и используя массивы.Однако следует отметить, что вы также можете сделать так, чтобы вы выполняли операцию печати только один раз, используя второй вариант массива, который вы изменяете по мере изменения размера, но я решил не делать этого здесь.Если имеется большое количество элементов, стоит учесть, что постоянный доступ к листу серьезно замедлит вашу программу.
Option Explicit
Sub CascadingList()
Dim Levels(1 To 4) As String
Dim Subcount As Long
Dim cell As Variant
Dim Lastrow As Long
Dim Data() As Variant
Lastrow = ActiveSheet.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
Data = ActiveSheet.Range("A1:B" & Lastrow).Value
Subcount = 1
For cell = 1 To UBound(Data, 1)
If Data(cell, 1) = 1 Then
Levels(1) = Data(cell, 2)
Levels(2) = vbNullString
Levels(3) = vbNullString
Levels(4) = vbNullString
ElseIf Data(cell, 1) = 2 Then
Levels(2) = Data(cell, 2)
Levels(3) = vbNullString
Levels(4) = vbNullString
ElseIf Data(cell, 1) = 3 Then
Levels(3) = Data(cell, 2)
Levels(4) = vbNullString
ElseIf Data(cell, 1) = 4 Then
Levels(4) = Data(cell, 2)
End If
ActiveWorkbook.Worksheets(2).Range("A" & Subcount & ":D" & Subcount).Value = Levels
Subcount = Subcount + 1
Next cell
End Sub
Чтобы уточнить, это начнет смотреть на уровни от A1
вниз ивставит значения в A1:D1
второго листа вниз.Пожалуйста, измените диапазоны, чтобы он работал с вашим кодом.