我是论坛的新手,所以如果我的帖子不完整,请放纵我。
我有一个非常简单的数据透视表,包含一个行字段,一个列字段,一个数据字段和一个过滤字段。根据过滤器设置显示行字段。使用VBA,我的目的是遍历所有行pivotitems和列pivotitems并获取相应的字段名称和数据值,并将它们显示为完整性检查。这是一个更大项目的开始。
这是主循环(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不会随着过滤器设置而改变 - 我通过在数据透视表字段中手动检查来验证它。过滤器设置会影响屏幕上可见的内容,但枢轴实体Visible属性不会更改,并且始终为True。因此,我循环遍历所有可用字段,GetPivotData为非可见字段返回值0。这是我不能接受的因为我的数据透视数据包含实际的0值。
我的问题是,是否还有其他属性我可以用来确定是否过滤掉了不可见的(不可见的,因而无关的)或不是(可见的和相关的)。我在VBA中尝试过对象浏览器,但没有更明智。任何提示将不胜感激。
谢谢
正如您已经发现的PivotItems的可见性:
如果你过滤一个PivotTable
,那么你的PivotItems
或RowFields
的一些ColumnFields
是光学可见的,
但是VBA仍然将每个PivotField.PivotItem
作为Visible
返回。
PivotField.VisibleItems.Count
也始终是最大的。
其余的“真正”可见的PivotItems
可以通过每个枢轴的PivotLine.PivotLineCell.PivotItem
来解决。
qazxsw poi区分常规,空白,小计和总计行。
LineType
如果您有多个列或行字段,那么showstring = ""
For rowItemNo = 1 To pvt.PivotRowAxis.PivotLines.Count
If pvt.PivotRowAxis.PivotLines(rowItemNo).LineType = xlPivotLineRegular Then
For colItemNo = 1 To pvt.PivotColumnAxis.PivotLines.Count
If pvt.PivotColumnAxis.PivotLines(colItemNo).LineType = xlPivotLineRegular Then
showstring = showstring & _
pvt.PivotRowAxis.PivotLines(rowItemNo).PivotLineCells(1).PivotItem.Name & ":" & _
pvt.PivotColumnAxis.PivotLines(colItemNo).PivotLineCells(1).PivotItem.Name & _
" = " & pvt.DataBodyRange.Cells(rowItemNo, colItemNo).Value & vbCrLf
End If
Next colItemNo
End If
Next rowItemNo
MsgBox showstring
可以区分它们。
...或者你绕过每个PivotLineCells()
的DataRange
来捕捉一个简单数据透视表的可见单元格中的项目:
PivotField