运行下面的代码时出现不匹配错误13。整个代码模块已经使用,大部分时间都没有变化,我最近没有改变任何内容,我是这个工作簿的唯一用户。
非工作代码:
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到大约7,000行的文件进行了检查,如果我尝试与其他任何其他对象进行交互,则Range
对象会生成有效的引用方式。
我已在SO上查看了一些相关问题:
PivotCaches
in the workbook before attempting to create a new one. 解决方法代码:
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
时突然停止工作代码的人,就像我最初一样。那么这里真正的根本原因是什么?导致代码停止运行的原因是什么?
我想知道,如果可能的话,我可以防止未来出现意外错误。我知道答案可能在于我在代码/工作簿中的其他地方所做的事情(这里没有引用),但我不能为我的生活追踪发生了什么变化。
答案 0 :(得分:0)
原因似乎是数据透视表的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")
有时你只需要接受微软并不完美(很讽刺),他们就像其他公司一样做蠢事。无论如何,这是我的理论。祝你好运。