excel - 从 Powershell 调用具有不同参数计数的 VBA 函数

标签 excel vba powershell com

我正在尝试制作一个可以调用任何 Excel 宏的 Powershell 脚本。只要我事先知道参数的数量,这就行得通。如果我尝试通过使用全部 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] 之后的所有参数, 有用。

我可以将我的 $par 数组值更改为某个默认值,让 Excel 忽略这些参数吗?

也欢迎对低效率发表评论。

最佳答案

您可以使用 -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()

关于excel - 从 Powershell 调用具有不同参数计数的 VBA 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56130306/

相关文章:

windows - PowerShell 在命令提示符问题中, 'Format-Table' 未被识别为内部或外部命令、可运行程序或批处理文件

string - 无法从 cmd.exe 运行 powershell 脚本?

vba - Excel 2010 VBA : How to export the current worksheet asking user where to save?

c# - 通过 C# 设置 Excel 命名范围?

excel - 如何使用 Excel 在公式中引用值而不是公式?

excel - 在此 vba 中获取 sheet2 中的重复计数

regex -\p{L}、\p{Lu} 和\p{Ll} 的 Unicode 范围

转换表的 SQL 查询

vba - 压缩大量(不切实际的)基于循环的 VBA 代码;嵌套 For...Next 循环

windows - "rm -rf"等同于 Windows PowerShell?