PowerShell:从excel文件中删除VBA模块

我想做的事:

  • 打开一个excel文件
  • dynamic导入VBA模块并从模块运行一个function
  • 卸下模块

所以这是我的PowerShell代码:

$excel = New-Object -ComObject Excel.Application $excel.Workbooks.Open($filepath) | Out-Null $macro = $excel.ActiveWorkbook.VBProject.VBComponents.Import($MacroFilepath) $Excel.ActiveWorkbook.Application.Run("HoursSumCounter.main") | Out-Null $excel.ActiveWorkbook.VBProject.VBComponents.Remove($macro) 

(自然,我启用访问Excel的信任中心设置中的VBA项目,以便能够dynamic地导入模块)

现在我得到的错误是:

 Cannot find an overload for "Remove" and the argument count: "1". At line:1 char:1 + $excel.ActiveWorkbook.VBProject.VBComponents.Remove($macro) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodException + FullyQualifiedErrorId : MethodCountCouldNotFindBest 

这整个事情实际上是如果我在Excel(无PowerShell)中这样做。

但这是我发现的…

我检查了删除function的重载:

 [DBG]: PS C:\Users\MUT2BP\Desktop\recefice>> $excel.ActiveWorkbook.VBProject.VBComponents.Remove OverloadDefinitions ------------------- void Remove(Microsoft.Vbe.Interop.VBComponent VBComponent) void _VBComponents.Remove(Microsoft.Vbe.Interop.VBComponent VBComponent) void _VBComponents_Old.Remove(Microsoft.Vbe.Interop.VBComponent VBComponent) 

事实certificate,我实际上应该传递一个Microsoft.Vbe.Interop.VBComponent VBComponenttypes的对象,但是我的$macro对象的types是System.__ComObject#{eee00921-e393-11d1-bb03-00c04fb6c4a6}

 [DBG]: PS C:\Users\MUT2BP\Desktop\recefice>> $macro | Get-Member TypeName: System.__ComObject#{eee00921-e393-11d1-bb03-00c04fb6c4a6} Name MemberType Definition ---- ---------- ---------- Activate Method void Activate () DesignerWindow Method Window DesignerWindow () Export Method void Export (string) ... 

即使Remove函数实际上返回一个VBComponent的types,在这个OLE自动化过程中它被转换成一个COM对象。

我只是怀疑我必须以某种方式将此COM对象转换为实际的VBComponent对象,我怎么也不能明确地强制转换它。

有没有一个原因,你不能简单地引用适当的模块? excel不需要附加模块。 加载项和个人工作簿中的模块可以在任何表单上运行。

如果你创build一个加载项(保存为_加载项,然后在开发者工具下单击该框将其打开),您可以使用任何你想要的模块随时更新它。

如果您没有权限访问开发人员工具选项卡,则可以将模块添加到您的个人工作簿(这是隐藏的工作簿,可以在您首次使用loggingmacrosbutton时自动生成)

通过做任何上述你可以打开一个Excel文件,运行它的代码,然后closures文件没有麻烦尝试以编程方式添加模块到不支持模块的派克。

如果你绝对要附加和删除模块,试试这个:打开文件,转换为xlsb格式,closures文件,重命名文件为.zip,添加模块并更新.zip里面的xmlpath,重命名为.xlsb,在excel中打开,运行模块,保存为不支持模块的文件。

不得不近期做类似的事情,这是我做的。

 $Code = @' your code here Make sure this guy is public @' $Excel = new-object -com Excel.Application #Need to change security settings New-ItemProperty -Path ` "HKCU:\Software\Microsoft\Office\$($Excel.Version)\excel\Security" -Name ` AccessVBOM -Value 1 -Force | Out-Null New-ItemProperty -Path ` "HKCU:\Software\Microsoft\Office\$($Excel.Version)\excel\Security" -Name ` VBAWarnings -Value 1 -Force | Out-Null $Workbook = $Excel.Workbooks.open("Insert Path to file here",$true) $xlModule = $Workbook.VBProject.VBComponents.Add(1) $Module = $xlmodule.CodeModule.AddFromString($Code) $Excel.Run("Name of Module here, make sure that the sub is public") $Workbook.VBProject.VBComponents.Remove($xlmodule) $Workbook.Close($True)