EXCEL Spreadsheet in eigener Instanz starten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    EXCEL Spreadsheet in eigener Instanz starten

    Hi,

    ihr kennt sicher das Problem: Wenn man im EXCEL eine Datei geöffnet hat und nun eine zweite .xlsx Datei öffnet, dann wird (im Gegensatz etwa zu WORD) keine neue EXCEL Instanz gebildet, sondern das Spreadsheet wird in der gleichen Instanz als neues Fenster geöffnet. Dieses Verhalten ist nicht nur blöde, das ist sogar saublöde - denn oft würde man zwei EXCEL Dateien nebeneinander stellen wollen ... oder sie auf einem zweiten Monitor anzeigen wollen.

    Das Netz ist voll von Hinweisen, wie man das umgehen kann ... im Wesentlichen sind das drei Techniken:

    1. man kann selbst eine zweite Instanz von EXCEL starten (etwa über die Taskleiste) und dann das Dokument in diesem Fenster öffen. Das ist ziemlich umständlich in der Handhabung.

    2. man kann ein .vbs Skript in den SentTo Ordner einstellen und die Datei dann über das Kontext Menu öffnen. Auch das ist in manchen Fällen ganz schon unkomfortabel.

    3. man kann für alle EXCEL Dateitypen bestimmte Registry Einträge ändern. Das ist für mich leider auch keine geeignete Lösung, weil ich ersten oft auf Rechnern arbeite, die mir nicht "gehören" ... und zweitens werden die Einstellungen bei einem Windows Update möglicherweise wieder überschrieben. Ich habe aber keine Lust die Einstellungen (etwa mit Import Registry) ständig wieder herzustellen oder gar von Hand einzugeben.

    Ich frage mich jetzt, ob ich für meine Bedürfnisse das Problem mit VB in den Griff bekommen kann.

    Wenn EXCEL bereits aktiv ist und man ein EXCEL Dokument mit Process.Start(...) öffnet, dann wird wie schon beschrieben keine neue Instanz erstellt. Kann man das erzwingen? Mit anderen Worten, gibt es eine Möglichkeit unter VB eine neue Instanz von EXCEL zu erstellen und dann gleich das .xlsx Dokument darin zu öffnen?

    Ich hoffe, ich habe mein Anliegen verständlich machen können.

    LG
    Peter
    Geht auch anders:

    VB.NET-Quellcode

    1. Dim MyTable As String = "Pfad_zur_Excel_Tabelle.xlsx"
    2. If File.Exists(MyTable) Then
    3. Dim StartInfoArgument As String = """" + MyTable + """"
    4. Dim excelProcess As New Process()
    5. excelProcess.StartInfo.FileName = "excel.exe"
    6. excelProcess.StartInfo.Arguments = StartInfoArgument
    7. excelProcess.Start()
    8. End If


    (Editiert, weil Fehler beim Code isolieren für Teleric Konverter gemacht)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dksksm“ ()

    @Peter329 Excel ist ein MDI, wo Du im MainForm beide Child-Fenster anordnen kannst wie Du willst:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dksksm schrieb:

    Dim StartInfoArgument As String = """" + MyTable + """"
    Wenn du nicht /x mit angibst, bekommst du eventuell auch da keine neue Instanz.

    RodFromGermany schrieb:

    Excel ist ein MDI
    Rein für den Datenvergleich ist das brauchbar.
    Allerdings teilen sich die beiden Workbooks das Application-Objekt, in dem z.B. die Berechnungen ablaufen.
    Während eine Arbeitsmappe rechnet oder VBA-Code ausführt, sind beide blockiert.
    Es kann sogar passieren, dass auch die gar nicht betroffenen Arbeitsmappen neu kalkuliert werden.
    Bei formelreichen (rechenintensiven) Spreadsheets kann das extrem lästig sein.
    In solchen Fällen mach es mehr Sinn, getrennte Instanzen zu haben.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod OK, ich hab solch immer nur zur Anzeige von Messreihen verwendet, und das manuell angestoßen, da war nicht viel zu rechnen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    petaod schrieb:

    Dksksm schrieb:

    Dim StartInfoArgument As String = """" + MyTable + """"
    Wenn du nicht /x mit angibst, bekommst du eventuell auch da keine neue Instanz.


    Das habe ich allerdings seit Jahren nocht nicht erlebt. Auch nicht diejenigen, die mein Programm in der Firma nutzen.
    Ich habe extra einen Schalter um diese instanzierte Version aufzurufen, hat noch nie Probleme gegeben.
    Ich glaube, wenn das Zeug auf einem normalen Desktop läuft, passiert nichts.
    Aber wenn das Excel als virtualisierte Anwendung in einer Sandbox läuft, kann es solche Effekte geben.
    Ich erinnere mich nicht mehr genau an die Umstände, aber seit mein Kollege mal ziemlich lange Fehler suchte, mache ich es einfach rein.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi,

    oh, ich hatte gar nicht mehr damit gerechnet, auf meine Frage Antworten zu bekommen. Vielen Dank erst mal.

    Die Sache mit dem Command Line Switch funktioniert bei mir nicht, weil ich noch Office 2010 fahre ... der Switch geht erst ab Office 2013.

    Das mit dem MIDI Child ist für mich schon deshalb keine Lösung, weil meine Spreadsheets recht komplex sind und ich sie deshalb gerne auf zwei Monitoren darstelle.

    Aber die Lösung meines Problems ist tatsächlich viel einfacher, wie auch in den Beiträgen vermerkt wurde: man darf ganz einfach nicht über den Dateityp gehen, sondern muss explizit EXCEL.EXE starten und den Dateipfad als Parameter mit geben. Und schon funktioniert die Sache.

    Damit klappt die Sache dann auch problemlos unter meiner Sandbox ...

    Vielen Dank an alle Ratgeber!
    LG
    Peter