【问题标题】:VBA - test if a value is a valid selection for a PivotFieldVBA - 测试一个值是否是 PivotField 的有效选择
【发布时间】:2015-08-15 05:31:36
【问题描述】:

对于 Sheet1 上的数据透视表 (pt1),我使用 VBA 使用以下代码更改筛选字段 (filterfield) 的值。假设字段的值可以是 A、B 或 C

Sheets("Sheet1").PivotTables("pt1").PivotFields("filterfield").CurrentPage = "A"

偶尔,让我们说 randomonly 出于这个问题的目的,A、B 或 C 将不是 filterfield 的有效选择。当 VBA 尝试更改字段时,它会引发运行时错误。我想避免这种情况。

在运行上述代码之前,如何检查我的值是否对 filterfield 有效?我想避免使用 On Error 并且 VBA 没有 try/catch 功能..

【问题讨论】:

  • 这不是刚刚发布在SuperUser上吗?
  • 您可以遍历PivotFields("filterField").PivotItems 并检查该集合中是否存在所需的值。
  • 好的,我试一试,谢谢

标签: excel excel-2007 pivot-table vba


【解决方案1】:

您可以遍历 PivotItems 并根据您的测试检查 Name

Sub CheckIfPivotFieldContainsItem()

    Dim pt As PivotTable
    Set pt = Sheet1.PivotTables(1)

    Dim test_val As Variant
    test_val = "59"

    Dim pivot_item As PivotItem
    For Each pivot_item In pt.PivotFields("C").PivotItems
        If pivot_item.Name = test_val Then
            Debug.Print "MATCHES"
        End If
    Next pi

End Sub

相关数据表明应该存在匹配并且确实返回MATCHES

【讨论】:

    【解决方案2】:

    如果你想要一个辅助函数并且在不循环值的情况下执行此操作,你可以使用 Visual Basic OnErrorResumeNext 技巧。

    Private Function hasPivotItem(pField As PivotField, value As String) As Boolean
        On Error Resume Next
        hasPivotItem = Not IsNull(pField.PivotItems(value))
        On Error GoTo 0
    End Function
    
    ' somewhere in your vba program
    Debug.Print hasPivotItem(ptTable.PivotFields("Level"), "1")
    Debug.Print hasPivotItem(ptTable.PivotFields("Level"), "-123")
    

    【讨论】:

    • 感谢避免循环!但是为什么需要hasPivotItem = False(至少在原始编辑中)?
    • @LWC 我们必须在调用pField.PivotItems(str) 之前初始化所需的默认返回值。我们忽略错误(OnErrorResumeNext),因此永远不会在未知字段上设置返回值,我们希望默认为 FALSE。
    • 我能说什么,当该字段不存在时,即使没有此初步声明,它似乎也会返回 false。
    猜你喜欢
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多