Co chcę zrobić:PowerShell: Usuń moduł VBA z programu Excel plik
- otworzyć pliku Excela
- Dynamiczne importowanie moduł VBA i uruchomić funkcję z modułu
- Wyjmij moduł
Więc tutaj jest mój kod 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)
(Naturalnie włączony dostęp do projektu VBA w ustawieniach Centrum zaufania programu Excel, aby móc importować moduł dynamicznie)
teraz błędu, który jest wyświetlany jest następujący:
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
ten Cała sprawa faktycznie działa, jeśli robię to w Excelu (bez powłoki powershell).
Ale o to, co się dowiedziałem już ...
Sprawdziłem przeciążenie funkcji usunięcia:
[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)
Okazało się, że rzeczywiście należy przekazać obiekt typu Microsoft.Vbe.Interop.VBComponent VBComponent
jednak moja $macro
obiekt jest typu 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)
...
... choć ac Remove
funkcji tual zwraca typ VBComponent
, podczas tego procesu automatyzacji OLE zostaje przekonwertowany na obiekt COM.
Podejrzewam, że muszę jakoś przekonwertować ten obiekt COM na rzeczywisty obiekt VBComponent, ale nigdy nie mogę go wyraźnie rzucić.
Nie mogę tego powtórzyć - Twój kod działał poprawnie z przykładowym skoroszytem i modułem. – Comintern
Czy masz zainstalowane narzędzia MS Office Developer Tools? – Comintern
@Comintern Hmm, nie jestem tego świadomy. W dodawaniu/usuwaniu programów i funkcji (panel ctrl) nie widzę czegoś takiego. Jakieś inne miejsce, w którym mógłbym to sprawdzić? – ThomasMX