PivotCaches.Add不匹配错误 - 为什么之前没有发生?

问题描述:

运行下面的代码时出现不匹配错误13。整个代码模块已经使用并且大部分时间都保持不变,最近我没有改变任何东西,而且我是该工作簿的唯一用户。PivotCaches.Add不匹配错误 - 为什么之前没有发生?

非工作代码:

Private Sub CreateMIAPivots(MIABook As Workbook, MIASheet As Worksheet, MaxRow As Long) 

Dim wksPivotSheet As Worksheet 
Dim PivotRange As Range 

    Set wksPivotSheet = MIABook.Sheets.Add 
    wksPivotSheet.Name = "Summary" 
    wksPivotSheet.Tab.Color = RGB(255, 0, 0) 

    Set PivotRange = MIASheet.Range("A1:Y" & MaxRow) 
    With MIABook.PivotCaches.Add(xlDatabase, PivotRange) 'Error sets here 
    'More code below 

MaxRow是可变的,但我已经有大约600检查的话对一个文件约7000行,而Range对象进行有效的参考,如果我尝试以任何其他方式与其进行交互。

我在这里回顾了一些相关问题上的SO:

变通代码:

Private Sub CreateMIAPivots(MIABook As Workbook, MIASheet As Worksheet, MaxRow As Long) 

Dim wksPivotSheet As Worksheet 
Dim pc As PivotCache 
Dim lVBAVer As Long 
Dim PivotRange As Range 

    lVBAVer = CLng(Application.Version) 

    Set wksPivotSheet = MIABook.Sheets.Add 
    wksPivotSheet.Name = "Summary" 
    wksPivotSheet.Tab.Color = RGB(255, 0, 0) 

    Set PivotRange = MIASheet.Range("A1:Y" & MaxRow) 

    MIABook.Names.Add Name:="PivotRange", RefersTo:=PivotRange 

    'Using answer from https://stackoverflow.com/a/11868231/698590 (StackOverflow) 
    'as a guide for version checking. Original answer of 
    'CLng(Application.VBE.Version) did not work here. 
    #If lVBAVer <= 11 Then 
     Set pc = MIABook.PivotCaches.Add(xlDatabase, "PivotRange") 
    #Else 
     Set pc = MIABook.PivotCaches.Create(xlDatabase, "PivotRange") 
    #End If 
    With pc 
    'More code below 

我现在的问题是为什么是上面的解决方案必要的?看起来,我并不是唯一一个像我最初一样使用PivotCaches时突然停止工作的完美代码的人。那么这里真正的根本原因是什么?什么导致代码停止运作?

我想知道如果可能的话,我可以防止未来出现意外错误。我知道答案可能在于我在代码/工作簿的其他地方做过的事情(这里没有引用),但是我不能在我的生活中找出发生了什么变化。

所以你已经知道的问题与此有关:http://answers.microsoft.com/en-us/office/forum/office_2010-customize/pivotcache-type-mismatch-error-when-65536-rows/0827889e-b671-e011-8dfc-68b599b31bf5?msgId=4e3a2b20-7a72-e011-8dfc-68b599b31bf5

的原因似乎是透视表的VBA语法/用法改为从2003年到2007/2010。

所以使用这种常见的语法来设置一个命名的范围与本工作簿:

MIABook.Names.Add Name:="PivotRange", RefersTo:=PivotRange 

这部分代码:

#If lVBAVer <= 11 Then 
    Set pc = MIABook.PivotCaches.Add(xlDatabase, "PivotRange") 
#Else 
    Set pc = MIABook.PivotCaches.Create(xlDatabase, "PivotRange") 
#End If 

正在检查,看看是否lVBAver小于或者等于11,那么它使用以下语法:

Set pc = MIABook.PivotCaches.Add(xlDatabase, "PivotRange") 

如果它是新版本,那么它使用的语法如下:

Set pc = MIABook.PivotCaches.Create(xlDatabase, "PivotRange") 

有时候,你必须接受微软并不完美(笑讽刺),他们做愚蠢的事情就像所有其他的公司。无论如何,这是我的理论。祝你好运。

+0

感谢您的回复,@ stepan1010,但这不完全是我的问题。我在寻找解决方案时遇到了程序版本检查,但我只使用Excel 2003.我自己将检查包括在内,以便将来进行升级。似乎正确的解决方案是命名范围。虽然命名范围起作用,但直接调用范围(a la'Sheet.Range(“A1”)')停止工作并没有其他明显的代码更改是没有意义的。 – Gaffi

+0

我不知道这些信息是否会对你有所帮助,但我的理解是,你遇到的问题不仅仅是由于你使用的是excel的版本,而是你使用的VBA版本。看起来CLng(Application.Version)确实会为您提供应用程序版本 - 而不是VBA版本。但我仍然认为问题可能是特定于VBA的版本,您没有该应用程序的版本。这是我的怀疑,至少根据你告诉我的关于在这个问题期间只使用excel 2003。所以也许你会在某个时候使用什么版本的VBA。 – Stepan1010

+0

如何在不更新Office应用程序的情况下更新VBE版本?无论如何,如果我尝试使用VBA7版本('.Create'),我会得到一个错误,指出它不是'PivotCaches'的有效成员。再次,我确实得到了使用VBA6语法('.Add')的代码,但是我必须使用命名范围,而不是直接引用我想要的范围,尽管我以前从未需要这样做。 – Gaffi