3

很久以前,我曾经使用过 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")

.... 

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

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

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

4

2 回答 2

2

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

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")

   .... 
于 2013-03-06T03:54:46.190 回答
0

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

首先,微软的文档说:

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

因此,根据我的经验,传递一个范围对象在大多数情况下都可以正常工作,但有时会返回类型不匹配。“出乎意料”的结局是让我寻求解决方法的原因,这非常简单。我发现只有当活动表是数据表时,该方法才会接受 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 方法中的“目标”是一个范围对象,到目前为止没有任何问题。

于 2018-08-21T17:58:31.530 回答