2

这让我们很困惑。我有一个标准的数据透视表,上面有一个报告过滤器,允许选择多个项目。我可以通过以下方式获取报告过滤器中的选定项目:

Dim pi As PivotItem
For Each pi In PivotTables("MyPivot").PivotFields("MyField").PivotItems
    If pi.Visible Then
        Debug.Print pi.Value
    End If
Next

简单的。我的同事有一个标准的数据透视表,上面有一个报告过滤器,可以选择多个项目。他尝试使用相同的代码在报告过滤器中获取选定项目:

Dim pi As PivotItem
For Each pi In PivotTables("HisPivot").PivotFields("HisField").PivotItems
    If pi.Visible Then
        Debug.Print pi.Value
    End If
Next

并在pi.Visible. 我们知道这Visible是 中的一个属性pi,因为在输入pi.智能感知后会出现所有PivotItem属性和方法(如您所料)。我们知道 pi 包含一个有效的 PivotItem,因为调用pi.Value会正确打印该值(删除If/End If语句以让它打印该值,而不管将打印列表中的每个项目)。他的报告过滤器没有什么特别之处——它不是一个计算字段或类似的东西。的大多数其他属性PivotItem也失败了。

有谁知道为什么PivotItem会表现出这种行为?MSDN 参考似乎相当不充分。

4

4 回答 4

2

在对此进行了一些研究之后,我发现的所有内容都指向这是 VBA 库代码中的一个错误。但是,我似乎(意外地)偶然发现了一种似乎可以修复错误的方法,我没有在任何其他线程/论坛中看到有关此错误的提及。

我使用的数据透视表基本上是这样的:

在此处输入图像描述

我试图让一个宏隐藏突出显示的部分。 请注意,该错误仅针对第一个突出显示的部分引发,其中包含空白日期/数据。

我正在使用这段代码:

Function RemovePivotTableBlanks(ByRef pt As PivotTable, ByVal field As String)
    Dim pi As PivotItem

    For Each pi In pt.PivotFields(field).PivotItems
        If Left(pi.Value, 1) = "<" Or Left(pi.Value, 1) = ">" Or pi.Value = "(blank)" Then

            'this throws an error, but only for the first PivotItem
            If pi.Visible = True Then
                pi.Visible = False
            End If
        End If
    Next pi
End Function

另请注意,该.Visible属性仍会在 Locals 窗口中显示正确的值。

出于某种原因,如果我将 分配.Value给 a string,然后再分配给PivotItem对象,错误就消失了:

Function RemovePivotTableBlanks(ByRef pt As PivotTable, ByVal field As String)
Application.ScreenUpdating = False
Application.EnableEvents = False
    Dim pi As PivotItem
    Dim str As String

    For Each pi In pt.PivotFields(field).PivotItems
        If Left(pi.Value, 1) = "<" Or Left(pi.Value, 1) = ">" Or pi.Value = "(blank)" Then

            str = pi.Value
            pi.Value = str

            'no error for the first PivotItem anymore
            If pi.Visible = True Then
                pi.Visible = False
            End If
        End If
    Next pi
Application.EnableEvents = True
Application.ScreenUpdating = True
End Function
于 2016-08-23T17:09:52.907 回答
0

我的同事在这篇文章中经过大量谷歌搜索后找到了答案:

为了您和其他有此问题的人的信息 - 我已经破解它并且这样做很简单!

我发现,通过将 PivotField 的 NUMBER 格式明确设为 DATE 格式(而不是 GENERAL),即使使用英国 dd/mm/yyy 日期格式,.PivotItem.Visible = True 指令也会在 2007 年正确执行。但是 If Not .PivotItems(i).Visible Then 仍然会因类型不匹配错误而咳嗽。将 PivotField 上的 DATE 格式更改为 dd mmm yyy(同时不更改语言环境)使代码在 2007 下正常工作。

注意:设置数据透视字段的 NUMBER 格式的选项似乎仅在数据透视表的源区域是数据列表时可用。如果数据源只是一个单元格区域,则字段设置对话框上的数字按钮不存在。

看起来 Excel 2003 正确地将包含英国日期的 GENERAL 格式的单元格合并到“正确日期”,从而按预期执行 VBA 代码,而 Excel 2007 / 2010 没有出现相应的类型不匹配错误。这些版本需要通过明确使 PivotField NUMBER 格式 DATE 具有在月和日之间明确的图片来获得帮助。

简而言之,如果您遇到此问题并且可以将 PivotField 格式化为 DATE,则代码将正常工作。

最重要的是,您提供的关于此代码在 USA WRS 下运行良好的洞察力是在 VBA 代码之外寻找解决方案所需的大开眼界。为此,我非常感激 - 谢谢!

我不会假装理解其中的大部分内容或为什么格式应该对 PivotItem 属性有任何影响,但它确实有效。我们的解决方案与那里详述的答案略有不同:他的报告过滤器具有日期格式*dd/mm/yyyy。更改它以dd/mm/yyyy解决问题。完全莫名其妙。

于 2013-10-17T11:18:00.723 回答
0

我在http://dailydoseofexcel.com/archives/2013/11/09/a-date-with-pivotitems/上写了一篇关于这个的帖子

奇怪的是,这似乎会影响某些机器而不是其他机器,以及某些版本而不是其他版本。

我编写了一个小测试例程,它设置了一个包含两个项目的轴 - 一个是日期,一个是数字 - 然后尝试将 .visible 状态设置为 true ...首先将数字格式设置为日期格式,然后将数字格式设置为“常规”

在我的系统上,当格式设置为常规时,我在 2010 上收到错误,但设置为日期格式时没有错误。但奇怪的是,当我在 Excel 2013 上运行相同的代码时,我没有收到任何错误。所以它似乎是固定的。

Daily Dose 帖子的一位评论者表示,这对他来说在任何一个版本中都不是问题。

所以也许这是版本和地区的奇怪组合。

这是我的测试代码,如果其他人有兴趣看看它在他们的盒子上做了什么:

Sub Test()

Dim pf As PivotField
Dim pc As PivotCache
Dim pt As PivotTable
Dim pi As PivotItem
Dim rng As Range

[A1].Value = "Data"
[A2].Value = "=TODAY()"
[A3].Value = "=VALUE(TODAY())"

Set rng = Cells(ActiveSheet.UsedRange.Row, ActiveSheet.UsedRange.Columns.Count + ActiveSheet.UsedRange.Column + 1)

Set pc = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=[A1].CurrentRegion)
Set pt = pc.CreatePivotTable(TableDestination:=rng)
Set pf = ActiveSheet.PivotTables(1).PivotFields(1)


pf.NumberFormat = "d/mm/yyyy"
For Each pi In pf.PivotItems
pi.Visible = True
Next pi

pf.NumberFormat = "General"
For Each pi In pf.PivotItems
pi.Visible = True 'Code errors out for me here using Excel 2010
Next pi

End Sub
于 2014-05-03T10:56:43.553 回答
0

刚刚遇到这个问题,似乎在使用数据透视表时,格式化日期的多种方法确实是更大的问题。如果格式是真正的 dd/mm/yyyy(或 mm/dd/yyyy),它似乎很好,但缩短为 yy 给我带来了问题。将 pi.value 更改为字符串确实解决了不匹配类型错误的问题,但是通过转到数据透视表字段列表,单击我的日期行数据透视项目和字段设置,有一个数字格式按钮,您可以在其中更改数据透视的格式像您会更改单元格格式的项目。因此,然而日期是通过电子表格排列和进行的,当它们进入数据透视表时,我能够将格式编辑为“mmm d”,我的问题就解决了。

于 2020-04-10T20:46:42.053 回答