2016-10-03 3 views
6

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.

+0

Ich kann das nicht replizieren - Ihr Code funktionierte gut mit einem Beispiel Arbeitsmappe und Modul. – Comintern

+0

Haben Sie die MS Office Developer Tools installiert? – Comintern

+0

@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

Antwort

0

Gibt es einen Grund, warum Sie nicht einfach auf das entsprechende Modul verweisen können? Excel erfordert keine Module angeschlossen werden. Module in Add-Ins & persönliche Arbeitsmappen können auf jedem Blatt ausgeführt werden.

Wenn Sie ein Add-In erstellen (als Add-In speichern, dann klicken Sie unter Entwickler-Tools auf das entsprechende Kontrollkästchen, um es zu aktivieren) und aktualisieren Sie es im laufenden Betrieb mit dem gewünschten Modul.

wenn Sie nicht Zugriff auf die Entwickler-Tools Registerkarte können Sie das Modul zu Ihrer persönlichen Arbeitsmappe hinzuzufügen (dies ist eine versteckte Arbeitsmappe, die automatisch generiert werden können, wenn Sie zuerst den Datensatz Makrotaste)

by doing In jedem der oben genannten Schritte können Sie eine Excel-Datei öffnen, Code darauf ausführen und dann die Datei schließen, ohne dass Sie versuchen müssen, ein Modul programmatisch zu einem Fike hinzuzufügen, das keine Module unterstützt.

Wenn Sie das Modul unbedingt anhängen und entfernen müssen, versuchen Sie Folgendes: Öffnen Sie die Datei, konvertieren Sie in das xlsb-Format, schließen Sie die Datei, benennen Sie die Datei als .zip um, fügen Sie das Modul hinzu und aktualisieren Sie den XML-Pfad in .zip, umbenennen als .xlsb , in Excel öffnen, Modul ausführen, als Datei speichern, die keine Module unterstützt.

0

musste etwas Ähnliches vor kurzem tun, dies, wie ich es tat.

$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) 
Verwandte Themen