【发布时间】:2020-06-09 14:36:19
【问题描述】:
我正在尝试执行以下操作:
- 使用 VBScript,将 QlikView 中的数据导出到 Excel 中
- 使用 VBScript,触发 Excel 宏
- 拥有一个 Excel 宏,可根据从步骤 1 加载的数据构建数据透视表
我已成功导出数据(第 1 步)并触发了 Excel 宏(第 2 步)。
这个宏理论上应该可以实现第3步(如果我从Excel手动运行,它会成功完成)。
但是,当在步骤 3 中触发的宏创建数据透视表时,它会失败,并且在 QlikView 中,VBScript 消息是:
无法运行宏“procBuildPivot”。该工作簿中的宏可能不可用,或者所有宏都可能被禁用。
绝对不是这样,因为如果我直接在 Excel 中触发宏,则会构建数据透视表。或者,如果我从 QlikView 调用宏来执行任何操作(直到构建数据透视表,但不包括在内),它会起作用。
我的 VBScript:
Set objExcelApp = CREATEOBJECT("Excel.Application")
Set objExcelSheet = objExcelApp.Worksheets("Sheet 1")
objExcelApp.Workbooks.Open "Test.xlsm"
objExcelApp.Application.Run "procBuildPivotReport"
objExcelSheet.SaveAs "Test2.xlsm"
SET objExcelSheet = NOTHING
SET objExcelApp = NOTHING
我的 VBA:
Sub procBuildPivotReport()
Dim wb As Workbook
Set wb = ThisWorkbook
Dim ws as Worksheet
Set ws as ActiveSheet
Dim pvtCache as PivotCache
Dim pvt as PivotTable
Set pvtCache = wb.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=Sheets("QV Data").Range("A1:D10"), Version:=6)
Set pvt = ws.PivotTables.Add(PivotCache, TableDestination:=Range("J1"), TableName:= "Sales Analysis")
With pvt
.PivotFields("Project ID").Orientation = xlRowField
.PivotFields("Name").Orientation = xlColumnField
.PivotFields("Hours").Orientation = xlDataField
Emd With
End Sub
VBA 独立工作(直接在 Excel 中调用时),VBScript 用于发送数据和调用 Excel 宏
问题出现在我尝试将两者结合并构建数据透视表时。
【问题讨论】:
-
猜测,但this 可能会有所帮助。
-
试试
objExcelApp.Application.Run "'" & excelPath & "'!procBuildPivotReport"。如果 Sub 需要参数,它们可以在逗号后面... 将objExcelApp.Workbooks.Open "Test.xlsm"替换为objExcelApp.Workbooks.Open excelPath。excelPath当然是 excel 工作簿完整路径...对objExcelSheet.SaveAs "Test2.xlsm"执行相同操作。 -
感谢@BigBen 的参考和@FaneDuru 的建议。可悲的是,这个伎俩也没有。构建数据透视表的 VBA 宏肯定会一直触发,直到调用
Set pvt..失败后,我可以打开未保存但已编辑的文件并查看数据透视表的框架。 -
您应该为
PivotCaches.Create的SourceData参数使用String。来自docs:“传递 Range 对象时,我们建议您要么使用字符串指定工作簿、工作表和单元格范围,要么设置命名范围并将名称作为字符串传递。传递 Range 对象可能会意外导致“类型不匹配”错误” -
您应该包含
Option Explicit- 这会强制您声明所有变量。
标签: excel vba vbscript pivot-table qlikview