【问题标题】:Runtime error 1004 - Unable to get the PageRange property of the PivotTable class运行时错误 1004 - 无法获取数据透视表类的 PageRange 属性
【发布时间】:2019-12-31 17:22:42
【问题描述】:

当代码应用于没有PageRange 属性的数据透视表时,代码将失败并显示标题中的错误

我尝试将布尔变量应用于

sh.PivotTables(i).PageRange

但这也没用

 Sub TestPivotPaste2()

    Dim wb As Workbook
    Dim sh As Worksheet
    Set wb = ActiveWorkbook

    Set sh = wb.Worksheets(7)
    c = sh.PivotTables.Count

    If c > 0 Then

        For i = 1 To c
            If Not sh.PivotTables(i).PageRange.Count = 0 Then
                Debug.Print c
            Else
                GoTo nextpiv
            End If
            nextpiv:
        Next i
    Else
    MsgBox ("NoPivot")
    End If

   End Sub

预期的结果是能够辨别 PageRange 属性为真或假的数据透视表,但它仅在范围存在时才有效。

【问题讨论】:

    标签: excel vba range pivot-table


    【解决方案1】:

    试试这个功能

    Function pageRangeExists(pt as PivotTable) as Boolean
    
        Dim test as Range
        On Error Resume Next
        Set test = pt.PageRange
        On Error Go To 0
    
        pageRangeExists = Not test Is Nothing
    
    End Function
    

    由于PageRange 是一个范围对象,因此您必须首先测试该范围是否存在或是否有效,因为尝试对不存在的范围进行操作会产生错误。

    这样你的for loop 就可以简化了

       For i = 1 To c
           If pageRangeExists(sh.PivotTables(i)) Then
               Debug.Print c
           End If
       Next i
    

    GoTo 语句是多余的,因为它是已经嵌入在for loop 中的逻辑。

    【讨论】:

    • 谢谢,测试范围对象的存在是我试图做的,但没有成功。我不知道如何在我的代码中使用该函数,但我理解你为什么提出它。
    • 我现在看到了你的其余评论,我按照你的建议使用了它,效果很好。非常感谢
    • @EliseoDiFolco - 我修改了我的答案。我相信应该是If pageRangeExists,因为如果页面范围在那里,你想debug.print c
    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    相关资源
    最近更新 更多