auf laufende Excel-Instanz zugreifen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von russi.

    auf laufende Excel-Instanz zugreifen

    Hallo zusammen!

    Dies vorab, um Ärger zu vermeiden: Ich habe meine Frage bereits am 05.08. hier clever-forum.de/read.php?59,250339,250339#msg-250339 gestellt, allerdings keine Antwort erhalten. Da ich diesen Beitrag nun geschlossen habe hoffe ich, vom Vorwurf des Crosspostings freigesprochen zu werden.

    Bin VB-Anfänger und hoffe, Ihr könnt mir helfen. Ich will per VB auf eine laufende Excel-Anwendung zugreifen. Soweit kein Problem:

    VB.NET-Quellcode

    1. ...
    2. Dim xlApp As Excel.Application
    3. Dim xlWS As Excel.Worksheet
    4. xlApp = CType(GetObject(, "Excel.Application"), Excel.Application)
    5. xlWB = xlApp.ActiveWorkbook
    6. ...


    GetObject greift ich immer auf die zuerst gestartete Excel-Instanz zu.

    Für den Fall, dass mehrere Excel-Instanzen laufen, würde ich dem Nutzer gerne die Auswahl der richtigen Instanz (anhand ActiveWorkbook.Name) überlassen, um Fehlfunktionen zu verhindern.

    Immerhin habe ich inzwischen einen Code gefunden, laufende Prozesse nach Namen zu identifizieren und ich kann den Namen der Titelleiste ermitteln:

    VB.NET-Quellcode

    1. Sub XLGetProcessList()
    2. Dim pList() As System.Diagnostics.Process = System.Diagnostics.Process.GetProcesses()
    3. For Each proc As System.Diagnostics.Process In pList
    4. Debug.Print(proc.ProcessName)
    5. If proc.ProcessName = "EXCEL" Then
    6. Debug.Print("Excel gefunden")
    7. Debug.Print(proc.MainWindowTitle)
    8. End If
    9. Next
    10. End Sub



    So weit, so gut - einen Auswahl-Dialog zu erstellen, kriege ich sicher alleine hin. Aber wie schaffe ich es, den identifizierten Prozess an meine Variable xlApp zu übergeben?

    Bin für jeden Ratschlag dankbar!

    Viele Grüße

    russi
    Hallo, ErfinderDesRades!

    Danke für Deine Antwort! Um die Workbooks geht es mir nicht, es soll immer auf das ActiveWorkbook zugegriffen werden.

    Hat der Nutzer Excel mehrmals geöffnet (es gibt davon einige Nutzer, die das gerne tun...), benötige ich eine Entscheidung im Sinne von:

    Möchtest Du auf
    Excel1 (ActiveWorkbook = Mappe1.xls) oder auf
    Excel2 (ActiveWorkbook = Bericht.xls) zugreifen?

    Da ich per xlApp = CType(GetObject(, "Excel.Application"), Excel.Application) immer nur die zuerst gestartete Excel-Instanz kriege, ist diese Auswahl so nicht möglich.

    Hast Du dazu vielleicht noch einen Tipp für mich?
    Hallo nochmal!

    Ja, klar habe ich das ausprobiert. Ich kriege alle Workbooks, die in xlApp geöffnet sind.

    Nur sind die Workbooks ja gar nicht mein Problem, sondern xlApp.

    xlApp repräsentiert in meinem Code immer die erste geöffnete Excel-Instanz.

    Ein Zugriff auf eventl. weitere, aktuell laufende Instanzen ist nicht möglich. Was ich bräuchte, wäre etwas in der Art (was so nicht funktioniert, denn sonst würde ich natürlich nicht fragen):

    VB.NET-Quellcode

    1. For Each xlApp In CType(GetObject(, "Excel.Application"), Excel.Application)
    2. Next
    Ist doch leicht :)

    Nein - man sitzt ne Weile dran, aber es geht. Nun aber Spaß beiseite:

    Die Excel-Instanzen tragen sich in die so genannte Running Object Table - ROT ein. Da alle dieselbe ProgID (="Excel.Application") haben, kannst du mit GetObject aber nur die zuerst gestartete Instanz abrufen. Hier steht, dass Excel alle geöffneten Dokumente ebenfalls in der ROT registriert, und zwar mit dem Dateinamen. Also müssen wir die ROT auflisten, um an die Namen zu kommen. Dafür gibts verschiedene Möglichkeiten - ich habe diesen Code in VB konvertiert. Hier gibt es noch eine andere Möglichkeit, die ich aber nicht getestet habe. In der Auflistung findest du die Namen der aktuell geöffneten Dokumente inkl. Pfad. In den verlinkten Beispielen steht, wie du die Instanz über den so genannten Moniker abrufst (Moniker = "Namensobjekt"). Du erhälst so in VB ein System.__ComObject (As Object), was dir aber nicht weiterhilft. Dieses kannst du aber in ein Excel.Workbook-Objekt konvertieren (Verweis auf Excel setzen!) - und schon hast du deine Excel-Instanz. Warum du nach "Workbook" und nicht nach "Application" konvertieren musst, steht hier.
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ () aus folgendem Grund: Korrektur

    Hallo hal2000!

    Na klar...gaaaaanz einfach, dieser Code, nur geringfügig komplizierter als GetObject ;)

    Ich werde mal versuchen, Deine Tipps im Detail nachzuvollziehen/nachzubauen. Wird aber vermutlich ein paar Tage dauern.

    Ich danke Dir erstmal für Deine tolle Hilfe! Habe damit schon jetzt wieder was dazugelernt (-> ROT)