6

我有一个宏过滤表(在代码中作为 ListObject),然后将 DataBodyRange 中的可见单元格复制到单独的表中。除非过滤操作删除所有数据(即表只有标题行,没有其他内容),否则代码工作正常。

有没有一种简洁的方法来检查是否有任何行可见?如果可能的话,我想避免on error resume条款,但我正在努力想其他方法吗?

我在下面包含了一些伪代码来说明我的意思,任何帮助将不胜感激!

亚当

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

3 回答 3

6

使用 Table 的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
于 2013-04-18T16:24:59.843 回答
4

只需检查是否Range.Height不是0:

If [Table1].Height Then

此外,当大于 0.SpecialCells(xlCellTypeVisible)时不需要:.Height

If TargetTable.DataBodyRange.Height Then TargetTable.DataBodyRange.Copy OutputPasteRange
于 2018-01-19T14:05:23.097 回答
2

另一种方法是.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
于 2016-07-26T00:54:00.737 回答