我想要做什麼:的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