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.