Programmieren für die Einzeldokumentschnittstelle (Single Document Interface, SDI) in Excel
Überlegungen für das Programmieren für die Einzeldokumentschnittstelle in Excel.
Vergleichen von Einzeldokumentschnittstellen (SDI) und Schnittstellen für mehrere Dokumente (MDI) in Excel 2010 und Excel 2013
Eine neue Funktion in Excel 2013 stellt die Einzeldokumentschnittstelle (Single Document Interface, SDI) dar. SDI ist eine Methode für die Organisation der grafischen Benutzeroberflächenanwendungen in einzelne Fenster, die vom Fenster-Manager des Betriebssystems getrennt gehandhabt werden. Jedes Excel-Fenster kann in Excel 2013 nur eine Arbeitsmappe enthalten und hat eine eigene Menüband-Benutzeroberfläche (Abbildung 1). Standardmäßig wird beim Öffnen einer neuen Arbeitsmappe diese in einem neuen Excel-Fenster angezeigt, selbst bei gleicher Excel-Instanz.
Abbildung 1: Einzeldokumentschnittstelle in Excel 2013
Diese steht im Gegensatz zur Schnittstelle mit mehreren Dokumenten (Multiple Document Interface, MDI), in der ein einzelnes übergeordnetes Fenster mehrere geschachtelte untergeordnete Fenster enthält, wobei nur das übergeordnete Fenster über ein Menü oder eine Symbolleiste verfügt. Jede Arbeitsmappe in einer Instanz von Excel verwendet in Excel 2010 eine gemeinsame Menüband-Benutzeroberfläche (Abbildung 2).
Abbildung 2: Schnittstelle mit mehreren Dokumenten in Excel 2010
Excel 2010 verwendet MDI. Dies bedeutet, dass es ein einzelnes Fenster auf Anwendungsebene mit allen Arbeitsmappen gibt, die in einer bestimmten Instanz von Excel geöffnet sind. Die Fenster der Arbeitsmappe können innerhalb des Excel-App-Fensters angeordnet werden, wobei alle die gleiche Menüband-Benutzeroberfläche verwenden. SDI in Excel bedeutet, dass jede Arbeitsmappe über ein eigenes App-Fenster der obersten Ebene und eine eigene entsprechende Menüband-Benutzeroberfläche verfügt.
Hinweis
Es gibt keine MDI-Kompatibilitätsoption in Excel.
In Systemen mit zwei Monitoren können mit der SDI in Excel zwei Arbeitsmappen nebeneinander verglichen werden, indem Sie jede Arbeitsmappe auf einen anderen Monitor ziehen. Jede Arbeitsmappe funktioniert unabhängig voneinander.
Führen Sie die folgenden Schritte durch, um SDI und MDI in Aktion zu sehen, wenn Excel 2010 und Excel 2013 zur Verfügung stehen.
So vergleichen Sie die Anzahl der Prozesse für MDI- und SDI-Schnittstellen
- Starten Sie im Windows-Startmenü Excel 2010.
- Starten Sie eine zweite Instanz von Excel. Stellen Sie sicher, dass zwei Excel-Fenster angezeigt werden.
- Wählen Sie auf der Windows-Taskleiste Task-Manager starten. Manager.
- Wählen Sie die Registerkarte Prozesse, und scrollen Sie so weit nach unten, bis zwei Excel.exe-Einträge angezeigt werden. Auf diese Weise können Sie erkennen, dass Excel standardmäßig bei jedem Öffnen eine neue Instanz öffnet (Excel mit zwei Instanzen).
- Schließen Sie die zwei Instanzen von Excel.
- Wählen Sie im Windows-Startmenü Excel 2013.
- Starten Sie eine zweite Instanz von Excel. Stellen Sie sicher, dass zwei Excel-Fenster angezeigt werden.
- Starten Sie den Task-Manager erneut.
- Scrollen Sie auf der Registerkarte Prozesse nach unten, bis Excel.exeangezeigt wird. Beachten Sie, dass die zwei Arbeitsmappen in der gleichen Instanz von Excel enthalten sind, obwohl Sie zwei Instanzen von Excel geöffnet haben.
Führen Sie die folgenden Schritte durch, um zu sehen, wie SDI und MDI innerhalb einer Instanz von Excel funktionieren.
So vergleichen Sie die Anzahl von Excel-Instanzen für MDI- und SDI-Schnittstellen
- Wählen Sie im Windows-Startmenü Excel 2010.
- Wählen Sie zum Aktivieren das Excel-Fenster, und stellen Sie sicher, dass Arbeitsmappe1 die aktuelle Arbeitsmappe ist.
- Drücken Sie zum Öffnen einer anderen Arbeitsmappe STRG+N. Stellen Sie sicher, dass Arbeitsmappe2 die aktuelle Arbeitsmappe ist.
- Minimieren Sie Arbeitsmappe2, und zeigen Sie Arbeitsmappe1 an. Beide Arbeitsmappen sind in der gleichen Instanz von Excel enthalten.
- Schließen Sie Excel.
- Wählen Sie im Windows-Startmenü Excel 2013.
- Wählen Sie zum Aktivieren das Excel-Fenster, und stellen Sie sicher, dass Arbeitsmappe1 die aktuelle Arbeitsmappe ist.
- Drücken Sie zum Öffnen einer anderen Arbeitsmappe STRG+N. Stellen Sie sicher, dass Arbeitsmappe2 in einem separaten Fenster (jedoch in der gleichen Instanz von Excel) geöffnet ist.
- Schließen Sie Excel.
Hinweis
Sie können mehrere Instanzen von Excel öffnen, indem Sie den folgenden Befehlszeilenschalter verwenden: excel.exe /x. Diese Option startet Excel in einem neuen Prozess.
In diesem Artikel wird die Implementierung der SDI in die Excel-Benutzeroberfläche und die Auswirkungen auf die Programmierbarkeit in Excel beschrieben.
Änderungen an der Benutzeroberfläche
Wenn Sie sich nach dem Öffnen einer Excel-Arbeitsmappe genau ansehen, werden die Fensterzustandsschaltflächen ( Minimieren, Maximieren und Wiederherstellen) in der oberen rechten Ecke des Menübands nicht mehr angezeigt. Abbildung 3 enthält die Fensterzustandschaltflächen, die in Excel und Excel 2007 verfügbar sind. Da die Fenster der obersten Ebene jetzt direkt mit einer einzelnen Arbeitsmappe oder Arbeitsmappenansicht verknüpft sind, ist die Benutzeroberfläche der Fensterverwaltung in Excel nicht mehr notwendig.
Abbildung 3: Benutzeroberfläche der Fensterzustandsverwaltung in Excel 2010
Zudem werden ab Excel mehrere Arbeitsmappenfenster, wie in Abbildung 4 dargestellt, nicht länger innerhalb eines einzelnen Fensters einer Excel-Instanz angezeigt.
Abbildung 4: Mehrere Arbeitsmappen in einem einzelnen Fenster einer Excel-Instanz
Neuberechnung und Formeln
Neuberechnungen in Excel sind weiterhin "global", was bedeutet, dass sie arbeitsmappenübergreifend in derselben Instanz von Excel auftreten. Formeln, die auf Arbeitsmappen verweisen, die in derselben Instanz von Excel geöffnet sind, werden gemeinsam an Berechnungen beteiligt und verwenden denselben Arbeitsmappenberechnungsmodus (automatisch, automatisch mit Ausnahme von Datentabellen und manuell).
In MDI gibt es nur eine Bearbeitungsleiste, um alle geöffneten Arbeitsmappen in dieser Instanz von Excel zu handhaben. In SDI gibt es eine Bearbeitungsleiste pro Arbeitsmappe. Beim Bearbeiten von Arbeitsmappenübergreifenden Verweisen in SDI in einer Formel wird die derzeit bearbeitete Formel, wie in Abbildung 5 dargestellt, sowohl in den Quell- als auch Zielarbeitsmappen-Bearbeitungsleisten angezeigt.
Abbildung 5: Aktualisieren von Arbeitsmappenübergreifenden Formeln
Benutzerdefinierte Aufgabenbereiche
An ein Fenster der obersten Ebene angefügte benutzerdefinierte Aufgabenbereiche in MDI sind nun an ein bestimmtes Fenster einer Arbeitsmappe in SDI angehängt. Beim Wechsel zu einer anderen Arbeitsmappe wird das Arbeitsmappenfenster aktiviert, an das nicht unbedingt der benutzerdefinierte Aufgabenbereich angefügt ist, wenn der Entwicklercode nicht speziell zum Anzeigen des benutzerdefinierten Aufgabenbereichs für diese Arbeitsmappe aktualisiert wurde.
Zusammenfassend möchten Sie als Entwickler Folgendes ausführen:
- Stellen Sie sicher, dass Sie für alle Arbeitsmappen, in denen der benutzerdefinierte Aufgabenbereich angezeigt werden soll, Code schreiben, um dies explizit zu tun.
- Sie möchten sicherstellen, dass alle benutzerdefinierten Aufgabenbereiche auf allen Instanzen explizit aktualisiert werden, wenn alle benutzerdefinierten Aufgabenbereiche den gleichen Zustand aufweisen sollen. Wenn ein Benutzer beispielsweise ein Kontrollkästchen aktiviert, soll dies auf alle benutzerdefinierten Aufgabenbereich in allen Excel-Instanzen angewendet werden.
Benutzerdefinierte Menübänder
Benutzerdefinierte Registerkarten und Steuerelemente des Menübands, die eine einzelne Menüband-Benutzeroberfläche pro Anwendungsinstanz in vorherigen Versionen von Excel vorgesehen haben, sind nun auf dem Menüband jeder Arbeitsmappe in Excel vorhanden. Während Entwickler des benutzerdefinierten Menübands in MDI sich keine Gedanken über mehrere Instanzen der Steuerelemente in verschiedenen Instanzen der Menüband-Benutzeroberfläche in Excel machen müssen, müssen Sie dieses Szenario in SDI berücksichtigen.
Wenn Sie alle Steuerelemente der Menüband-Benutzeroberfläche in geöffneten Arbeitsmappen im gleichen Zustand beibehalten möchten, müssen Sie Folgendes ausführen:
- Stellen Sie sicher, dass der Code alle Arbeitsmappenfenster durchlaufen und den Zustand der Steuerelemente aktualisieren kann.
ODER
- Lassen Sie den Zustand der Steuerelemente zwischenspeichern, sodass beim Wechsel zu einer anderen Arbeitsmappe durch den Benutzer dieses Ereignis erfasst wird und die Steuerelemente im Rahmen des Fensterwechsels aktualisiert werden.
Berücksichtigen Sie darüber hinaus den Fall, in dem Sie Code zum Hinzufügen eines benutzerdefinierten UI-Steuerelements mithilfe von Application.Commandbar
für den Zugriff auf das Menüband entwickeln. Wenn Sie zu einem späteren Zeitpunkt auf dieses Steuerelement zugreifen möchten, muss der Code die Tatsache berücksichtigen, dass die aktive Arbeitsmappe möglicherweise von der Arbeitsmappe abweicht, als das Steuerelement hinzugefügt wurde.
Überlegungen für VBA-Code
Mit der Umstellung auf SDI bleiben alle Fenstermethoden, Ereignisse und Eigenschaften von Excel auf Anwendungsebene nicht betroffen und funktionieren wie in früheren Excel-Versionen (z Application.ActiveWindow
. B. , Application.Windows
usw.).
In Excel arbeiten alle Fenstermethoden, Ereignisse und Eigenschaften auf Arbeitsmappenebene jetzt im Fenster der obersten Ebene (z. B. wird das Workbook.WindowActivate
Ereignis weiterhin ausgelöst, wenn Sie zu einer bestimmten Arbeitsmappe wechseln, das Ereignis wird weiterhin ausgelöst, wenn die Workbook.Resize
Größe dieser Arbeitsmappe geändert wird, und ThisWorkbook.Windows(1).Height
, ThisWorkbook.Windows(1).Width
, ThisWorkbook.Windows(1).Left
ThisWorkbook.Windows(1).Right
, , ThisWorkbook.Windows(1).Minimize
uswThisWorkbook.Windows(1).Maximize
. werden im Fenster der obersten Ebene für die aktive Arbeitsmappe ausgeführt).
Sonderfälle werden in der folgenden Tabelle aufgeführt.
Tabelle 1. Objektverhaltensmodell mit der SDI
Funktion | Beschreibung | SDI-Auswirkungen |
---|---|---|
Application.Visible |
Gibt einen Boolean-Wert zurück, der bestimmt, ob das Objekt sichtbar ist, oder legt diesen Wert fest. Lese-/Schreibzugriff. | Wenn alle Fenster ausgeblendet sind:
|
Application.ShowWindowsInTaskbar |
True, wenn eine separate Schaltfläche der Windows-Taskleiste für jede geöffnete Arbeitsmappe vorhanden ist. Der Standardwert ist True. Boolescher Wert mit Lese-/Schreibzugriff. | Diese Einstellung ist in Excel veraltet. |
Application.Caption |
Gibt einen String-Wert zurück, der den auf der Titelleiste des Hauptfensters von Microsoft Excel angezeigten Namen darstellt, oder legt diesen Wert fest. | Aktualisiert alle Fenster für die betreffende Instanz von Excel. |
Application.Hwnd |
Gibt einen Long-Wert zurück, der die Zugriffsnummer des Fensters auf der obersten Ebene des Microsoft Excel-Fensters anzeigt. Schreibgeschützt. | Gibt das aktive Fensterhandle zurück. |
Application.FormulaBarHeight |
Ermöglicht dem Benutzer, die Höhe der Bearbeitungsleiste in Zeilen anzugeben. Long mit Lese-/Schreibzugriff. | Wird nur auf das aktive Arbeitsmappenfenster angewendet, und nicht auf alle Fenster für diese Instanz von Excel. |
Application.DisplayFormulaBar |
True, wenn die Bearbeitungsleiste angezeigt wird. Lese-/Schreibzugriff - Boolean. | Wird auf alle Fenster für diese Instanz von Excel angewendet. |
Workbook.Windows |
Gibt eine Windows-Auflistung zurück, die alle Fenster in der angegebenen Arbeitsmappe darstellt. Schreibgeschütztes Windows-Objekt. | Keine Änderungen im Verhalten. Gibt die Fensterauflistung für diese Arbeitsmappe wie Aufgabenbereiche, zusätzliche Ansichten zurück. |
Workbook.WindowResize |
Tritt auf, wenn die Größe des Arbeitsmappenfensters geändert wird. | Keine Änderungen im Verhalten. Wird ausgelöst, wenn ein Arbeitsmappenfenster (der obersten Ebene) geändert wird. |
Window.Caption |
Gibt einen Variant-Wert zurück, der den Namen darstellt, der in der Titelleiste des Dokumentfensters angezeigt wird, oder legt diesen wert fest. | Keine Änderungen im Verhalten. |
Workbook.Protect(Password, Structure, Windows) |
Schützt eine Arbeitsmappe, sodass sie nicht geändert werden kann. | Der Fensterstrukturschutz wird unabhängig vom Wert des Windows-Parameters (True oder False) NICHT aktiviert. Wenn True angegeben ist, wird kein Laufzeitfehler angezeigt, aber dieser Teil des Prozeduraufrufs gibt ein NO-OP zurück. |
Hinweis
Es sind keine Änderungen am benutzerdefinierten Code erforderlich, sodass XML-Befehle weiterhin wie erwartet in SDI in Excel funktionieren.
Veraltete Windows-Option „Arbeitsmappe schützen“
In SDI verfügt jede Arbeitsmappe über ein Fenster auf oberster Ebene, das wiederhergestellt, minimiert und geschlossen werden kann. Sie werden feststellen, dass dieses Fenster auf oberster Ebene nicht verschoben, geschlossen und seine Größe nicht geändert werden kann, und dass die Windows-Option „Arbeitsmappe schützen" in Excel nicht mehr verfügbar ist (Abbildung 6). In Tabelle 2 wird diese Aktion detaillierter beschrieben.
Abbildung 6 Windows-Option des Dialogfelds „Arbeitsmappe schützen“ ist deaktiviert
Aktion | Verhalten |
---|---|
Öffnen einer Arbeitsmappe, die in einer früheren Version von Excel mit aktiviertem Fensterschutz erstellt wurde | Excel erkennt die Attribute zu Fensterspeicherort und -größe, der Benutzer wird jedoch nicht daran gehindert, diese Fenster anzuordnen oder zu schließen. |
Anzeigen des Dialogfelds Struktur und Fenster schützen | Excel zeigt das Dialogfeld an, aber die Option Windows ist deaktiviert. |
Lösungen für SDI-Probleme
Der folgende Abschnitt enthält Problemumgehungen für Probleme, die beim Verwenden der SDI auftreten können.
Eine Arbeitsmappe kann nicht durch Klicken auf die rote Schaltfläche "X" Schließen geschlossen werden, wenn diese Arbeitsmappe programmgesteuert über ein modales Benutzerformular geöffnet wird. Problemumgehung: Fügen Sie den folgenden Code zur Layout-Ereignisprozedur des Benutzerformulars hinzu, und öffnen Sie das Benutzerformular dann ohne Modus.
Private Sub UserForm_Layout() Static fSetModal As Boolean If fSetModal = False Then fSetModal = True Me.Hide Me.Show 1 End If End Sub
Eine andere Möglichkeit zur Problemumgehung: Öffnen Sie das Arbeitsmappenfenster, aktiveren Sie ein anderes Fenster, und aktivieren Sie dann das Arbeitsmappenfenster erneut. Sie müssten nun in der Lage sein, die Arbeitsmappe mithilfe der Schaltfläche Schließen schließen zu können.
Angenommen, Ihr VBA-Code öffnet mehrere Arbeitsmappen und verwendet die DataEntryMode-Eigenschaft , um die Dateneingabe und das Schließen von Arbeitsmappen zu steuern. Da im Excel-SDI-Modell jede Arbeitsmappe in einem eigenen Prozess enthalten ist, erkennt die dataEntryMode-Eigenschaft , die in einer Arbeitsmappe verwendet wird, das Vorhandensein einer anderen Arbeitsmappe nicht und hat daher wenig bis gar keine Auswirkung auf deren Interaktion. Um dieses Problem zu umgehen, gibt es eine Reihe von Optionen. Sie können die zusätzlichen Arbeitsmappen oder Arbeitsblätter mit
Window.Visible = False
bzwSheet.Visible = False
. ausblenden. Erkennen und abbrechen sie schließende Ereignisse mithilfeWorkbook.BeforeClose(Cancel) = True
von .Zu Excel-Arbeitsmappen über Befehlsleistencode hinzugefügte Symbolleisten werden nicht angezeigt, bis die Arbeitsmappe geschlossen und erneut geöffnet wird. Das Verwenden von Befehlsleisten zum Anpassen der Benutzeroberfläche ist seit Excel 2007 veraltet. Die optimale Lösung besteht darin, die Menüband-Benutzeroberfläche mithilfe von XML-Dateien, wie im Artikel Customizing the 2007 Office Fluent Ribbon for Developers beschrieben, anzupassen.
Eine weitere Möglichkeit besteht darin, ein Ereignis auf Anwendungsebene zu verwenden, um das Öffnen neuer Arbeitsmappen zu erkennen und dann anstelle von Arbeitsmappen zum Hinzufügen des Menüband-Steuerelements zu verwenden
Application.Windows
. Dazu können Sie den folgenden Beispielcode verwenden.Private Sub Workbook_Open() ToolBarsAdd End Sub Sub ToolBarsAdd() Dim oBar As CommandBar ToolBarsDelete Set oBar = Application.CommandBars.Add(Name:="MyToolBar") ' With oBar With .Controls.Add(Type:=msoControlButton) .OnAction = "SayHello" .FaceId = 800 End With End With oBar.Visible = True End Sub Sub SayHello() MsgBox "Hello from '" & ActiveWorkbook.Name & "'" End Sub
Der folgende Code wird dann verwendet, um die Symbolleiste zu entfernen, bevor die Arbeitsmappe geschlossen wird.
Private Sub Workbook_BeforeClose(Cancel As Boolean) ToolBarsDelete End Sub Sub ToolBarsDelete() Dim wnd As Window On Error Resume Next For Each wnd In Application.Windows wnd.Activate Application.CommandBars("MyToolBar ").Delete Next wnd End Sub
In Excel 2010 wird ein modusloses Benutzerformular standardmäßig als Fenster der obersten Ebene über allen Excel-Fenstern angezeigt. In Excel 2013 wird ein Benutzerformular ohne Status nur oberhalb des Arbeitsmappenfensters angezeigt, das aktiv war, als das Benutzerformular angezeigt wurde. Excel Most Valuable Professional (MVP) Jan Karel Pieterse bietet eine Erläuterung des Problems und eine Lösung auf seiner Webseite unter https://www.jkp-ads.com/articles/keepuserformontop.asp.
Zusammenfassung
Die neue Benutzeroberfläche für einzelne Dokumente in Excel 2013 erleichtert das Arbeiten mit mehreren Arbeitsmappen. Sie können die Arbeitsmappen sogar auf verschiedene Monitore ziehen. Sie müssen nur daran denken, dass es nur ein Fenster der obersten Ebene und ein Menü des Menübands für die Benutzeroberfläche pro Arbeitsmappe gibt. Dies kann es erfordern, dass Sie vorhandenen Code aktualisieren, um den Status von Steuerelementen und Einstellungen zwischenzuspeichern, wenn Sie von Arbeitsmappe zu Arbeitsmappe wechseln.
Siehe auch
- Öffnen sie Excel-Arbeitsmappen in separaten Fenstern, und zeigen Sie sie nebeneinander an.
- Einzeldokumentschnittstelle (SDI) in Excel 2013: Erneutes Erstellen der Aufgabenbereiche zur Unterstützung dieser
Support und Feedback
Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für