我是论坛新手,如果我的帖子不完整,请原谅我。
我有一个非常简单的数据透视表,其中包含一个行字段、一个列字段、一个数据字段和一个过滤字段。行字段根据过滤器设置显示。使用 VBA,我的目的是循环遍历所有行枢轴项和列枢轴项并获取相应的字段名称和数据值并将它们显示为健全性检查。这是一个更大项目的开始。
这是主循环(showstring 显示在屏幕上):
showstring = ""
For rowFldNo = 1 To pvt.RowFields.Count
For colFldNo = 1 To pvt.ColumnFields.Count
For rowItemNo = 1 To pvt.RowFields(rowFldNo).PivotItems.Count
For colItemNo = 1 To pvt.ColumnFields(colFldNo).PivotItems.Count
If pvt.RowFields(rowFldNo).PivotItems(rowItemNo).Visible And _
pvt.ColumnFields(colFldNo).PivotItems(colItemNo).Visible Then
showstring = showstring & _
pvt.RowFields(rowFldNo).PivotItems(rowItemNo).Name & ": " & _
pvt.ColumnFields(colFldNo).PivotItems(colItemNo).Name & _
"= " & MyGetPivotData(pvt, rowFldNo, rowItemNo, colFldNo, _
colItemNo) & vbCrLf
End If
Next colItemNo
Next rowItemNo
Next colFldNo
Next rowFldNo
MsgBox showstring
MyGetPivotData 是一个简单的子函数,隐藏了使用 VBA 本机 GetPivotData 函数的复杂性。这是代码:
Function MyGetPivotData(ByRef thisPvt As PivotTable, _
ByVal rowFld As Integer, _
ByVal rowItem As Integer, _
ByVal colFld As Integer, _
ByVal colItem As Integer) As Integer
On Error Resume Next
MyGetPivotData =
thisPvt.GetPivotData(thisPvt.DataFields(thisPvt.DataFields.Count), _
thisPvt.RowFields(rowFld).Name, _
thisPvt.RowFields(rowFld).PivotItems(rowItem).Name, _
thisPvt.ColumnFields(colFld).Name, _
thisPvt.ColumnFields(colFld).PivotItems(colItem).Name).Value
End Function
代码运行良好,但没有达到我的目的。我的问题出在第一个代码段。在调用 MyGetPivotData 之前,我正在使用 Visible 属性。问题是可见不随过滤器设置而改变 - 我通过手动检查数据透视表字段来验证它。过滤器设置会影响屏幕上的可见内容,但数据透视项 Visible 属性不会更改且始终为 True。因此,我循环遍历所有可用字段,并且 GetPivotData 对于不可见字段返回值 0。这对我来说是不可接受的,因为我的数据透视数据包含实际的 0 值。
我的问题是是否有其他属性可以用来确定数据透视项是否被过滤掉(不可见,因此不相关)或不过滤(可见且相关)。我尝试了 VBA 中的对象浏览器,但没有得到任何帮助。任何提示将不胜感激。
谢谢