Excel per VB.net über New Process starten und Excel-Events abfangen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von anzah.

    Excel per VB.net über New Process starten und Excel-Events abfangen

    Hallo,

    ich starte ein Vb.exe-Programm, welches mit Interop eine Excel-Instanz erstellt und deren Events abfängt (New Excel.Application). Das funktioniert auch.
    Die Instanz wird jedoch mit AddIns gestartet, was aufgrund großer AddIns eine lange Startzeit bedeutet. Bei meiner Anwendung benötige ich jedoch keine AddIns.

    Also wollte ich den Weg über einen Prozessstart gehen und der Prozessinfo den nötigen Excel-Startparameter mitgeben, sodass ohne AddIns gestartet wird.
    Ich bekomme dadurch zwar den Prozess, aber leider keinen Objektverweis zugewiesen, welcher die Bewertung der Excel-Events ermöglicht.

    Was muss ich tun, um die Instanz ohne das Interpretieren der AddIns durch Excel zu starten und dennoch einen Application-Verweis zu bekommen, um auf die Events reagieren zu können?
    Könnte ich hier mit dem MainModul des Prozesses weiterkommen?

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Gegenfrage: Was ist bei Dir konkret

    anzah schrieb:

    eine lange Startzeit
    Wäre es nicht auch möglich, Excel mit AddIns nebenläufig per Async-Await zu starten/laden und so die Ladendauer nicht direkt zu bemerken?
    Beantwortet zwar nicht Deine Process-Frage (ich glaube nicht, dass das geht, aber das soll nix heißen), könnte aber vielleicht ein gangbarer Weg sein.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    VaporiZed, danke für deine Antwort.

    Ja das könnte sicherlich ein Weg sein, wenn nicht das Starten der Office-Anwendung die erste zeitlich relevante Operation meiner Anwendung wäre.
    Man muss auch bedenken, dass man die Workbook-Open-Ereignisse anderer Excel-Mappen verarbeiten muss, wenn diese zwischenzeitlich durch den User geöffnet werden, weil zu denen ggf. die AddIns geladen sein müssen.

    Ich werde hierzu meine Lösung posten, sobald ich einen Weg gefunden habe. Gut wäre halt mit den Prozessinformationen irgendwie das Excel-Events-Objekt erstellen zu können...
    Hab was bei Microsoft gefunden:

    VB.NET-Quellcode

    1. Dim ExcelApp As Microsoft.Office.Interop.Excel.Application
    2. Diagnostics.Process.Start("C:\Program Files (x86)\Microsoft Office\root\Office16\Excel.exe") 'oder wo immer Excel bei Dir auch ist
    3. 'jetzt etwas Wartezeit einbauen, da Excel erst geladen werden muss und das Excel-Objekt nicht sofort zur Verfügung steht
    4. ExcelApp = DirectCast(System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"), Microsoft.Office.Interop.Excel.Application)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke, das ist es was ich gesucht hatte.
    Ich habe die Zuweisung in eine Schleife gepackt, um sicherzustellen, dass bei mehreren Instanzen alles klar geht:

    Quellcode

    1. 'xlApp zuweisen (max. Versuchszeit in s = tLoop):
    2. t1 = Now
    3. Do While DateDiff(DateInterval.Second, t1, Now) < tLoop
    4. Threading.Thread.Sleep(50)
    5. xlApp = DirectCast(System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"), Microsoft.Office.Interop.Excel.Application)
    6. If xlApp IsNot Nothing Then
    7. If oP.MainWindowHandle = xlApp.Hwnd Then Exit Do
    8. End If
    9. Loop

    ...zum Beitrag vor, kann ich nichts sagen.

    Die Zeile

    Quellcode

    1. If oP.MainWindowHandle = xlApp.Hwnd Then Exit Do

    funktioniert so nicht! Sie muss aber auch nicht unbedingt sein.

    Tests haben gezeigt, das Direktcasten dauert auch lange, Ausgabe:

    08.04.2025 15:38:58 - Start (Beginn des Direktcastens)
    "PE-Start.exe" (CLR v4.0.30319: PE-Start.exe): "C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_de_b77a5c561934e089\mscorlib.resources.dll" geladen. Das Modul wurde ohne Symbole erstellt.
    Ausnahme ausgelöst: "System.Runtime.InteropServices.COMException" in mscorlib.dll
    08.04.2025 15:38:58 - Error
    Ausnahme ausgelöst: "System.Runtime.InteropServices.COMException" in mscorlib.dll
    08.04.2025 15:38:59 - Error
    Ausnahme ausgelöst: "System.Runtime.InteropServices.COMException" in mscorlib.dll
    08.04.2025 15:38:59 - Error
    Ausnahme ausgelöst: "System.Runtime.InteropServices.COMException" in mscorlib.dll
    08.04.2025 15:39:00 - Error
    Ausnahme ausgelöst: "System.Runtime.InteropServices.COMException" in mscorlib.dll
    08.04.2025 15:39:01 - Error
    Ausnahme ausgelöst: "System.Runtime.InteropServices.COMException" in mscorlib.dll
    08.04.2025 15:39:01 - Error
    08.04.2025 15:39:07 - OK (hier hat xlApp die Referenz bekommen)