VBScript Вызов VBA Macro для построения сводной таблицы - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь сделать следующее:

  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

Проблема возникает, когда я пытаюсь объединить два и построить сводная таблица.

1 Ответ

0 голосов
/ 25 февраля 2020

VBScript:

Невозможно получить лист до открытия рабочей книги. Вам нужно захватить объект рабочей книги, чтобы позже можно было его закрыть. Добавьте имя рабочей книги к вызову .Run, чтобы убедиться, что вы попали туда, куда хотите, go. Закройте и закройте, прежде чем отпускать дескрипторы объекта.

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