2013-04-18 60 views
4

我有一個過濾表(在代碼中作爲ListObject)的宏,然後將DataBodyRange中的可見單元複製到一個單獨的表中。代碼工作正常,除非過濾動作刪除所有數據(即表只有標題行,而沒有其他)。Excel VBA - 檢查過濾的表是否返回任何結果

是否有一個簡潔的方式來檢查是否有任何行可見?如果可能的話,我想盡量避免使用on error resume條款,但我正在努力想方設法?

我已經在下面列出了一些僞代碼來說明我的意思,任何援助將不勝感激!

亞當

If TargetTable.DataBodyRange.VisibleRows.Count > 0 Then 
    TargetTable.DataBodyRange.SpecialCells(xlCellTypeVisible).Copy Destination:=OutputPasteRange 
End If 
+1

嘗試訪問'TargetT'時出現1004錯誤able.DataBodyRange.SpecialCells(xlCellTypeVisible)'範圍,對吧? –

回答

4

使用表的Range對象,而不是DataBodyRange。然後,檢查以確保.SpecialCells(xlCellTypeVisible).Rows.Count > 1

Sub TestEmptyTable() 
Dim tbl As ListObject 
Dim outputPasteRange As Range 
Dim tblIsVisible As Boolean 

Set tbl = ActiveSheet.ListObjects(1) 
Set outputPasteRange = Range("B15") 

If tbl.Range.SpecialCells(xlCellTypeVisible).Areas.Count > 1 Then 
    tblIsVisible = True 
Else: 
    tblIsVisible = tbl.Range.SpecialCells(xlCellTypeVisible).Rows.Count > 1 
End If 

If tblIsVisible Then 
    tbl.DataBodyRange.SpecialCells(xlCellTypeVisible).Copy _ 
     Destination:=outputPasteRange 

Else: 
    MsgBox tbl.Name & " has been filtered to no visible records", vbInformation 

End If 

End Sub 
+0

不起作用,我也查過了!把一些過濾,留下幾個記錄,並檢查... –

+0

應該> 1,不> = 1 ...剛剛修改! –

+0

僅返回2個值:1或ListObject總行數。而1是在你幾乎沒有過濾結果的情況下......這也是我的思考方式,但也不工作.... :) –

1

一種替代方法將是比較.SpecialCells(xlCellTypeVisible).Address到標題行地址,tbl.HeaderRowRange.Address

這裏是大衛的代碼的變化:

Sub TestEmptyTable() 
    Dim tbl As ListObject 
    Dim outputPasteRange As Range 
    Dim tblIsVisible As Boolean 

    Set tbl = ActiveSheet.ListObjects(1) 
    Set outputPasteRange = Range("B15") 

    tblIsVisible = tbl.Range.SpecialCells(xlCellTypeVisible).Address <> _ 
     tbl.HeaderRowRange.Address 

    If tblIsVisible Then 
     tbl.DataBodyRange.SpecialCells(xlCellTypeVisible).Copy _ 
      Destination:=outputPasteRange 
    Else 
     MsgBox tbl.Name & " has been filtered to no visible records", vbInformation 
    End If 
End Sub 
1

只是檢查Range.Height不爲0:

If [Table1].Height Then 

此外,當.Height大於0不需要.SpecialCells(xlCellTypeVisible)

If TargetTable.DataBodyRange.Height Then TargetTable.DataBodyRange.Copy OutputPasteRange 
相關問題