我试图通过动力壳通过动态方式执行一些宏。我收到包含宏名称和参数的字典,需要执行它。
这是代码。
想象一下,在$ParamContent
中,我有以下变量:"Param 1"+'#'+"Param 2"+'#'+"Param 3"
$arguments = $MacroName + "'"
$ParamContent = $MacroParams.Split("{#}")
for ($i=0; $i -lt $ParamContent.count;$i++) {
#$arguments += ",'" + $ParamContent[$i] + "'"
$arguments += ",'" + $ParamContent[$i] + "'"
}
$arguments = $arguments.Substring(0,$arguments.Length-1)
write-host $arguments
$xl.run.Invoke($arguments)
实际错误如下:
System.Management.Automation.MethodInvocationException:异常 使用“ 31”参数调用“运行”:“无法运行宏 'Connections.openConnThroughParameters','RMDeriv','RMDeriv_uat','UAT'。 该宏可能在此工作簿中不可用,或者所有宏都可能是 禁用。” ---> System.Runtime.InteropServices.COMException:无法 运行宏 'Connections.openConnThroughParameters','RMDeriv','RMDeriv_uat','UAT'。 该宏可能在此工作簿中不可用,或者所有宏都可能是 禁用的。 System.Runtime.InteropServices.COMException:无法运行 宏'Connections.openConnThroughParameters','Param 1','Param 2','Param 3'。该宏可能不在此工作簿中或所有 宏可能已禁用
答案 0 :(得分:0)
您用于引用参数的代码不正确,因为它在宏名称本身上省略了第一个引号字符。此外,除非您的宏可以将以字符串形式给出的这些值转换回数字类型,否则无需用引号引起来。
也许使用小的辅助函数进行引用可能会有所帮助:
function Quote-Param([object[]]$param) {
# helper function to return given parameter(s) quoted unless they are numeric
[decimal]$number = 0
foreach ($p in $param) {
if ([decimal]::TryParse($p, [ref]$number)) { $p } else { ('"{0}"' -f $p) }
}
}
$MacroParams = "Param 1#Param 2#Param 3#123#blah#456.789"
$MacroName = 'MyMacro'
$arguments = @(Quote-Param $MacroName) # force as array for the first argument
$arguments += Quote-Param $MacroParams.Split("#")
$arguments = $arguments -join ','
Write-Host $arguments -ForegroundColor Yellow
这将返回一个$arguments
字符串:
"MyMacro","Param 1","Param 2","Param 3",123,"blah",123456.789
修改
您的代码未显示您可能如何使用$xl
创建$xl = New-Object -ComObject Excel.Application
对象。
创建对象后,您可以设置一些属性,例如$xl.Visible = $false
。您还可以设置一个属性,该属性允许运行宏或不运行AutomationSecurity
。
要启用宏:
$xl.AutomationSecurity = 1 # msoAutomationSecurityLow
您可以将此属性设置为以下任意值:
Constant Value Description
-------- ----- -----------
msoAutomationSecurityLow 1 Enables all macros
msoAutomationSecurityByUI 2 Uses the security setting specified in the Security dialog box
msoAutomationSecurityForceDisable 3 Disables all macros in all files opened programmatically without showing any security alerts
希望这会有所帮助