【问题标题】:Why is this PivotItem.Visible call throwing a TypeMismatch error?为什么这个 PivotItem.Visible 调用会引发 TypeMismatch 错误?
【发布时间】:2013-10-25 20:05:30
【问题描述】:

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

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 似乎不够用。

【问题讨论】:

    标签: excel excel-2010 pivot-table vba


    【解决方案1】:

    我的同事在this post 中进行了多次谷歌搜索后找到了答案:

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

    我发现,通过将 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 具有在月和日之间明确的图片。

    简而言之,如果您遇到此问题并且可以将数据透视字段格式化为 DATE,那么代码将正常工作。

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

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

    【讨论】:

      【解决方案2】:

      不久前我在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
      

      【讨论】:

        【解决方案3】:

        对此进行了一番研究后,我发现的所有内容都指向这是 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 分配给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
        

        【讨论】:

        • 我很确定这是一个仅在非英文版 Excel 中出现的错误。我已经完成了一次你的把戏,现在我的项目名称是 (blank) 而不是 (leer)。之后它工作正常。你甚至不需要那部分代码,只要有一行If pi.Value = "(BLANK_IN_YOUR_LANGUAGE)" Then pi.Value = "(blank)" 就足够了。我还没有这样测试过。感谢您为我指引方向的回答。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-30
          相关资源
          最近更新 更多