Вызов функций VBA с переменным числом параметров из Powershell - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь создать скрипт Powershell, который может вызывать любой макрос Excel.Это работает, если я знаю количество параметров заранее.Если я пытаюсь сделать это универсальным, используя все 30 параметров метода Microsoft.Office.Interop.Excel.Application.Run , я сталкиваюсь со следующим сообщением об ошибке: Исключение, вызывающее «Выполнить» сАргумент (ы) «31»: «Указанное количество параметров не соответствует ожидаемому числу.»

Вот моя попытка сделать это, начиная с содержимого файла .ps1:

param (
    [Parameter()][ValidateNotNullOrEmpty()][string]$excel_file_location,
    [Parameter()][ValidateNotNullOrEmpty()][string]$macro_name,
    [Parameter()][object[]]$macro_parameters
)

$par = (,$null) * 30

if($macro_parameters) {
    for ($i = 0; $i -lt $macro_parameters.Count -and $i -lt $par.Count; $i++) {
        $par[$i] = $macro_parameters[$i]
    }
}

$excel_app = New-Object -ComObject Excel.Application
$excel_app.Workbooks.Open($excel_file_location)
$excel_app.Run($macro_name, $par[0], $par[1], $par[2], $par[3], $par[4], $par[5], $par[6], $par[7], $par[8], $par[9], $par[10], $par[11], $par[12], $par[13], $par[14], $par[15], $par[16], $par[17], $par[18], $par[19], $par[20], $par[21], $par[22], $par[23], $par[24], $par[25], $par[26], $par[27], $par[28], $par[29])
$excel_app.Quit()

Файл Excel VBA для тестирования представляет собой пустой файл Excel 2016.xlsm с этим макросом:

Sub DoTheThing(x As String)
    Cells.Select
    Selection.Style = "Good"
    Range("A1").Select
    ActiveCell.FormulaR1C1 = x
    ActiveWorkbook.SaveAs Filename:="C:\Temp\macrotest2.xlsm", _
        FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End Sub

Команда, которая приводит к ошибке (где ExecuteExcelVBA.ps1 и macrotest.xlsm - это описанные выше файлы):

ExecuteExcelVBA.ps1 macrotest.xlsm DoTheThing (,"A1 value")

Если я изменю строку $ excel_app.Run, чтобы удалить все параметры после $par[0], она будет работать.

Могу ли я изменить свой $Значения массива равны некоторым значениям по умолчанию, при которых Excel будет игнорировать эти параметры?

Также приветствуются комментарии по неэффективности.

1 Ответ

2 голосов
/ 14 мая 2019

Вы можете использовать комбинацию операторов -Replace и -Join для создания строки, разделенной запятой (,), используя элементы массива $macro_parameters. Полученную строку можно объединить с помощью команды вызова метода .Run(). Последняя строка ($macro_run) может быть вызвана с помощью Invoke-Expression. Обратите внимание на использование пар одинарных кавычек во время присваивания $macro_run для предотвращения расширения переменных.

param (
    [Parameter()][ValidateNotNullOrEmpty()][string]$excel_file_location,
    [Parameter()][ValidateNotNullOrEmpty()][string]$macro_name,
    [Parameter()][object[]]$macro_parameters
)
$par = $macro_parameters -replace ".*",'''$&' -join ", "

$excel_app = New-Object -ComObject Excel.Application
$excel_app.Workbooks.Open($excel_file_location)
$macro_run = '$excel_app.Run($macro_name, ' + $par + ')'
Invoke-Expression $macro_run
$excel_app.Quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...