Kontrol edilecek çok sayıda sütuna sahip olan aşağıdaki genelleştirilmiş çözüm kod girişini kolaylaştıracak:
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
Açıklama:
Başlangıçta, görülebilir satır kümesi tam satır kümesinden çıkarılır. Bu, çok büyük bir hız artışı sağlar. *
Kod daha sonra bu görünür satır kümesinden geçer. Her satır için, boş olmayan değerleri denetleyen uygun sütunlar arasında dolaşır ve değil ilki bulunur bulunmaz sırasını gizlemek. (Bir satırı gizlemek, yalnızca uygun tüm sütunlar boşsa meydana gelen varsayılan eylemdir.)
# 2 DÜZENLEME:
Aşağıdaki OP yorumuna göre sütunları da gizleyen ikinci sürüm (v2.1):
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
Açıklama:
Görünür sütun kümesinin, gizli satırlar olduğunda (ve tam tersi), ekstraksiyon formülünde küçük bir değişiklik gerektirdiği zaman çıkardığı ortaya çıkıyor.
Bir iç döngü gerekli olmadığından, görünür sütun kümesinde dolaşan kod satırlar için olandan daha basittir. Çalışma sayfası fonksiyonu CountA()
yerine kullanılır.
Tamamen boş olan yasak sütunların hala göründüğünü unutmayın. Bunların gizli satırlarda değerleri vardır. Bu sütunları gizlememek kesinlikle yorumunuza göre kasıtlıdır.
Not: Değişken adlandırma sözleşmemi merak ediyorsanız, RVBA .
* Sayfa düzenlenirken otomatik olarak gizlenen satırları geri alma özelliğini kaybetme pahasına. Gerekirse bu düzeltilebilir.