我在工作表中有一个数据集,每次都可以不同。我正在从该数据创建一个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
我以为我已经足够好地宣布了这些变量,但我很可能错过了一些明显的变数......
答案 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)
答案 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