表和结果 - 如何编写 If 语句 [duplicate]

Tables and results - How to write a If statement [duplicate]

提问人:Javier Puig Rovira 提问时间:7/25/2023 最后编辑:BigBenJavier Puig Rovira 更新时间:7/26/2023 访问量:66

问:

我需要过滤一个表(as 和 object)并复制特定范围内的结果。有时我从表中获取数据,有时不获取数据。当我获得数据时没关系,我在特定范围内复制粘贴可见数据,但是当我没有获得数据时,它会粘贴整个列,这是错误的。 我想要,当表中没有可见的数据时,转到下一步。

我试过了这个:

Dim Table as ListObject
Set Table = Thisworkbook.ListObjects("Table")


Table.AutoFilter.ShowAllData
Table.Range.AutoFilter Field:=20, Criteria1:="Lunes", Operator:=xlAnd
Table.Range.AutoFilter Field:=16, Criteria1:=Range("Tema1Lun").Value, Operator:=xlAnd
Table.Range.AutoFilter Field:=17, Criteria1:="=*TV*", Operator:=xlAnd
        If Table.DataBodyRange = 0 Then
                GoTo Filter2
        ElseIf Range("Table[Column1]").SpecialCells(xlCellTypeVisible).Count > 1 Then
            With Range("Table[Column2]:Table[Column3]").Copy
            End With
                Range("SpecificRange").PasteSpecial Paste:=xlPasteValues
                Application.CutCopyMode = False
       End If
                
        
Filter2:
Table.AutoFilter.ShowAllData
Table.Range.AutoFilter Field:=20, Criteria1:="Lunes", Operator:=xlAnd
Table.Range.AutoFilter Field:=16, Criteria1:=Range("Tema1Lun").Value, Operator:=xlAnd
Table.Range.AutoFilter Field:=17, Criteria1:="0", Operator:=xlAnd
Excel VBA IF-语句 错误处理

评论

0赞 Tim Williams 7/26/2023
If Table.DataBodyRange = 0 Then这个测试到底是为了什么?
0赞 Chris Maurer 7/26/2023
DataBodyRange 是一个 range 对象,可以将其视为指向工作表中一组矩形单元格的指针。DataBodyRange 本身不会为零,其中的行将计为零。请改用 Table.DataBodyRange.Rows.Count。不确定这是否有效,或者 Table.DataBodyRange Is Null 是否是所需的测试。
0赞 taller 7/26/2023
筛选表不会影响 返回的行计数。要检查后筛选中是否有可见数据,您可以改用。Table.DataBodyRange.Rows.CountDataBodyRangeListColumns(1).Range.SpecialCells(xlCellTypeVisible).Count

答:

0赞 taller 7/26/2023 #1

您的代码逻辑已接近工作状态。但是,用作检查表中没有可见数据的条件将无法按预期工作。If Table.DataBodyRange = 0

DataBodyRange 属性返回一个 Range 对象,该对象表示 Table 中的值范围。(注意:它与任何过滤无关。

https://learn.microsoft.com/zh-cn/office/vba/api/excel.listobject.databodyrange?WT.mc_id=M365-MVP-33461

    Dim Table as ListObject
    Set Table = Thisworkbook.ListObjects("Table")

    If Table.ListColumns(1).Range.SpecialCells(xlCellTypeVisible).Count > 1 Then
        GoTo Filter2
    Else
        Application.CutCopyMode = False
        Range("Table[Column2]:Table[Column3]").Copy
        Range("SpecificRange").PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
    End If

评论

0赞 BigBen 7/26/2023
我想你是在这里找的,不是ListObject.DataBodyRangePivotTable
0赞 taller 7/26/2023
@BigBen 谢谢。你是对的。当我在文本编辑器中输入时,这是一个自动完成的错别字。
1赞 CDP1802 7/26/2023 #2

用于检查是否有任何可见行。On Error Resume Next

    Dim rng As Range
    With ThisWorkbook.Sheets(1).ListObjects("Table")
        .AutoFilter.ShowAllData
        .Range.AutoFilter Field:=20, Criteria1:="Lunes", Operator:=xlAnd
        .Range.AutoFilter Field:=16, Criteria1:=Sheets(1).Range("Tema1Lun").Value, Operator:=xlAnd
        .Range.AutoFilter Field:=17, Criteria1:="=*TV*", Operator:=xlAnd
    End With

    On Error Resume Next
    Set rng = Range("Table[Column1]").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    If rng Is Nothing Then
        GoTo Filter2
    Else
        Range("Table[Column2]:Table[Column3]").Copy
        Range("SpecificRange").PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
    End If
0赞 2 revs, 2 users 85%Javier Puig Rovira #3

我明白了! 我用了这个:

If Range("Table[Column1]").RowHeight = 0 Then
     GoTo Filter2
 ElseIf Range("Table[Column1]").SpecialCells(xlCellTypeVisible).Count >= 1 Then
     With Range("Table[Column2]:Table[Column3]").Copy
     End With
          Range("rng_HLLun1").PasteSpecial Paste:=xlPasteValues
          Application.CutCopyMode = False End If

Filter2: