为什么这个PivotItem.Visible调用抛出了TypeMismatch错误?

时间:2013-10-17 11:03:32

标签: excel-vba excel-2010 pivot-table vba excel

令我们感到困惑。我有一个标准的数据透视表,上面有一个报告过滤器,可以选择多个项目。我可以使用以下命令获取报告过滤器中的所选项目:

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上收到类型不匹配错误。我们知道Visiblepi中的属性,因为在输入pi.之后,智能感知会出现所有PivotItem属性和方法(正如您所期望的那样)。我们知道pi包含一个有效的PivotItem,因为调用pi.Value会正确打印该值(删除If / End If语句只是让它打印该值而不管是否打印列表中的每个项目)。他的报告过滤器没有任何“特殊” - 它不是计算字段或类似的东西。 PivotItem的大多数其他属性也会失败。

有谁知道为什么PivotItem会显示此行为? MSDN reference似乎相当不足。

4 个答案:

答案 0 :(得分:1)

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

我正在使用的数据透视表基本上看起来像这样:

enter image description here

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

我正在使用此代码:

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属性仍在“局部”窗口中显示正确的值。

出于某种原因,如果我将.Value分配给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

答案 1 :(得分:0)

我的同事在this post进行了大量Google搜索后找到了答案:

  

对于您的信息以及有此问题的其他人 - 我已经破解并简单地完成了!

     

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

     

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

     

Excel 2003似乎正确地将包含UK日期的GENERAL格式化单元格合并到“正确日期”,从而按预期执行VBA代码,而Excel 2007/2010不会导致类型不匹配错误。这些版本需要帮助,明确地将PivotField NUMBER格式DATE设置为具有在几个月和几天之间不显眼的图片。

     

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

     

最重要的是,您提供的有关此代码在USA WRS下运行良好的见解令人大开眼界,需要在VBA代码之外的其他地方寻找解决方案。为此,我非常感激 - 谢谢!

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

答案 2 :(得分:0)

我在http://dailydoseofexcel.com/archives/2013/11/09/a-date-with-pivotitems/

上写了一篇回帖

奇怪的是,这似乎影响了某些机器,而不是其他机器,也有一些版本,而不是其他版本。

我写了一个小测试例程,它设置了一个包含两个项目的轴 - 一个是日期,一个是数字 - 然后尝试将.visible状态设置为true ...首先使用数字格式设置到日期格式,然后将数字格式设置为&#39;一般&#39;

在我的系统上,当格式设置为“常规”时,我在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

答案 3 :(得分:0)

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