excel - VBScript 调用 VBA 宏来构建数据透视表
问题描述
我正在尝试执行以下操作:
- 使用 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 宏
问题似乎是当我尝试将两者结合并构建数据透视表时。
解决方案
VB脚本:
在打开工作簿之前您无法获得工作表。您需要捕获工作簿对象,以便稍后关闭它。将工作簿名称添加到.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:
集缺少“=”。使用您在数据透视表中创建的 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
推荐阅读
- android - 如何使前缀 textSize 与实际用户输入的 textSize 相同?
- vue.js - 修改子组件中的选择值后触发函数 - VueJs
- javascript - 一个有趣的 Javascript 任务
- java - Reactor Java Flux 与 Mono
- javascript - 提交后如何显示一个部分
- database - 数据库设计:如何处理空值?
- django - 在 Django/Vue 应用程序中更改公共 index.html 中的 chunk_vendors/app js 文件导入 url
- laravel - 使用一些数据过滤从日期到日期
- javascript - 如何使用 Javascript 随机化 WordPress 中的图像(高级自定义字段)
- f# - 为什么在这种情况下在 F# 中使用引用