Mithilfe von Visual Basic ein durch eine Office-Anwendung angezeigtes Dialogfeld schließen

Der Support für Office 2003 wurde eingestellt

Microsoft stellte am 8. April 2014 den Support für Office 2003 ein. Diese Änderung wirkt sich auf Ihre Softwareupdates und Sicherheitsoptionen aus. Erfahren Sie, was das für Sie bedeutet und wie Sie Ihren Schutz aufrechterhalten können.

Dieser Artikel wurde zuvor veröffentlicht unter D259971
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
259971 How To Dismiss a Dialog Box Displayed by an Office Application with Visual Basic
Zusammenfassung
Wenn Sie eine Office-Anwendung von Visual Basic (VB) aus automatisieren, kann durch die Office-Anwendung ein Dialogfeld angezeigt werden. Das Dialogfeld kann die Ursache dafür sein, dass die Visual Basic-Anwendung scheinbar nicht mehr reagiert (hängt), weil Visual Basic darauf wartet, dass dieses Dialogfeld geschlossen wird. Das Dialogfeld muss geschlossen werden, bevor die Visual Basic-Anwendung fortgesetzt werden kann.

In diesem Artikel wird erläutert, wie Sie die Objektmodelle für Office-Anwendungen einsetzen können, um das Anzeigen von Dialogfeldern während der Automatisierung zu vermeiden. Außerdem enthält dieser Artikel ein in einzelne Schritte unterteiltes Beispiel dafür, wie Sie eine Benutzereingabe simulieren können, um ein Dialogfeld (dessen Anzeige durch die Verwendung der üblichen Eigenschaften und Methoden in den Objektmodellen nicht vermieden werden kann) auf programmatischem Wege zu schließen.
Weitere Informationen
Es kann vorkommen, dass Sie eine Office-Anwendung automatisieren möchten, aber keinerlei Interaktion des Benutzers mit dieser Office-Anwendung erforderlich sein soll. Ist dies der Fall und zeigt die Office-Anwendung ein Dialogfeld an, scheint Ihre Anwendung nicht mehr zu reagieren, bis der Benutzer das Dialogfeld schließen kann. Vielleicht arbeitet jedoch gerade kein Benutzer an dem Computer, der das Dialogfeld schließen könnte.

Office-Anwendungen wurden nicht für eine unbeaufsichtigte Ausführung entwickelt. Aus diesem Grund trifft eine Anwendung, die Office automatisieren soll, zuweilen auf ein Dialogfeld, das durch eine Office-Anwendung angezeigt wird. Durch normales Testen der Anwendung können Sie in der Regel ermitteln, welche Dialogfelder angezeigt werden. Sie können dann einen Code schreiben, um das Anzeigen dieser spezifischen Dialogfelder zu vermeiden.

Die folgenden Strategien werden empfohlen, um das Anzeigen von Dialogfeldern bei der Automatisierung von Office-Anwendungen zu vermeiden:
  • Ermitteln Sie, ob für die Eigenschaft oder Methode, die Sie verwenden (jene, die zur Anzeige des Dialogfeldes führt), optionale Argumente existieren, die Sie auf sie übertragen könnten. In manchen Fällen können Sie das Anzeigen von Dialogfeldern vermeiden, indem Sie alle Argumente auf die Eigenschaft oder Methode übertragen. Benutzen Sie z. B. die Methode Open (Öffnen) zum Öffnen einer durch ein Kennwort geschützten Excel-Arbeitsmappe, zeigt Excel ein Dialogfeld an, das den Benutzer zur Eingabe des Kennwortes auffordert, wenn Sie beim Aufrufen der Methode Open nicht das Argument "password" (Kennwort) übergeben. Geben Sie beim Aufrufen der Methode Open einen Wert für das Argument Password an, um dieses Dialogfeld zu vermeiden. Wenn Sie analog dazu die Methode Close (Schließen) verwenden, um ein Dokument zu schließen, können Sie das Argument SaveChanges angeben, um zu vermeiden, dass ein Dialogfeld angezeigt wird, in dem der Benutzer gefragt wird, ob er seine Änderungen speichern möchte. Weitere Informationen darüber, wie Sie feststellen können, welche Argumente für die von Ihnen aufgerufenen Eigenschaften oder Methoden verfügbar sind, finden Sie in folgendem Artikel der Microsoft Knowledge Base:
    222101 Finden und Verwenden der Dokumentation zum Office-Objektmodell
  • Studieren Sie das Objektmodell für die jeweilige Office-Anwendung, um zu sehen, ob es eine Eigenschaft gibt, mit der das Anzeigen bestimmter Dialogfelder verhindert werden kann. So gibt es zum Beispiel für das Excel-Objekt Application die Eigenschaften AskToUpdateLinks und AlertBeforeOverwriting.
  • Setzen Sie die Eigenschaft Application.DisplayAlerts (in Excel, Project oder Word), oder verwenden Sie Application.DoCmd.SetWarnings False (nur in Access), um das Anzeigen von Warnmeldungen zu deaktivieren. Durch diese Einstellung können die meisten Dialogfelder (jedoch nicht alle) vermieden werden.
  • Setzen Sie die Eigenschaft Application.FeatureInstall (in Office 2000 und höher), um mögliche Dialogfelder des Typs Dieses Feature ist nicht installiert zu handhaben, die angezeigt werden können, wenn Sie auf Komponenten zugreifen möchten, die eventuell auf dem Computer des Benutzers nicht installiert sind.
  • Verwenden Sie die Anweisung On Error (Bei Fehler), um möglicherweise auftretende Laufzeitfehlermeldungen zu vermeiden (zum Beispiel die Fehlermeldung, die angezeigt wird, wenn Sie versuchen, Application.ActivePrinter zu setzen, obwohl auf dem System des Benutzers kein Druckertreiber installiert ist).
  • Testen Sie Ihre Anwendung gründlich, um besser vorhersagen zu können, wann Dialogfelder angezeigt werden können. Sie könnten zum Beispiel die Methode SaveAs einer Office-Anwendung aufrufen, um etwas in einer Datei zu speichern. Existiert diese Datei bereits, kann ein Dialogfeld angezeigt werden, in dem Sie gefragt werden, ob diese Datei ersetzt werden soll. Wenn Sie Ihren Code so modifizieren, dass vor dem Aufrufen der Methode SaveAs nach dieser Datei gesucht wird, können Sie vermeiden, dass dieses Dialogfeld erscheint. Wenn die Datei beispielsweise bereits vorhanden ist, können Sie diese durch die Anweisung Kill löschen, bevor Sie die Methode SaveAs aufrufen.
Hinweis: Selbst wenn Sie diese Techniken anwenden und Ihre Anwendung sorgfältig dafür auslegen, das Anzeigen von Dialogfeldern zu vermeiden, kann es doch Fälle geben, in denen das Anzeigen von Dialogfeldern mit den Methoden und Eigenschaften aus dem Objektmodell der jeweiligen Office-Anwendung nicht vermieden werden kann. In solchen Situationen kann es erforderlich sein, ein Dialogfeld programmatisch zu schließen, indem man eine entsprechende Eingabe durch einen Benutzer simuliert. Das folgende Beispiel demonstriert, wie Sie dies mit einem Visual Basic-Automatisierungsclient tun können.

Beispiel

Die in diesem Abschnitt beschriebenen Schritte demonstrieren die Automatisierung von Microsoft Word für das Drucken eines Dokuments. Der Automatisierungsclient ruft die Methode PrintOut für das Word-Objekt Document (Dokument) auf. Falls der Standarddrucker des Benutzers darauf konfiguriert ist, Druckaufträge an den FILE-Port zu senden, bewirkt das Aufrufen der Methode PrintOut das Anzeigen eines Dialogfeldes, in dem der Benutzer aufgefordert wird, einen Dateinamen einzugeben. Um zu ermitteln, ob die Methode PrintOut das Erscheinen dieses Dialogfeldes bewirkt, verwendet der Visual Basic-Automatisierungsclient ein Timer-Steuerelement Timer, um Leerlaufzeiten nach dem Aufrufen der Methode PrintOut zu entdecken. Bevor die Methode PrintOut aufgerufen wird, wird der Timer aktiviert und auf fünf Sekunden eingestellt. Nachdem die Ausführung der Methode PrintOut abgeschlossen ist, wird der Timer deaktiviert. Ist die Ausführung der Methode PrintOut innerhalb von fünf Sekunden abgeschlossen, tritt also nie ein Timer-Ereignis ein, und es werden keine weiteren Maßnahmen ergriffen. Das Dokument wird ausgedruckt, und die Codeausführung wird über die Methode PrintOut hinaus fortgesetzt. Tritt das Timer-Ereignis jedoch innerhalb von fünf Sekunden ein, wird davon ausgegangen, dass die Methode PrintOut noch nicht abgeschlossen ist und die Verzögerung durch ein Dialogfeld verursacht wurde, das auf die Eingabe eines Benutzers wartet. Wenn das Timer-Ereignis eintritt, setzt der Automatisierungsclient den Fokus auf Word und verwendet SendKeys, um das Dialogfeld zu schließen.

Hinweis: Zu Demonstrationszwecken wird in diesem Beispiel die Methode PrintOut in einer Weise eingesetzt, bei der sie absichtlich zum Anzeigen eines Dialogfeldes führt, wenn der Druckauftrag an einen Drucker übermittelt wird, der auf einen FILE-Port konfiguriert ist. Beachten Sie, dass für die Methode PrintOut zwei Argumente zur Verfügung stehen (OutputfileName und PrintToFile), die Sie verwenden können, um das Anzeigen dieses Dialogfeldes zu vermeiden.

Außerdem können Sie die Wartezeit bei Verwendung des Timers auf mehr oder weniger als fünf Sekunden festlegen und die Tastenberührungen anpassen, die an das Dialogfeld gesendet werden.

Zu Demonstrationszwecken werden zwei Visual Basic-Projekte eingesetzt:
  1. Eine ActiveX-EXE, die eine Timer-Klasse bereitstellt, mit der eine etwaige Verzögerung entdeckt wird. Der Grund für die Verwendung einer ActiveX-EXE für die Timer-Klasse ist, dass dabei der Timercode in einer separaten Klasse und somit in einem separaten Thread ausgeführt wird. Somit kann die Timer-Klasse während eines ausgesetzten Automatisierungsaufrufs ein Ereignis generieren.
  2. Eine Standard-EXE, mit der Word automatisiert wird und die die Methode PrintOut aufruft, um ein Dokument ausdrucken zu lassen. Dabei wird die ActiveX-EXE eingesetzt, um etwaige Verzögerungen beim Aufrufen der Methode PrintOut zu entdecken.
Erstellen des ActiveX-EXE-Projekts
  1. Starten Sie Visual Basic, und erstellen Sie ein ActiveX-EXE-Projekt. Jetzt wird standardmäßig "Class1" erstellt.
  2. Zeigen Sie im Menü Projekt auf Datei, und ändern Sie dann den Namen des Projekts in MyTimer.
  3. Kopieren Sie den folgenden Code, und fügen Sie ihn in das Modul Class1 ein:
    Option ExplicitPublic Event Timer()Private oForm1 As Form1Private Sub Class_Initialize()    Set oForm1 = New Form1    oForm1.Timer1.Enabled = FalseEnd SubPrivate Sub Class_Terminate()    Me.Enabled = False    Unload oForm1    Set oForm1 = NothingEnd SubPublic Property Get Enabled() As Boolean    Enabled = oForm1.Timer1.EnabledEnd PropertyPublic Property Let Enabled(ByVal vNewValue As Boolean)    oForm1.Timer1.Enabled = vNewValue    If vNewValue = True Then        Set oForm1.oClass1 = Me    Else        Set oForm1.oClass1 = Nothing    End IfEnd PropertyPublic Property Get Interval() As Integer    Interval = oForm1.Timer1.IntervalEnd PropertyPublic Property Let Interval(ByVal vNewValue As Integer)    oForm1.Timer1.Interval = vNewValueEnd PropertyFriend Sub TimerEvent()    RaiseEvent TimerEnd Sub					
  4. Klicken Sie im Menü Projekt auf Formular hinzufügen, um dem Projekt ein neues Formular hinzuzufügen.
  5. Fügen Sie dem Formular ein Timer-Steuerelement hinzu.
  6. Kopieren Sie den folgenden Code, und fügen Sie ihn in das Modul für Form1 (Formular 1) ein:
    Option ExplicitPublic oClass1 As Class1Private Sub Timer1_Timer()    oClass1.TimerEventEnd Sub					
  7. Speichern Sie dieses Projekt in einem neuen Unterordner mit dem Namen Server.
  8. Klicken Sie im Menü Datei auf MyTimer.Exe erstellen, um die Komponente erstellen und registrieren zu lassen.
Automatisierungsclient erstellen
  1. Erstellen Sie ein neues Standard-EXE-Projekt in Visual Basic. Form1 wird standardmäßig erstellt.
  2. Fügen Sie dem Formular ein CommandButton-Steuerelement (Befehlsschaltfläche) hinzu.
  3. Klicken Sie im Menü Projekt auf Verweise. Fügen Sie einen Verweis auf die Microsoft Word 8.0 Object Library (oder 9.0 oder 10.0) und auf MyTimer hinzu.
  4. Kopieren Sie den folgenden Code, und fügen Sie ihn in das Formularmodul ein:
    Option ExplicitPrivate oWord As Word.ApplicationPrivate strWordCaption As StringPrivate WithEvents oMyTimer As MyTimer.Class1Private Sub Form_Load()    'Create MyTimer object, and then disable it by default:    Set oMyTimer = New MyTimer.Class1    oMyTimer.Enabled = FalseEnd SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)    'Terminate MyTimer object when the form is closed:    oMyTimer.Enabled = False    Set oMyTimer = NothingEnd SubPrivate Sub Command1_Click()    On Error GoTo ErrorHandler        'Create a new Word instance and put text in the new document:    Set oWord = CreateObject("Word.Application")    oWord.Visible = True    oWord.Documents.Add    oWord.Selection.TypeText "Hello World!"        'Prepare Timer to "watch out" for a delay in calling PrintOut:    strWordCaption = GetWordCaption 'for use with AppActivate    oMyTimer.Interval = 5000 'allow 5 second wait time    oMyTimer.Enabled = True            'Call the PrintOut method, which may prompt the user to select    'an output file name if the default printer is set to FILE:    oWord.PrintOut Background:=FalseDone:    On Error Resume Next    'Turn off Timer:    oMyTimer.Enabled = False        'Close document and quit the Word instance:    oWord.ActiveDocument.Close SaveChanges:=False    oWord.Quit    Set oWord = Nothing    Exit SubErrorHandler:    Resume DoneEnd SubPrivate Sub oMyTimer_Timer()'If this event occurs, there was a delay in calling PrintOut.'You can assume that the delay is caused by a dialog box prompting'for an output file name because the user has the printer'configured to print to FILE. SendKeys is used to provide the'output file name and dismiss the dialog box.    Dim strKeys As String        On Error Resume Next        'Make sure that Word has the focus before using SendKeys to it:    AppActivate strWordCaption 'Set focus to Word.        'Send keystrokes to enter the output file name:    If Right$(App.Path, 1) = "\" Then        strKeys = App.Path & "MyOutput.prn"    Else        strKeys = App.Path & "\MyOutput.prn"    End If    Kill strKeys 'make sure file does not already exist    strKeys = strKeys & "~" '~ represents the OK button to dismiss dialog    SendKeys strKeys, True           'Disable MyTimer:    oMyTimer.Enabled = FalseEnd SubPrivate Function GetWordCaption() As String'Returns the Word Caption. For use with the AppActivate statement    Dim s As String    On Error Resume Next    If Left$(oWord.Version, 1) = "8" Then        'Word 97 logic:        s = oWord.Caption    Else        'Word 2000 or 2002 logic:        Err.Clear        s = oWord.ActiveWindow.Caption        If Err.Number = 0 Then 'no error            s = s & " - " & oWord.Caption        Else            s = oWord.Caption        End If    End If    GetWordCaption = sEnd Function					
  5. Speichern Sie dieses Projekt in einem neuen Unterordner mit dem Namen Client.
  6. Drücken Sie die Taste [F5], um das Projekt auszuführen. Form1 wird angezeigt.
  7. Klicken Sie auf dem Formular auf Command1 (Befehl 1). Dadurch wird Word automatisiert und ein Dokument mit etwas Text hinzugefügt, das dann unter Verwendung der Methode PrintOut an den Drucker übermittelt wird. Ihnen wird kein Dialogfeld angezeigt, wenn Ihr Drucker darauf konfiguriert ist, Druckaufträge an einen anderen Drucker zu übermitteln.
  8. Ändern Sie in der Systemsteuerung die Einstellungen für Ihren Standarddrucker so, dass er darauf konfiguriert ist, Druckaufträge an den FILE-Port zu senden.
  9. Klicken Sie erneut auf Command1, und beachten Sie, dass in Word ein Dialogfeld angezeigt wird. Schließen Sie dieses Dialogfeld nicht. Warten Sie fünf Sekunden. Das Dialogfeld wird programmatisch geschlossen, wenn das Timer-Ereignis eintritt. Im Unterordner "Client" wird eine Ausgabedatei mit dem Namen "MyOutput.prn" erstellt.
Die Verwendung der hier aufgeführten Informationen, Makro- oder Programmcodes geschieht auf Ihre eigene Verantwortung. Microsoft stellt Ihnen diese Informationen sowie Makro- und Programmlistings ohne Gewähr auf Richtigkeit, Vollständigkeit und/oder Funktionalität sowie ohne Anspruch auf Support zur Verfügung. Die zur Verfügung gestellten Makro- und Programmierungsbeispiele sollen lediglich exemplarisch die Funktionsweise des Beispiels aufzeigen. Die Microsoft Supportmitarbeiter können bei der Erläuterung der Funktionalität bestimmter Prozeduren helfen, jedoch werden sie diese Beispiele nicht in Bezug auf eine erweiterte Funktionalität verändern, noch werden sie Prozeduren entwickeln, die auf Ihre besonderen Bedürfnisse zugeschnitten sind. Wenn Sie über begrenzte Programmiererfahrungen verfügen, wenden Sie sich an einen von Microsoft zertifizierten Partner. Weitere Informationen über von Microsoft zertifizierte Partner finden Sie auf der folgenden Seite im World Wide Web: Weitere Informationen zur Kontaktaufnahme mit Microsoft und den verfügbaren Supportoptionen finden Sie auf folgender Website von Microsoft:
Informationsquellen
Weitere Informationen finden Sie in den folgenden Artikeln der Microsoft Knowledge Base:
257757 INFO: Was bei der serverseitigen Automatisierung von Office zu beachten ist
226118 OFF2000: Ressourcen für die Programmierung mit Visual Basic für Applikationen
253235 OFFAUTMN.exe beschreibt Office 97 und 2000 Automatisierung und enthält Beispielcode
Weitere Informationen zur Office-Automatisierung finden Sie auf folgender Office Development-Site im Microsoft-Web:
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Eigenschaften

Artikelnummer: 259971 – Letzte Überarbeitung: 12/05/2015 19:46:53 – Revision: 6.3

Microsoft Office Access 2003, Microsoft Access 2002 Standard Edition, Microsoft Access 2000 Standard Edition, Microsoft Access 97 Standard Edition, Microsoft Office Excel 2003, Microsoft Excel 2002 Standard Edition, Microsoft Excel 2000 Standard Edition, Microsoft Excel 97 Standard Edition, Microsoft Office PowerPoint 2003, Microsoft PowerPoint 2002 Standard Edition, Microsoft PowerPoint 2000 Standard Edition, Microsoft PowerPoint 97 Standard Edition, Microsoft Office Word 2003, Microsoft Word 2002 Standard Edition, Microsoft Word 2000 Standard Edition, Microsoft Word 97 Standard Edition, Microsoft Visual Basic 5.0 Professional Edition, Microsoft Visual Basic 6.0 Professional Edition, Microsoft Visual Basic 5.0 Enterprise Edition, Microsoft Visual Basic Enterprise Edition for Windows 6.0

  • kbnosurvey kbarchive kbautomation kbhowto kbprogramming KB259971
Feedback