2015-09-10 44 views
1

如果第一列爲空,我需要能夠隱藏表格中的行。我需要宏來處理不同表中的表,所以我首先使用listobjects搜索表名,我沒有問題獲取表名。我已經看到了如何用一般的單元格來實現這個功能,但不是在表格中。任何幫助表示讚賞。使用VBA在Excel表格中有條件地隱藏行

我有一個類似的宏來取消隱藏表中的行,它工作正常,因爲它簡單地遍歷ListObject變量'MyTable'中的所有行,並且沒有IF語句。

HideBlankTableRows() 

    Application.ScreenUpdating = False 

    Dim ws As Worksheet 
    Dim myTable As ListObject 
    Dim row As Range 

    Set ws = ActiveSheet 
    Set myTable = ws.ListObjects(1) 

    For Each row In myTable.DataBodyRange 
     If row.Columns(1, 1).Value = "" Then  ' Error is caused by this row 
      row.Hidden = True 
     End If 
    Next 

    End Sub 

回答

2

Each row In myTable.DataBodyRange實際上會遍歷表的身體,每個單元格,你可能不希望。由於您只檢查每行的第一列,因此使用Each row In myTable.DataBodyRange.Rows循環遍歷表中的每一行會更快。

此外,Range對象不具有Columns屬性,因此你必須可以使用Cells屬性並提供要引用(第1行的單元格的行數和列數,列1)。

更新的代碼將如下所示:

For Each row In myTable.DataBodyRange.Rows 
    If row.Cells(1, 1).Value = "" Then 
     row.Hidden = True 
    End If 
Next 
+1

不小e,'Range' _does_有一個'Columns'屬性。 'row.Columns(1).Value'也可以在這裏工作。 –

+0

right,'Columns(1)'and not'Columns(1,1)'。更新只是爲了顯示'Cells'作爲另一個選項 – Jaycal

+0

這個工作完美無瑕,我真的很喜歡Chris的使用row.Columns(1).value的方法,它看起來非常簡單並且非常有意義,只有在看到正確的方法後才能做到它。非常感謝。 –

0

除了由JayCal提供的修補程序,您可以利用ListObject屬性按名稱引用列:

For Each rw In myTable.ListColumns("ColumnName").DataBodyRange 
    If rw.Value = vbNullString Then 
     rw.EntireRow.Hidden = True 
    End If 
Next 

你可以還使用了ListObjectAutoFilter方法

myTable.Range.AutoFilter Field:=lo.ListColumns("ColumnName").Index, Criteria1:="<>"