Excel VBA:数据透视缓存.创建类型不匹配



我以前很长一段时间都在使用vb(作为visual studio pkg的一部分),一份新工作让我在一个附带项目中使用VBA。我不会说我已经脱离了困境,但我仍然在重新学习我以前做的很多事情(更不用说,结合了我在visual studio学习VB时没有接触过的excel特定部分)

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

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


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错误,告诉我需要选择多行数据(从我能解释的数据中——很遗憾,错误代码的消息框截断了这一行,这有点有趣哈哈)。但是,我仔细检查了一下,所选内容确实占据了我的整个表(所有6列和1000多行)。

如有任何帮助或指向正确的方向,我们将不胜感激。

*核实;我将sheetName作为变量而不是字符串传递,因为我使用了一个输入框来要求用户为工作表命名。作为一种故障保护,将输入框的句柄标注为变量可以让我检查用户是否取消了操作(然后返回false值而不是空字符串)。

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

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

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

首先,微软的文档中写道:

"传递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",没有括号,对象变量声明和设置等。

CreateData透视表方法中的"destination"是一个范围对象,到目前为止没有任何问题。

最新更新