Скрыть столбец - PullRequest
       4

Скрыть столбец

2 голосов
/ 25 апреля 2020

Нужно какое-то направление, у меня есть данные в иерархическом порядке в Excel. * или 0 - это, в основном, некоторые данные, а x - это пустая ячейка, но она обозначает дочерние данные. Я хотел бы назначить одну кнопку, спрятать все данные 1-й и отображать по одному от root для ребенка.

Аналогия: при условии, что вам нужно взглянуть на диск. поэтому сначала мы зайдем в папку root и перечислим элементы. Теперь из этого списка мы посетим 1-й пункт и перечислим 2-й уровень ТОЛЬКО из подпунктов. как только будет создан новый список, мы вернемся назад и посетим 2-й элемент root и перечислим их подпункты (только 2-й уровень). мы можем продолжить до последней папки root. как только это будет сделано, мы сделаем то же самое для 3-го ... 4-го ... 5-го ... уровня.

Input:
    *           
    x   *       
    x   *       
    x   x   *   
    x   x   x   *
    x   *       
    x   *       
    0           
    x   0       
    x   0       
    x   x   0   

Output step0:
Hide all the row + column

Output step0.5:
* (root/1st column - 1st element excluding x Basically Column A)

Output step1:
* (root/1st column - 1st element excluding x)
0 (root/1st column - 2nd element excluding x)

Output step n:
* (root/1st column - 1st element excluding x)
0 (root/1st column - 2nd element excluding x)
:
:
:
:
:
y (root/1st column - n-1 element excluding x)
z (root/1st column - n element excluding x)

Output step1:
*
0

Output step2:
*   
x   *
0   

Output step3:
*   
x   *
x   *
0   

Шаг вывода 4: *
x * x * x * 0

и т. Д. Согласно изображению:

enter image description here

Output step7:
data will keep expending till the same as Input data.

Output Step8:
Data will keep shrinking in reverse order. like step 5 -> 4 -> 3 -> 2 -1.

Экспериментальный код:

Sub Hide_Next()

Dim a As Range
Dim b As Range
'Need help with dynamic range. 

    For Each a In Range("A1:A23").Cells
        For Each b In Range("B1:B23").Cells
        If a.Value <> Empty And b.Vaule = Empty Then
                a.EntireRow.Hidden = True
        End If
        Next b
    Next a

End Sub

Любой вклад будет высоко ценится.

1 Ответ

1 голос
/ 28 апреля 2020

Ниже приведен пример кода, куда я помещаю также комментарии, чтобы понять.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...