Как скрыть строку, если все видимые ячейки в диапазоне ячеек пустые в VBA для Excel? - PullRequest
1 голос
/ 01 мая 2019

Я использую некоторые макросы VBA в своей электронной таблице Excel, чтобы помочь мне исключить ненужные данные из представления, а затем разрешить мне экспортировать / скопировать подмножество всего набора данных, который у меня есть. Размер моей электронной таблицы - это Столбцы (A: BN) и Строки (1: 4693), которые, я думаю, представляют собой набор данных приличного размера. Столбцы (A: G) всегда будут видны. Я заинтересован только в сокрытии того, что находится в столбцах (H: BN).

Сначала, если я хочу сохранить столбец в поле зрения, я устанавливаю значение столбца «Y», затем нажимаю кнопку «Скрыть столбцы». Я делаю это, прикрепляя эту подпрограмму к кнопке:

Sub Hidecolumn()
Dim p As Range
    For Each p In Range("H1:BN1").Cells
        If p.Value = "N" Then
            p.EntireColumn.Hidden = True          
        End If
    Next p  
End Sub

Это прекрасно работает.

У меня также есть кнопка «Показать все столбцы», чтобы снова отобразить все скрытые столбцы, и я делаю это с помощью:

Sub Unhidecolumn()
Dim p As Range
    For Each p In Range("H1:BN1").Cells
        If p.Value = "Y" Or p.Value = "N" Then
            p.EntireColumn.Hidden = False    
        End If
    Next p   
End Sub

Теперь, когда у меня есть нужные столбцы, теперь мне нужно скрыть все ненужные строки. Каждая ячейка будет иметь «Y», если существует такая связь строки-столбца. Будет пустым, если нет отношений. Я хочу скрыть все строки, в которых все видимые ячейки в диапазоне ячеек пусты. ВСЕ КЛЕТКИ в диапазоне ячеек должны быть пустыми.

После того, как я спрятал все ненужные строки, я могу скопировать оставшиеся / видимые данные и скопировать их в новую рабочую книгу, чтобы поделиться с другими, потому что им нужны только данные, относящиеся к ним.

Наконец, точно так же, как я могу показать все скрытые столбцы, мне нужно также иметь возможность показать все скрытые строки.

В конце я хочу 4 кнопки на моем листе.
1. Скрыть столбцы 2. Показать столбцы 3. Скрыть строки 4. Показать строки

У меня уже есть первые 2, теперь мне нужны последние 2. Пожалуйста, помогите.

ОБНОВЛЕНИЕ: РЕШЕНИЕ - Спасибо, @K.Davis!

Sub HideRowsSecond()

    Dim srcRng As Range, ws As Worksheet
    Set ws = ActiveSheet
    Set srcRng = ws.Rows("5:" & ws.Cells(ws.Rows.Count, 4).End(xlUp).Row)

    Dim R As Range, hideRng As Range
    For Each R In srcRng
        If Application.CountA(R.Columns("H:BN").SpecialCells(xlCellTypeVisible)) = 0 Then
            If hideRng Is Nothing Then
                Set hideRng = R.EntireRow
            Else
                Set hideRng = Application.Union(hideRng, R.EntireRow)
            End If
        End If
    Next R

    If Not hideRng Is Nothing Then hideRng.EntireRow.Hidden = True
    MsgBox ("Complete")
End Sub

1 Ответ

2 голосов
/ 01 мая 2019

Вы можете использовать встроенную функцию листа CountA(), чтобы подсчитать количество ячеек, в которых есть данные.Этот счет вернет значение 0, если вся строка будет пустой.

Я бы использовал UsedRange, чтобы вы не проводили ненужный подсчет данных.Я также хотел бы объединить диапазоны, чтобы скрыть их и скрыть все сразу, а не по одному для лучшей производительности.

Sub HideRows()

    Dim r As Range, hideRng As Range

    For Each r In ActiveSheet.UsedRange.Rows
        If Application.CountA(r.EntireRow) = 0 Then
            If hideRng Is Nothing Then
                Set hideRng = r.EntireRow
            Else
                Set hideRng = Application.Union(hideRng, r.EntireRow)
            End If
        End If
    Next r

    If not hideRng is nothing then hideRng.EntireRow.Hidden = True

End Sub

Вам не нужно слишком усложнять отображение строк.Это будет показывать ваши строки без зацикливания.

Sub UnHideRows()

    ActiveSheet.Cells.EntireRow.Hidden = False

End Sub

Благодаря Крису Нейлсену, который указал, что вы, возможно, хотели только проверить, есть ли данные в видимых столбцах, вы можете использовать это вместопервый код:

Sub HideRows()

    Dim r As Range, hideRng As Range

    UnHideRows

    For Each r In ActiveSheet.UsedRange.Rows
        If Application.CountA(r.EntireRow.SpecialCells(xlCellTypeVisible)) = 0 Then
            If hideRng Is Nothing Then
                Set hideRng = r.EntireRow
            Else
                Set hideRng = Application.Union(hideRng, r.EntireRow)
            End If
        End If
    Next r

    If Not hideRng Is Nothing Then hideRng.EntireRow.Hidden = True

End Sub



В ответе OP на желание только просматривать видимые строки между столбцами H:BN, вы можете использовать следующее для выполнения этого:

Sub HideRows()

    Dim srcRng As Range, ws As Worksheet
    Set ws = ActiveSheet
    Set srcRng = ws.Rows("1:" & ws.Cells(ws.Rows.Count, 1).End(xlUp).Row)

    UnHideRows

    Dim r As Range, hideRng As Range
    For Each r In srcRng
        If Application.CountA(r.Columns("H:BN").SpecialCells(xlCellTypeVisible)) = 0 Then
            If hideRng Is Nothing Then
                Set hideRng = r.EntireRow
            Else
                Set hideRng = Application.Union(hideRng, r.EntireRow)
            End If
        End If
    Next r

    If Not hideRng Is Nothing Then hideRng.EntireRow.Hidden = True

End Sub

В этой функции я продолжил и создал новую переменную Range srcRng, потому что использование функции Columns() с UsedRange может иногда вызывать проблемы.Поскольку мы больше не используем UsedRange, теперь мы находим последнюю строку использования с ws.Cells(ws.Rows.Count, 1).End(xlUp).Row.

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