循环通过PivotItems:运行时错误91

时间:2008-12-15 12:02:22

标签: excel vba excel-vba

我在工作表中有一个数据集,每次都可以不同。我正在从该数据创建一个pivottable,但有可能其中一个PivotItem不在那里。例如:

.PivotItems("Administratie").Visible = False

如果该特定值不在我的数据集中,则VBA脚本失败,表示它无法在指定的字段中定义该项。 (错误1004)

所以我认为循环可能有效。 我有以下内容:

Dim pvtField As PivotField
Dim pvtItem As PivotItem
Dim pvtItems As PivotItems

For Each pvtItem In pvtField.pvtItems
        pvtItem.Visible = False
Next

但是这给了我For For pvtItem系列的91错误:

Object variable or With block variable not set

我以为我已经足够好地宣布了这些变量,但我很可能错过了一些明显的变数......

10 个答案:

答案 0 :(得分:1)

我知道了! :d

Dim Table As PivotTable
Dim FoundCell As Object
Dim All As Range
Dim PvI As PivotItem

    Set All = Worksheets("Analyse").Range("A7:AZ10000")
    Set Table = Worksheets("Analyse").PivotTables("tablename")
    For Each PvI In Table.PivotFields("fieldname").PivotItems
        Set FoundCell = All.Find(PvI.Name)
        If FoundCell <> "itemname" Then
            PvI.Visible = False
        End If
    Next

哇噢

感谢MrExcel,毕竟的答案,尽管已深深埋葬。

答案 1 :(得分:0)

尝试这样的事情:

Public Function Test()
    On Error GoTo Test_EH

    Dim pvtField As PivotField
    Dim pvtItem As PivotItem
    Dim pvtItems As PivotItems

    ' Change "Pivot" to the name of the worksheet that has the pivot table.
    ' Change "PivotTable1" to the name of the pivot table; right-click on the
    ' pivot table, and select Table Options... from the context menu to get the name.
    For Each pvtField In Worksheets("Pivot").PivotTables("PivotTable1").PivotFields
        Debug.Print "Pivot Field: " & pvtField.Name
        For Each pvtItem In pvtField.VisibleItems
            pvtItem.Visible = False
        Next
    Next

Exit Function

Test_EH:
    Debug.Print pvtItem.Name & " error(" & Err.Number & "): " & Err.Description
    Resume Next

End Function

如果你想让一个函数只测试一个支点项的存在,你可以使用这样的东西:

Public Function PivotItemPresent(sName As String) As Boolean
    On Error GoTo PivotItemPresent_EH

    PivotItemPresent = False

    For Each pvtField In Worksheets("Pivot").PivotTables("PivotTable1").PivotFields
        For Each pvtItem In pvtField.VisibleItems
            If pvtItem.Name = sName Then
                PivotItemPresent = True
                Exit Function
            End If
        Next
    Next

    Exit Function

PivotItemPresent_EH:
    Debug.Print "Error(" & Err.Number & "): " & Err.Description
    Exit Function

End Function

您可以通过以下代码调用此方法:

If PivotItemPresent("name_of_the_thing") Then
    ' Do something
End If

答案 2 :(得分:0)

For Each pvtField In Worksheets("my_sheet").PivotTables("my_table").PivotFields
    For Each pvtItem In pvtField.PivotItems
        Debug.Print vbTab & pvtItem.Name & ".Visible = " & pvtItem.Visible
        /*.PivotItems(pvtItem).Visible = False*/ 
    Next
Next
.PivotItems("certain_Item").Visible = True

这仍然不起作用......所有变量仍然可见。没有显示错误,它编译但值仍然存在。
我在那里添加的注释行是我自己的“发明”,但它无效。

编辑:Quicky问题:我是否可以使用IF语句检查某个PivotItem是否实际位于数据透视表数据中?像

这样的东西
If PivotItem("name_of_the_thing") = present Then {
    do_something()
}

答案 3 :(得分:0)

你不能在“.PivotItems(pvtItem).Visible”区块之外说“With”。改为说“pvtField.PivotItems(pvtItem.Name).Visible = False”。

我还编辑了我的原始答案,包括Excel无法设置Visible属性时的错误处理。发生这种情况是因为数据透视表至少需要一个行字段,一个列字段和一个数据项,因此不能使这些字段中的最后一个不可见。

当您尝试访问已经不可见的枢轴项时,您还会得到1004错误;我想你可以忽略这些。

答案 4 :(得分:0)

当我实施Patrick发布的代码时, -

  

无法设置PivotItem类的可见属性

- 抛出错误。

微软承认存在一个错误:M$ help
但只是隐藏线......不是选择的选择。

答案 5 :(得分:0)

循环结束时抛出错误 我将帕特里克的两个答案合并到以下内容中:

With ActiveSheet.PivotTables("Table").PivotFields("Field")

    Dim pvtField As Excel.PivotField
    Dim pvtItem As Excel.PivotItem
    Dim pvtItems As Excel.PivotItems

    For Each pvtField In Worksheets("Sheet").PivotTables("Table").PivotFields
        For Each pvtItem In pvtField.PivotItems
            If pvtItem.Name = "ItemTitle" Then
                pvtField.PivotItems("ItemTitle").Visible = True
            Else
                pvtField.PivotItems(pvtItem.Name).Visible = False
            End If
        Next
    Next
End With

如果Item匹配特定字符串,则该Item设置为True。其他;项目设置为假。在错误的情况下会抛出错误 我知道真正的条件只有一个匹配。虽然当我'F8'通过宏时,真正的条件永远不会进入......

这解释了错误,一切都设置为False。 (谢谢帕特里克!)

引出了我的问题......究竟一个数据透视项?



事物的想法:
它解决(或应该解决)以下问题:一组具有可变大小的数据,对于此特定表,一列感兴趣。从那一列我需要一个值的计数,并把它放在一个表中。该表有一些条件,并且还需要与另一列组合,因此数据透视表是最佳解决方案。
问题是:在某些数据集中,不会出现一个特定值。 DO出现的值每次都不同。

答案 6 :(得分:0)

PivotItems是字段(列,行,数据)中的各个值。我认为它们是“桶”,它包含您想要聚合的所有单个数据项。

您可以直接查看您感兴趣的字段,而不是遍历所有数据透视表字段(列,行和数据)。例如,此代码仅显示指定字段的指定数据透视表项:

Public Sub ShowInPivot(Field As String, Item As String)
    On Error GoTo ShowInPivot_EH

    Dim pvtField As PivotField
    Dim pvtItem As PivotItem
    Dim pvtItems As PivotItems

    For Each pvtItem In Worksheets("Pivot").PivotTables("PivotTable1").PivotFields(Field).PivotItems
        If pvtItem.Name = Item Then
            pvtItem.Visible = True
        Else
            pvtItem.Visible = False
        End If
    Next

    Exit Sub

ShowInPivot_EH:
    Debug.Print "Error(" & Err.Number & "): " & Err.Description
    Exit Sub

End Sub

假设我有一个数据透视表,显示每个客户发布的问题数量以及在我们的SDLC中检测到的问题。 “Customer”和“Release”是列字段,“Phase”是行字段。如果我想在QA期间限制数据透视表以计算CustomerA版本1.2的问题,我可以使用上面的子代码:

ShowInPivot "Customer", "CustomerA"
ShowInPivot "Release", "1.2"
ShowInPivot "Phase", "QA"

答案 7 :(得分:0)

我试图设置pivotitem可见true和false时也有同样的错误信息..这在以前工作过,但是不再工作了...我正在比较两个值,并且没有明确地将字符串更改为整数比较......这样做会使错误消失..

..所以,如果您收到此消息,请检查是否正在比较任何正在比较的值以使项目可见;否则,pivotitem为空,并且无法使其可见。

答案 8 :(得分:0)

我遇到错误,说“无法设置数据透视表项的可见属性” 在这一行:

For Each pi In pt.PivotFields("Fecha").PivotItems
    If pi.Name = ffan Then
        pi.Visible = True
    Else
        pi.Visible = False '<------------------------
    End If
Next pi

然后我在网上看到我必须对手动进行排序然后清除缓存。我做了那个,但错误仍然出现.....然后我读到这是因为我在那个枢轴场上有约会,所以我把它改为我的colum到一般数字然后我希望设置的日期可见我将它改为一般号码也是。那么没问题!!!!!!!!!!!!!! ....这里是....我希望这可以有所帮助因为我绝望了!!!

Dim an As Variant
an = UserForm8.Label1.Caption 'this label contains the date i want to see its the pivot item i want to see of my pivot fiel that is "Date"
Dim fan
fan = Format(an, "d m yyyy")  
Dim ffan
ffan = Format(fan, "general number")

Sheets("Datos refrigerante").Activate 'this is the sheet that has the data of the pivottable
Dim rango1 As Range
Range("B1").Select
Range(Selection, Selection.End(xlDown)).Select

Set rango1 = Selection
ActiveSheet.Cells(1, 1).Select
rango1.Select

Selection.NumberFormat = "General" 'I change the format of the column that has all my dates

'clear the cache
Dim pt As PivotTable
Dim ws As Worksheet
Dim pc As PivotCache

'change the settings
For Each ws In ActiveWorkbook.Worksheets
    For Each pt In ws.PivotTables
        pt.PivotCache.MissingItemsLimit = xlMissingItemsNone
    Next pt
Next ws

'refresh all the pivot caches
For Each pc In ActiveWorkbook.PivotCaches
  On Error Resume Next
  pc.Refresh
Next pc

'now select the pivot item i want
Dim pi As PivotItem

Set pt = Sheets("TD Refrigerante").PivotTables("PivotTable2")

'Sets Pivot Table to Manual Sort so you can manipulate PivotItems in PivotField
pt.PivotFields("Fecha").AutoSort xlManual, "Fecha"

'Speeds up code dramatically
pt.ManualUpdate = True

For Each pi In pt.PivotFields("Fecha").PivotItems
    If pi.Name = ffan Then
        pi.Visible = True
    Else
        pi.Visible = False
    End If
Next pi

pt.ManualUpdate = False
pt.PivotFields("Fecha").AutoSort xlAscending, "Fecha"

答案 9 :(得分:0)

使用标题代替名称

For Each pvtItem In ActiveSheet.PivotTables("PivotTable1").PivotFields("Something").PivotItems
    If Not pvtItem.Caption = "Example" Then
       pvtItem.Visible = False
    End If
Next