Cómo ocultar filas de Excel según el criterio: todas las celdas de varias columnas no consecutivas de esa fila están en blanco

Cómo ocultar filas de Excel según el criterio: todas las celdas de varias columnas no consecutivas de esa fila están en blanco

En Excel, ¿cómo puedo ocultar filas si y sólo si todas las celdas de varias columnas no consecutivas de la fila están en blanco? Mi hoja de trabajo tiene alrededor de 300 columnas, por lo que no puedo hacer clic individualmente en una de las otras cada vez que quiero hacer esto.

Ya probé el código VBA a continuación, pero no permitirá más de dos rangos. Gracias.

Private Sub Worksheet_Change(ByVal Target As Range)
'Updateby Extendoffice 20160913
Dim xRg As Range
Application.ScreenUpdating = False
    For Each xRg In Range("B1:B825","D1:D825","F1:F825")
        If xRg.Value = "" Then
            xRg.EntireRow.Hidden = True

        Else
            xRg.EntireRow.Hidden = False
        End If
    Next xRg
Application.ScreenUpdating = True
End Sub

Respuesta1

Prueba esto


Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Long

    Application.ScreenUpdating = False
    With UsedRange
        For c = 2 To .Columns.Count Step 2
            .AutoFilter Field:=c, Criteria1:="<>"
        Next
    End With
    Application.ScreenUpdating = True
End Sub

Respuesta2

Al tener muchas columnas para verificar, la siguiente solución generalizada simplificará la entrada de código:

Private Sub Worksheet_Change(ByVal Target As Range)

  Const strcRowExtent As String = "1:825"
  Const strcColExtent As String = "B:BDB"

  Dim boolHideRow As Boolean
  Dim lngFirstColNumber As Long
  Dim rngRow As Range
  Dim rngVisibleRowExtent As Range
  Dim rngColumn As Range
  Dim rngColExtent As Range

  Set rngVisibleRowExtent = Range(strcRowExtent).SpecialCells(xlCellTypeVisible)
  Set rngColExtent = Range(strcColExtent)
  lngFirstColNumber = rngColExtent.Column
  Application.ScreenUpdating = False
    For Each rngRow In rngVisibleRowExtent.Rows
      boolHideRow = True
      For Each rngColumn In rngColExtent.Columns
        If (rngColumn.Column - lngFirstColNumber) Mod 2 = 1 Then
          'Skip every second column
        ElseIf rngColumn.Cells(rngRow.Row).Value2 <> "" Then
          boolHideRow = False
          Exit For
        End If
      Next rngColumn
      If boolHideRow Then Rows(rngRow.Row).EntireRow.Hidden = boolHideRow
    Next rngRow
  Application.ScreenUpdating = True

End Sub

Explicación:

Inicialmente, el conjunto de filas visibles se extrae del conjunto completo de filas. Esto permite una gran mejora en la velocidad.*

Luego, el código recorre este conjunto de filas visibles. Para cada fila, recorre las columnas apropiadas comprobando si hay valores que no estén en blanco ynoocultando la fila tan pronto como se encuentre la primera. (Ocultar una fila es la acción predeterminada que ocurre solo si todas las columnas apropiadas están en blanco).


EDITAR #2:

Segunda versión (v2.1) que también oculta columnas, según el comentario de OP a continuación:

Private Sub Worksheet_Change(ByVal Target As Range)
  ' v2.1
  Const lngcSkipRows As Long = 4
  Const strcRowExtent As String = "1:825"
  Const strcColExtent As String = "B:BDB"

  Dim boolHideRow As Boolean
  Dim lngFirstColNumber As Long
  Dim rngRow As Range
  Dim rngVisibleRowExtent As Range
  Dim rngColumn As Range
  Dim rngColExtent As Range
  Dim rngCol As Range
  Dim rngVisibleColExtent As Range
  Dim rngCroppedCol As Range

  Application.ScreenUpdating = False
    ' Hide rows
    Set rngVisibleRowExtent _
      = Range(strcRowExtent).Columns(1).SpecialCells(xlCellTypeVisible).EntireRow
    Set rngColExtent = Range(strcColExtent)
    lngFirstColNumber = rngColExtent.Column
    For Each rngRow In rngVisibleRowExtent.Rows
      boolHideRow = True
      For Each rngColumn In rngColExtent.Columns
        If (rngColumn.Column - lngFirstColNumber) Mod 2 = 1 Then
          'Skip every second column
        ElseIf rngColumn.Cells(rngRow.Row).Value2 <> "" Then
          boolHideRow = False
          Exit For
        End If
      Next rngColumn
      If boolHideRow Then Rows(rngRow.Row).EntireRow.Hidden = boolHideRow
    Next rngRow
    'Hide Columns
    Set rngVisibleColExtent _
      = Range(strcColExtent).Rows(1).SpecialCells(xlCellTypeVisible).EntireColumn
    For Each rngCol In rngVisibleColExtent.Columns
      Set rngCroppedCol _
        = rngCol _
          .Resize(Range(strcRowExtent).Rows.Count - lngcSkipRows) _
          .Offset(lngcSkipRows)
      If WorksheetFunction.CountA(rngCroppedCol) = 0 Then rngCol.Hidden = True
    Next rngCol
  Application.ScreenUpdating = True

End Sub

Explicación:

Resulta que extraer el conjunto de columnas visibles cuando hay filas ocultas (y viceversa) requiere una ligera modificación en la fórmula de extracción.

El código que recorre el conjunto de columnas visibles es más simple que el de las filas, ya que no se requiere un bucle interno. CountA()En su lugar, se utiliza la función de hoja de trabajo .

Tenga en cuenta que todavía puede parecer que hay columnas visibles y todas en blanco. Estos tienen valores en filas ocultas. No ocultar estas columnas es intencional, estrictamente de acuerdo con su comentario.


Nota: Si tiene curiosidad acerca de mi convención de nomenclatura de variables, se basa enRVBA.

* A costa de perder la capacidad de deshacer filas ocultas automáticamente a medida que se edita la hoja. Esto se puede remediar si es necesario.

información relacionada