【问题标题】:VBScript Calling VBA Macro to build Pivot TableVBScript 调用 VBA 宏来构建数据透视表
【发布时间】:2020-06-09 14:36:19
【问题描述】:

我正在尝试执行以下操作:

  1. 使用 VBScript,将 QlikView 中的数据导出到 Excel 中
  2. 使用 VBScript,触发 Excel 宏
  3. 拥有一个 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 excelPathexcelPath 当然是 excel 工作簿完整路径...对 objExcelSheet.SaveAs "Test2.xlsm" 执行相同操作。
  • 感谢@BigBen 的参考和@FaneDuru 的建议。可悲的是,这个伎俩也没有。构建数据透视表的 VBA 宏肯定会一直触发,直到调用 Set pvt.. 失败后,我可以打开未保存但已编辑的文件并查看数据透视表的框架。
  • 您应该为PivotCaches.CreateSourceData 参数使用String。来自docs:“传递 Range 对象时,我们建议您要么使用字符串指定工作簿、工作表和单元格范围,要么设置命名范围并将名称作为字符串传递。传递 Range 对象可能会意外导致“类型不匹配”错误”
  • 您应该包含Option Explicit - 这会强制您声明所有变量。

标签: excel vba vbscript pivot-table qlikview


【解决方案1】:

VBScript:

在打开工作簿之前您无法获得工作表。 您需要捕获工作簿对象,以便稍后关闭它。 将工作簿名称添加到.Run 调用以确保您到达您想去的地方。 在释放对象句柄之前关闭并退出。

workbookPath = "Test.xlsm"

Set objExcelApp = CREATEOBJECT("Excel.Application")
Set thisWorkBook = objExcelApp.Workbooks.Open workbookPath
Set objExcelSheet = thisWorkBook.Worksheets("Sheet 1")

objExcelApp.Application.Run "'" & workbookPath & "'!procBuildPivotReport"

objExcelSheet.SaveAs "Test2.xlsm"

thisWorkBook.Close False
objExcelApp.Quit
Set objExcelSheet = Nothing
Set thisWorkBook = Nothing
Set objExcelApp = Nothing

VBA:

Set 缺少“=”。使用您在数据透视表中创建的 pvtCache 对象。添加显式选项以捕获拼写错误。

Option Explicit
Sub procBuildPivotReport()

    Dim wb As Workbook
    Set wb = ThisWorkbook

    Dim ws as Worksheet
    Set ws = wb.ActiveSheet

    Dim pvtCache as PivotCache
    Set pvtCache = wb.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=Sheets("QV Data").Range("A1:D10"), Version:=6)
    Dim pvt as PivotTable
    Set pvt = ws.PivotTables.Add(pvtCache, 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

【讨论】:

  • 好吧,procBuildPivotReport 也有问题——包括Set pvt = ws.PivotTables.Add(PivotCache, TableDestination:=Range("J1"), TableName:= "Sales Analysis") 中的PivotCache :-)
  • 也许是这样,但 OP 说“独立地,VBA 工作(当直接在 Excel 中调用时)”
  • 是的 - 可能是问题中的错字。
  • 是的,抱歉问题中的错字。 @HackSlash,谢谢你的建议。我已经用代码注销了我的机器,我会在早上尝试实施你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多