Excel satırlarını kriterlere göre gizlemek nasıl yapılır? Bu satırdaki ardışık olmayan birden fazla sütundaki tüm hücreler boştur


2

Excel'de, satırdaki birden fazla, ardışık olmayan sütunlardaki tüm hücreler boşsa ve yalnızca satırları nasıl gizleyebilirim? Çalışma sayfamda yaklaşık 300 sütun var, bu yüzden bunu yapmak istediğimde tek tek tıklayamıyorum.

Aşağıdaki VBA kodunu zaten denedim, ancak ikiden fazla aralığa izin vermeyecek. Teşekkür ederim.

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

Yanıtlar:


0

Bunu dene


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


0

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.


Bu fantastik. Teşekkür ederim! Bir ek daha yardımcı olacaktır: Bölünmüş ("B, D, F", ",") diğer tüm sütunları bir dizi sütunda otomatik olarak listeleyebilmemin bir yolu var mı? Benim durumumda, bu ("B, D, F,.. BDB") olur, böylece neden hepsini ayrı ayrı yazmamayı umduğumu anlayabilirsiniz.
Claire

@Claire Kolayca izin vermek için güncellenmiş bir cevap çok dönüşümlü sütunların Bunu başlangıçta göndermeliydim, ama gönderinizi yeterince dikkatli okumamıştım.
robinCTS

Daha da fantastik. Teşekkür ederim! Şimdi, bu çözümü uyguladıktan sonra, aynı zamanda (aynı anda) aralık içinde tamamen boş olan tüm sütunları gizlemem gerektiğinin farkındayım. diğer bir deyişle, tüm hücrelerin satır 5'ten satır 825'e kadar boş olduğu sütunlar. Bunu sahip olduğunuza eklemenin bir yolu var mı?
Claire

@Claire Cevabı, sütunları ve satırları gizleyen kodun v2.1'i ile değiştirdim.
robinCTS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.