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

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 259971 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde zuvor veröffentlicht unter D259971
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
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.
Alles erweitern | Alles schließen

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 Explicit
    
    Public Event Timer()
    Private oForm1 As Form1
    
    Private Sub Class_Initialize()
        Set oForm1 = New Form1
        oForm1.Timer1.Enabled = False
    End Sub
    
    Private Sub Class_Terminate()
        Me.Enabled = False
        Unload oForm1
        Set oForm1 = Nothing
    End Sub
    
    Public Property Get Enabled() As Boolean
        Enabled = oForm1.Timer1.Enabled
    End Property
    
    Public 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 If
    End Property
    
    Public Property Get Interval() As Integer
        Interval = oForm1.Timer1.Interval
    End Property
    
    Public Property Let Interval(ByVal vNewValue As Integer)
        oForm1.Timer1.Interval = vNewValue
    End Property
    
    Friend Sub TimerEvent()
        RaiseEvent Timer
    End 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 Explicit
    
    Public oClass1 As Class1
    
    Private Sub Timer1_Timer()
        oClass1.TimerEvent
    End 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 Explicit
    
    Private oWord As Word.Application
    Private strWordCaption As String
    Private WithEvents oMyTimer As MyTimer.Class1
    
    Private Sub Form_Load()
        'Create MyTimer object, and then disable it by default:
        Set oMyTimer = New MyTimer.Class1
        oMyTimer.Enabled = False
    End Sub
    
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        'Terminate MyTimer object when the form is closed:
        oMyTimer.Enabled = False
        Set oMyTimer = Nothing
    End Sub
    
    Private 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:=False
    
    Done:
        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 Sub
    ErrorHandler:
        Resume Done
    End Sub
    
    Private 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 = False
    End Sub
    
    Private 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 = s
    End 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:
http://www.microsoft.com/partner/referral/
Weitere Informationen zur Kontaktaufnahme mit Microsoft und den verfügbaren Supportoptionen finden Sie auf folgender Website von Microsoft:
http://support.microsoft.com/default.aspx?scid=fh;DE;CNTACTMS

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:
http://support.microsoft.com/ofd

Eigenschaften

Artikel-ID: 259971 - Geändert am: Mittwoch, 17. Januar 2007 - Version: 6.3
Die Informationen in diesem Artikel beziehen sich auf:
  • 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
Keywords: 
kbautomation kbhowto kbprogramming KB259971
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com