Excel VBA循环通过过滤的pivotitems

问题描述 投票:1回答:1

我是论坛的新手,所以如果我的帖子不完整,请放纵我。

我有一个非常简单的数据透视表,包含一个行字段,一个列字段,一个数据字段和一个过滤字段。根据过滤器设置显示行字段。使用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中尝试过对象浏览器,但没有更明智。任何提示将不胜感激。

谢谢

excel vba filtering pivot-table visible
1个回答
1
投票

正如您已经发现的PivotItems的可见性:

如果你过滤一个PivotTable,那么你的PivotItemsRowFields的一些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
© www.soinside.com 2019 - 2024. All rights reserved.