【问题标题】:Invalid Procedure or call argument for DefaultVersion:=xlPivotTableVersion14DefaultVersion:=xlPivotTableVersion14 的过程或调用参数无效
【发布时间】:2017-03-04 14:49:33
【问题描述】:

我已经搜索了针对 DefaultVersion:=xlPivotTableVersion14 获得的无效过程或调用参数的解决方案。我只找到了一个与在不同版本的 excel 之间运行代码有关的答案。我只在 2010 年运行它,所以我不确定为什么会这样。
任何帮助表示赞赏! 这是代码。

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
    "Dog Report!R1C1:R243C54", Version:=xlPivotTableVersion14). _
    CreatePivotTable TableDestination:="Pets!R2C1", TableName:= _
    "PivotTable1", DefaultVersion:=xlPivotTableVersion14

【问题讨论】:

  • 您确定工作表“Dog Report”包含来自“A1:BB1”的数据作为数据透视表的字段名称吗? SourceData:= "Dog Report!R1C1:R243C54" 声明源数据来自工作表“Dog Report”中的 A1:BB243。顺便说一句:应该更好SourceData:= "'Dog Report'!R1C1:R243C54"。请注意引号中的工作表名称,因为它包含一个空格。
  • 还要确保,还没有带有TableName:= "PivotTable1" 的数据透视表。

标签: excel vba pivot-table invalid-argument


【解决方案1】:

首先确保工作表“Dog Report”包含来自A1:BB1 的数据作为数据透视表的字段名称。SourceData:= "Dog Report!R1C1:R243C54" 声明源数据来自工作表“Dog Report”中的A1:BB243。顺便说一句:参考应该更好SourceData:= "'Dog Report'!R1C1:R243C54"。请注意引号中的工作表名称,因为它包含一个空格。

还要确保工作表“宠物”中还没有带有TableName:= "PivotTable1" 的数据透视表。

为此,您可以编写代码:

Dim pvtTable As PivotTable
Dim bPivotTable1Exists As Boolean

With ActiveWorkbook

 With .Worksheets("Pets")
  For Each pvtTable In .PivotTables
   If pvtTable.Name = "PivotTable1" Then
    bPivotTable1Exists = True
   End If
  Next
 End With

 If Not bPivotTable1Exists Then
  .PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
    "'Dog Report'!R1C1:R243C54", Version:=xlPivotTableVersion14). _
    CreatePivotTable TableDestination:="Pets!R2C1", TableName:= _
    "PivotTable1", DefaultVersion:=xlPivotTableVersion14
 Else
  'do something if pivot table already exists
 End If

End With

如果仍然失败,请确保工作表“宠物”不包含新数据透视表所需范围内的数据。但这不会引发错误,但会导致确认对话框。

此外:“宠物”表必须存在并且是工作表而不是图表表。

如果仍然失败,我将分两部分进行创建过程。一个用于数据透视缓存,另一个用于数据透视表。所以我们可以确定到底是什么失败了:

Dim pvtCache As PivotCache
Dim pvtTable As PivotTable
Dim bPivotTable1Exists As Boolean

With ActiveWorkbook

 With .Worksheets("Pets")
  For Each pvtTable In .PivotTables
   If pvtTable.Name = "PivotTable1" Then
    bPivotTable1Exists = True
   End If
  Next
 End With

 If Not bPivotTable1Exists Then
  Set pvtCache = .PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
    "'Dog Report'!R1C1:R243C54", Version:=xlPivotTableVersion14)

  With .Worksheets("Pets")
   .Range("A2:C19").ClearContents
  End With

  Set pvtTable = pvtCache.CreatePivotTable(TableDestination:="Pets!R2C1", TableName:= _
    "PivotTable1", DefaultVersion:=xlPivotTableVersion14)
 Else
  'do something if pivot table already exists
 End If

End With

【讨论】:

  • 非常感谢您的回复。是的,我确定来自“A1:BB1”的数据包含数据透视表的字段名称,因为我已将它用于同一工作簿中其他工作表中的其他数据透视表。此外,我一直小心确保没有 TableName:= "PivotTable1" 的数据透视表我也添加了引号,不幸的是我仍然收到无效的过程或调用参数错误消息。您对我如何解决此问题有任何其他建议
  • 工作簿的另一个工作表中还有另一个 PivotTable1 正在使用相同的数据范围。这会导致这个问题吗?
  • 否,其他工作表可以包含同名的数据透视表。但请参阅我的补充,其中包含进一步调试的提示。
  • 你的第二个建议效果很好!!非常感谢!!!你介意告诉我是什么失败了吗?我是一个新手,通常会记录我的大部分 vba 代码,当事情失败时,我会在代码中断模式下运行它并尽我所能修复它。我在这方面学到了很多东西,但这一项超出了我目前的技能。谢谢!
  • 建议应该简单地将数据透视缓存的创建与数据透视表的创建分开,以确定这些进程中的哪一个失败了。如果这在您的代码中完成的一步中执行此操作时现在有效,那么我也不知道为什么。在这两个步骤之间,我的代码清除了数据透视表所需的工作表“Pets”中的单元格范围。但如前所述,如果此单元格范围不为空,则不应引发错误,而是显示确认对话框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多