【问题标题】:Excel VBA: PivotCaches.Create Type MismatchExcel VBA:PivotCaches.Create 类型不匹配
【发布时间】:2012-09-27 01:17:30
【问题描述】:

很久以前,我曾经使用过 vb(作为 Visual Studio pkg 的一部分),而一份新工作让我在业余项目中使用了一点 VBA。我不会说我是新手船,但我仍然在重新学习我以前做过的很多事情(更不用说,结合我在学习 VB 时没有涉及到的 excel 特定部分)在视觉工作室)

我已经在另一个项目中通过 vba 完成了几个数据透视表,但是我现在有一个特定的项目让我很困惑。

我一直在重复使用 VBA Excel 参考书中列出的一些数据透视表的代码,并且到目前为止它运行良好。但是在这个特定的工作簿中,在工作表上按下了一个按钮,该按钮在传递一些变量的同时调用一个函数。一切通常都很好而且花花公子,但是当我尝试创建缓存时,我收到一个错误,告诉我我有一个不匹配错误?据我了解,在创建数据透视缓存时,可以将字符串和变体作为源数据传递,但是之前已经多次重复下面的代码,直到现在我都没有遇到任何问题。


Private Function createPivotTable(ByRef sheetName As Variant, ByVal sheetNum As Integer)

Dim DataRange As Range
Dim pivotTableCache As PivotCache
Dim pivotTableReport As PivotTable

ActiveWorkbook.Worksheets("EXAMPLE SHEET").Activate
Range("A1").Select
Set DataRange = Selection.CurrentRegion

Worksheets.Add.Name = sheetName

Set pivotTableCache = ActiveWorkbook.PivotCaches.Create(xlDatabase, _ 
      SourceData:=DataRange)
Set pivotTableReport = pivotTableCache.createPivotTable(TableDestination:=ActiveWorkbook.Worksheets(sheetName).Range("A1"), _
TableName:="PVR")

.... 

所以我基本上被困住了。我发现了另一个围绕类似问题跳舞的线程here。评价最高的评论确实解决了一个问题,因为当我将它作为字符串沿范围位置传递时,我不再有不匹配的问题,但是当我尝试创建实际表本身时,我一直收到一个 1004 错误告诉我我需要选择多行数据(从我可以解释的内容来看 - 可悲的是,错误代码的 msgbox 切断了这一行,这有点有趣哈哈)。但是,我已经仔细检查过,选择确实抓住了我的整个表格(所有 6 列和 1000 行)。

任何帮助或指出正确的方向将不胜感激。

*验证;我将 sheetName 作为变体而不是字符串传递,因为我使用输入框要求用户命名工作表,并且作为故障保险,将输入框的句柄尺寸标注为变体允许我检查用户是否已取消操作(然后返回 false 值而不是空白字符串)。

【问题讨论】:

    标签: excel excel-2007 pivot-table type-mismatch vba


    【解决方案1】:

    看起来虽然您确定了正确的范围,但它没有找到数据,因为您的范围没有引用包含数据的工作表。您可能想尝试:

    Private Function createPivotTable(ByRef sheetName As Variant, ByVal sheetNum As Integer)
    
       Dim pivotTableCache As PivotCache
       Dim pivotTableReport As PivotTable
    
       Worksheets.Add.Name = sheetName
    
       Set pivotTableCache = ActiveWorkbook.PivotCaches.Create(xlDatabase, _ 
         SourceData:=Sheets("EXAMPLE SHEET").Range("A1").CurrentRegion)
       Set pivotTableReport = pivotTableCache.createPivotTable( _
         TableDestination:=ActiveWorkbook.Worksheets(sheetName).Range("A1") _
         , TableName:="PVR")
    
       .... 
    

    【讨论】:

      【解决方案2】:

      时间有点晚了,但我偶然发现了一个类似的问题,也许我的解决方案对其他人有帮助。

      首先,微软的文档说:

      "传递Range时,建议要么使用字符串指定工作簿、工作表和单元格范围,要么设置命名范围并将名称作为字符串传递。传递Range对象可能会导致"type不匹配”意外错误。”

      所以根据我的经验,传递范围对象在大多数情况下都可以正常工作,但有时会返回类型不匹配。 “出乎意料”的结局是让我寻求解决方法的原因,这非常简单。我发现只有当活动表是数据表时,该方法才会接受 DataRange.Address,所以我这样做了:

      DataRange.Worksheet.Activate()
      cache = ActiveWorkbook.PivotCaches().Create(1, DataRange.Address, 6)
      pivot = cache.CreatePivotTable(destination, name, True, 6)
      

      请注意,我在 Python 中使用 pywintypes 执行此操作,因此在 VBA 中可能是不带括号的“.Activate”,以及声明和设置的对象变量等。

      CreatePivotTable 方法中的“destination”是一个范围对象,目前没有任何问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多