Datei Was ich tun möchte:Powershell: Entfernen Sie VBA-Modul aus Excel
- öffnen eine Excel
- dynamisch importieren ein VBA-Modul-Datei und eine Funktion aus dem Modul
- Entfernen Sie das Modul laufen
So, hier ist mein Powershell-Code:
$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)
(natürlich aktiviert ich das VBA-Projekt in den Trust-Center-Einstellungen von Excel, um den Zugriff zu können, ein Modul dynamisch importieren)
nun die Fehler, die ich erhalten, ist die folgende:
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
Diese Die ganze Sache funktioniert tatsächlich, wenn ich das in Excel mache (keine Powershell).
Aber hier ist das, was ich bereits herausgefunden, ...
ich die Überlastung der Remove-Funktion überprüft:
[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)
Es stellte sich heraus, dass ich tatsächlich Microsoft.Vbe.Interop.VBComponent VBComponent
jedoch ein Objekt vom Typ passieren mein $macro
Objekt ist vom Typ 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)
...
... Auch wenn die Remove
Funktion ac Gibt einen Typ von VBComponent
zurück, während dieses OLE-Automatisierungsprozesses wird es in ein COM-Objekt konvertiert.
Ich vermute nur, dass ich irgendwie dieses COM-Objekt in ein virtuelles VBComponent-Objekt konvertieren muss, wie auch immer ich es nicht explizit umsetzen kann.
Ich kann das nicht replizieren - Ihr Code funktionierte gut mit einem Beispiel Arbeitsmappe und Modul. – Comintern
Haben Sie die MS Office Developer Tools installiert? – Comintern
@Comintern Hm, das ist mir nicht bekannt. In den Add/Remove-Programmen und -Features (Ctrl-Panel) sehe ich nichts dergleichen. Irgendein anderer Ort, wo ich das überprüfen könnte? – ThomasMX