我想要做什么:的PowerShell:删除从Excel VBA模块文件
- 打开一个Excel文件
- 动态导入VBA模块和模块
- 运行功能移除模块
因此,这里是我的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)
(当然,我能访问VBA项目的Excel中的信任中心设置,以便能够导入动态模块)
现在的错误,我得到的是以下几点:
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)中这样做。
但这里是我发现了什么已经...
我查了删除功能的过载:
[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)
原来,我其实应该通过Microsoft.Vbe.Interop.VBComponent VBComponent
类型的对象,但我$macro
对象的类型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
功能AC在这个OLE自动化过程中,它会返回一个类型VBComponent
,它将转换为一个COM对象。
我只是怀疑我必须以某种方式将此COM对象转换为实际的VBComponent对象,我怎么也不能明确地强制转换它。
我不能复制这个 - 你的代码在样本工作簿和模块中工作得很好。 – Comintern
您是否安装了MS Office Developer Tools? – Comintern
@Comintern嗯,我不知道这一点。在添加/删除程序和功能(ctrl面板),我没有看到这样的事情。任何其他我可以验证的地方? – ThomasMX