Ниже приведен пример кода, куда я помещаю также комментарии, чтобы понять.
DoAStep
- это макрос, который необходимо связать с кнопкой. exp_rng
- это диапазон, который содержит вашу «структуру» для расширения. Вы можете написать код, который позволит VBA понять, какой диапазон использует информацию, которую вы знаете о структуре.
Когда у вас есть все скрытые строки, вы знаете, что должны расширяться, когда у вас есть все видимые строки. Знайте, что вы должны вернуться, чтобы скрыть их, а когда вы находитесь на средних шагах, вы знаете, что вам нужно делать, только помня, что вы делаете на предыдущих шагах. Затем я использую переменную is_expanding
в области видимости модуля: ее значение сохраняется между вызовами DoAStepp. Но при открытии файла Excel is_expanding
имеет False
по умолчанию. Если вы хотите сохранить направление расширения / уменьшения, вы должны сохранить его внутри значения ячейки.
Dim exp_rng As Range
Dim is_expanding As Boolean
Sub DoAStep()
'You can set Range one time for all if you want and you can also 'calculate' it without writing 'A1:D11' in the code
Set exp_rng = Range("A1:D11")
'Direction engine: when expanding calls expand-step.
'If the expand step doesn't find anything to expand then reverse the direction
'Same for reduction
If is_expanding Then
If Not ExpandOneStep Then
is_expanding = False
ReduceOneStep
End If
Else
If Not ReduceOneStep Then
is_expanding = True
ExpandOneStep
End If
End If
End Sub
Function ExpandOneStep() As Boolean
Dim i_row As Long, i_col As Long
'Loop through cells, from top to bottom, from left to right
'exp_rng(i_row, i_col) is the cell I'm looking
For i_col = 1 To exp_rng.Columns.Count
For i_row = 1 To exp_rng.Rows.Count
'When we are expanding we search for hidden cell ( = cells in an hidden row) to unhide
If exp_rng(i_row, i_col).EntireRow.Hidden = True Then
'Check if the cell has a value (I'm checking if it's not empty and not "x", you can change with whatever you want
If Not IsEmpty(exp_rng(i_row, i_col).Value) And exp_rng(i_row, i_col).Value <> "x" Then
'Unhide the row and exit the function so that we will not unhide other rows (leaving them for next steps)
exp_rng(i_row, i_col).EntireRow.Hidden = False
'Exit the function returning TRUE in order to say "I found something to unhide".
'When we don't find anything to unhide then we have to change expanding with reducing
ExpandOneStep = True
Exit Function
End If
End If
Next i_row
Next i_col
'If the for loop ends then we have not found any row to unhide so we
'have to switch to 'reducing time' instead of expanding
ExpandOneStep = False
End Function
Function ReduceOneStep() As Boolean
Dim i_row As Long, i_col As Long
'ReduceOneStep is like ExpandOneStep but:
' - Loop from right to left, from bottom to top (reverse loop)
' - Check for unhidden rows to hide
For i_row = exp_rng.Rows.Count To 1 Step -1
For i_col = exp_rng.Columns.Count To 1 Step -1
If exp_rng(i_row, i_col).EntireRow.Hidden = False Then
If Not IsEmpty(exp_rng(i_row, i_col).Value) And exp_rng(i_row, i_col).Value <> "x" Then
exp_rng(i_row, i_col).EntireRow.Hidden = True
ReduceOneStep = True
Exit Function
End If
End If
Next i_col
Next i_row
ReduceOneStep = False
End Function