Comment faire pour faire disparaître une boîte de dialogue affichée par une application Office à l'aide de Visual Basic

Traductions disponibles Traductions disponibles
Numéro d'article: 259971 - Voir les produits auxquels s'applique cet article
Cet article peut contenir des liens vers des informations en langue anglaise (pas encore traduites).
Agrandir tout | Réduire tout

Résumé

Lors de l'automatisation d'une application Office à partir de Visual Basic, l'application Office peut afficher une boîte de dialogue. L'application Visual Basic peut alors sembler cesser de répondre (se bloquer), car elle attend que la boîte de dialogue disparaisse. La boîte de dialogue doit disparaître avant que l'application Visual Basic puisse continuer.

Cet article explique comment utiliser les modèles objet des applications Office pour éviter l'affichage de boîtes de dialogue lors de l'automatisation. Il présente en outre un exemple de procédures pas à pas pour simuler l'entrée utilisateur afin de faire disparaître par programmation les boîtes de dialogue qui ne peuvent pas être évitées à l'aide des propriétés et méthodes habituelles exposées dans les modèles objet.

Plus d'informations

Vous souhaiterez parfois automatiser une application Office, sans nécessiter d'interaction utilisateur avec l'application Office. Dans ce cas, si l'application Office affiche une boîte de dialogue, votre application semble cesser de répondre jusqu'à ce qu'un utilisateur fasse disparaître la boîte de dialogue. Toutefois, il est possible qu'aucun utilisateur ne soit présent pour faire disparaître la boîte de dialogue.

Les applications Office ne sont pas conçues pour être exécutées de façon autonome (sans entrée utilisateur). Par conséquent, les applications qui automatisent Office peuvent parfois rencontrer des boîtes de dialogue affichées par l'application Office. Vous pouvez généralement tester l'application pour déterminer quelles boîtes de dialogue s'affichent et écrire votre code de façon à éviter ces boîtes de dialogue spécifiques.

Les stratégies présentées ci-dessous sont recommandées pour éviter l'affichage de boîtes de dialogue lors de l'automatisation d'une application Office.
  • Déterminez si la propriété ou la méthode utilisée (provoquant l'affichage de la boîte de dialogue) possède des arguments optionnels que vous pouvez lui passer. Dans certains cas, le fait de passer tous les arguments à une propriété ou une méthode permet d'éviter l'affichage d'une boîte de dialogue. Par exemple, si vous utilisez la méthode Open pour ouvrir un classeur Excel et que ce classeur est protégé par un mot de passe, Excel affiche une boîte de dialogue demandant à l'utilisateur d'entrer le mot de passe si vous ne fournissez pas l'argument de mot de passe (Password) lors de l'appel de la méthode Open. Pour éviter la boîte de dialogue, fournissez une valeur pour l'argument Password lors de l'appel de la méthode Open. De même, lors de l'utilisation de la méthode Close pour fermer un document, il est souvent utile de spécifier l'argument SaveChanges pour éviter l'affichage d'une boîte de dialogue demandant à l'utilisateur d'enregistrer les modifications. Pour plus d'informations sur la façon de déterminer les arguments disponibles pour la propriété ou la méthode que vous appelez, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft.
    222101 Comment faire pour rechercher et utiliser la documentation de modèle objet Office
  • Examinez le modèle objet de l'application Office pour vérifier s'il existe une propriété permettant d'éviter l'affichage de certaines boîtes de dialogue. Par exemple, l'objet Application d'Excel possède les propriétés AskToUpdateLinks et AlertBeforeOverwriting.
  • Définissez la propriété Application.DisplayAlerts (pour Excel, Project, Word) ou utilisez Application.DoCmd.SetWarnings False (pour Access uniquement) pour désactiver l'affichage de messages d'alerte. La plupart des boîtes de dialogue peuvent être évitées à l'aide de ce paramètre (mais pas toutes).
  • Définissez la propriété Application.FeatureInstall (pour Office 2000 et version ultérieure) pour gérer les éventuelles boîtes de dialogue de type "Ce composant n'est pas installé..." lors de l'accès à un composant qui n'est pas installé sur le système de l'utilisateur.
  • Utilisez l'instruction On Error pour éviter les messages d'erreur d'exécution qui pourraient se produire, comme par exemple lorsque vous tentez de définir Application.ActivePrinter alors qu'aucun pilote d'imprimante n'est installé sur le système de l'utilisateur.
  • Testez votre application minutieusement pour prévoir l'affichage éventuel de boîtes de dialogue. Par exemple, supposons que vous appelez la méthode SaveAs d'une application Office pour enregistrer dans un fichier. Si ce fichier existe déjà, une boîte de dialogue peut s'afficher, vous demandant de confirmer le remplacement du fichier existant. Si vous modifiez votre code de manière à vérifier l'existence du fichier avant d'appeler la méthode SaveAs, vous pouvez éviter l'affichage de la boîte de dialogue le cas échéant. Par exemple, si le fichier existe déjà, supprimez-le à l'aide de l'instruction Kill avant d'appeler la méthode SaveAs.
Remarque Même si vous utilisez ces stratégies et que vous concevez votre application soigneusement pour éviter l'affichage de boîtes de dialogue, vous pouvez rencontrer des situations dans lesquelles la boîte de dialogue ne peut pas être évitée à l'aide des méthodes et propriétés exposées dans le modèle objet de l'application Office. Dans ces cas, vous devrez peut-être faire disparaître la boîte de dialogue par programmation en simulant une entrée utilisateur. L'exemple suivant montre comment obtenir ce résultat à l'aide d'un client Automation Visual Basic.

Exemple

Les étapes de cette section montrent l'automatisation de l'impression d'un document dans Microsoft Word. Le client Automation appelle la méthode PrintOut pour l'objet Document de Word. Si l'imprimante par défaut de l'utilisateur est configurée pour imprimer sur le port FILE, un appel à PrintOut produit une boîte de dialogue invitant l'utilisateur à entrer un nom de fichier. Pour déterminer si la méthode PrintOut provoque l'affichage de cette boîte de dialogue, le client Automation Visual Basic utilise un contrôle Timer pour détecter le temps d'inactivité après l'appel de la méthode PrintOut. Avant d'appeler PrintOut, le contrôle Timer est activé et défini pour être lancé après cinq secondes. À la fin de la méthode PrintOut, le contrôle Timer est désactivé. Par conséquent, si la méthode PrintOut est terminée avant cinq secondes, l'événement Timer ne se produit pas et aucune action supplémentaire n'est exécutée. Le document est imprimé et le code continue à être exécuté après la méthode PrintOut. Toutefois, si l'événement Timer se produit au cours du délai de cinq secondes, le programme suppose que la méthode PrintOut ne s'est pas terminée et que le délai est dû à une boîte de dialogue attendant l'entrée utilisateur. Lorsque l'événement Timer se produit, le client Automation donne le contrôle à Word et utilise SendKeys pour faire disparaître la boîte de dialogue.

Remarque À des fins d'illustration, cet exemple utilise la méthode PrintOut de manière à ce qu'elle affiche une boîte de dialogue intentionnellement lors de l'impression sur une imprimante définie sur un port FILE. Notez que la méthode PrintOut possède deux arguments, OutputfileName et PrintToFile, que vous pouvez fournir pour éviter cette boîte de dialogue.

En outre, lorsque vous utilisez le contrôle "Timer" à cette fin, vous pouvez personnaliser le délai d'attente avec une valeur inférieure ou supérieure à cinq secondes, ainsi que les combinaisons de touches envoyées à la boîte de dialogue.

Cette démonstration consiste en deux projets Visual Basic :
  1. Un projet EXE ActiveX qui fournit une classe Timer utilisée pour détecter un délai. Le projet EXE ActiveX est utilisé pour la classe Timer car il permet d'exécuter le code Timer dans un processus distinct et, par conséquent, dans un thread distinct. Ceci permet à la classe Timer de provoquer un événement au cours d'un appel d'automatisation suspendu.
  2. Un projet EXE standard qui utilise l'automatisation sur Word et qui appelle la méthode PrintOut pour imprimer un document. Ce projet utilise le projet EXE ActiveX pour détecter un délai lors de l'appel de la méthode PrintOut.
Création du projet EXE ActiveX
  1. Démarrez Visual Basic et créez un projet EXE ActiveX. Class1 est créée par défaut.
  2. Dans le menu Projet, sélectionnez Propriétés, puis modifiez le nom du projet en MyTimer.
  3. Copiez et collez le code suivant dans le module Class1 :
    <![CDATA[
    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. Dans le menu Projet, cliquez sur Ajouter un formulaire pour ajouter un nouveau formulaire au projet.
  5. Ajoutez un contrôle Timer au formulaire.
  6. Copiez et collez le code suivant dans le module de code pour Form1 :
    <![CDATA[
    Option Explicit
    
    Public oClass1 As Class1
    
    Private Sub Timer1_Timer()
        oClass1.TimerEvent
    End Sub
    					]]>
  7. Enregistrez ce projet dans un nouveau sous-dossier nommé Serveur.
  8. Dans le menu Fichier, choisissez Créer MyTimer.Exe pour créer et inscrire le composant au Registre.
Création du client Automation
  1. Créez un projet EXE standard dans Visual Basic. Form1 est créé par défaut.
  2. Ajoutez un contrôle CommandButton au formulaire.
  3. Dans le menu Projet, sélectionnez Références. Ajoutez des références à la Bibliothèque d'objets Microsoft Word 8.0 (ou 9.0 ou 10.0) et à MyTimer.
  4. Copiez et collez le code suivant dans le module de formulaire :
    <![CDATA[
    Option Explicit
    
    Private oWord As Word.Application
    Private strWordCaption As String
    Private WithEvents oMyTimer As MyTimer.Class1
    
    Private Sub Form_Load()
        'Crée l'objet MyTimer, puis le désactive par défaut :
        Set oMyTimer = New MyTimer.Class1
        oMyTimer.Enabled = False
    End Sub
    
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        'Termine l'objet MyTimer lorsque le formulaire est fermé :
        oMyTimer.Enabled = False
        Set oMyTimer = Nothing
    End Sub
    
    Private Sub Command1_Click()
        On Error GoTo ErrorHandler
        
        'Crée une nouvelle instance de Word et place le texte dans le nouveau document :
        Set oWord = CreateObject("Word.Application")
        oWord.Visible = True
        oWord.Documents.Add
        oWord.Selection.TypeText "Hello World!"
        
        'Prépare l'horloge à « respecter » un délai lors de l'appel à PrintOut :
        strWordCaption = GetWordCaption 'à utiliser avec AppActivate
        oMyTimer.Interval = 5000 'autorise un délai d'attente de 5 secondes
        oMyTimer.Enabled = True
            
        'Appelle la méthode PrintOut, qui peut inviter l'utilisateur à sélectionner
        'un nom de fichier de sortie si l'imprimante par défaut est configurée sur un fichier :
        oWord.PrintOut Background:=False
    
    Done:
        On Error Resume Next
        'Désactive l'horloge :
        oMyTimer.Enabled = False
        
        'Ferme le document et l'instance de Word :
        oWord.ActiveDocument.Close SaveChanges:=False
        oWord.Quit
        Set oWord = Nothing
        Exit Sub
    ErrorHandler:
        Resume Done
    End Sub
    
    Private Sub oMyTimer_Timer()
    'Si cet événement se produit, il y a eu un délai pour appeler PrintOut.
    'Vous pouvez supposer que le délai est provoqué par une boîte de dialogue
    'demandant un nom de fichier de sortie car l'imprimante est
    'configurée pour imprimer dans un fichier. SendKeys est utilisé pour fournir le
    'nom de fichier de sortie et faire disparaître la boîte de dialogue.
        Dim strKeys As String
        
        On Error Resume Next
        
        'S'assure que Word est actif avant d'utiliser SendKeys :
    
        AppActivate strWordCaption 'Place le focus sur Word.
        
        'Envoie des frappes pour entrer le nom de fichier de sortie :
        If Right$(App.Path, 1) = "\" Then
            strKeys = App.Path & "MyOutput.prn"
        Else
            strKeys = App.Path & "\MyOutput.prn"
        End If
        Kill strKeys 's'assure que le fichier n'existe pas déjà
        strKeys = strKeys & "~" '~ représente le bouton OK permettant de faire disparaître la boîte de dialogue
        SendKeys strKeys, True
           
        'Désactive MyTimer :
        oMyTimer.Enabled = False
    End Sub
    
    Private Function GetWordCaption() As String
    'Retourne la légende Word. À utiliser avec l'instruction AppActivate
        Dim s As String
        On Error Resume Next
        If Left$(oWord.Version, 1) = "8" Then
            'Logique Word 97 :
            s = oWord.Caption
        Else
            'Logique Word 2000 ou Word 2002 :
            Err.Clear
            s = oWord.ActiveWindow.Caption
            If Err.Number = 0 Then 'aucune erreur
                s = s & " - " & oWord.Caption
            Else
                s = oWord.Caption
            End If
        End If
        GetWordCaption = s
    End Function
    					]]>
  5. Enregistrez ce projet dans un nouveau sous-dossier nommé Client.
  6. Appuyez sur la touche F5 pour exécuter le projet. Form1 s'affiche.
  7. Cliquez sur Command1 sur le formulaire. Ceci automatise Word, ajoute un nouveau document comprenant du texte et envoie ce document vers l'imprimante à l'aide de la méthode PrintOut. Aucune boîte de dialogue ne s'affiche si votre imprimante est configurée pour imprimer sur une imprimante.
  8. Dans le Panneau de configuration de Windows, modifiez votre imprimante par défaut de manière à ce qu'elle soit configurée pour imprimer sur le port FILE.
  9. Cliquez à nouveau sur Command1 et notez qu'une boîte de dialogue apparaît dans Word. Ne faites pas disparaître la boîte de dialogue et attendez cinq secondes. La boîte de dialogue est supprimée par programmation lorsque l'événement Timer se produit. Un fichier de sortie nommé MyOutput.prn est créé dans le sous-dossier Client.
Microsoft fournit des exemples de programmation à des fins d'illustration uniquement, sans garantie explicite ou implicite, y compris, de manière non limitative, les garanties implicites de qualité marchande et/ou d'adéquation à un usage particulier. Cet article suppose que vous connaissez le langage de programmation présenté et les outils utilisés pour créer et déboguer des procédures. Les techniciens du Support technique Microsoft peuvent vous expliquer les fonctionnalités d'une procédure particulière, mais ils ne peuvent pas modifier les exemples en vue de vous fournir des fonctionnalités supplémentaires ou de créer des procédures répondant à vos besoins spécifiques. Si vous ne maîtrisez que partiellement la programmation, vous pouvez contacter un partenaire certifié Microsoft ou le service client Microsoft au 0825 827 829 qui pourra transmettre votre demande de consulting aux équipes Microsoft appropriées. Pour plus d'informations sur les partenaires certifiés Microsoft (Microsoft Certified Partners), reportez-vous au site Web de Microsoft à l'adresse suivante :
https://partner.microsoft.com/global/30000104
Pour plus d'informations sur les options de support technique disponibles et la façon de contacter Microsoft, reportez-vous au site Web de Microsoft à l'adresse suivante :
http://support.microsoft.com/default.aspx?scid=fh;FR;ASSISTEDOVER

Références

Pour plus d'informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft.
257757 INFO : Éléments à prendre en compte pour l'automatisation côté serveur de Microsoft Office
226118 OFF2000 : Ressources de programmation pour Visual Basic pour Applications
253235 FICHIER : OFFAUTMN.EXE traite des clients Automation avec Office 97 et Office 2000 et fournit des exemples de code
Pour plus d'informations sur Office Automation, reportez-vous au Centre de support de développement Office sur le site Web de Microsoft à l'adresse suivante (en anglais) :
http://support.microsoft.com/ofd

Propriétés

Numéro d'article: 259971 - Dernière mise à jour: mercredi 17 janvier 2007 - Version: 6.4
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Office Access 2003
  • Microsoft Access 2002
  • Microsoft Access 2000 Standard Edition
  • Microsoft Access 97 Standard
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002
  • Microsoft Excel 2000 Standard
  • Microsoft Excel 97 Standard
  • Microsoft Office PowerPoint 2003
  • Microsoft PowerPoint 2002 Standard
  • Microsoft PowerPoint 2000 Standard
  • Microsoft PowerPoint 97 Standard
  • Microsoft Office Word 2003
  • Microsoft Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Word 97 Standard Edition
  • Microsoft Visual Basic 5.0 Édition professionnelle
  • Microsoft Visual Basic 6.0 Édition professionnelle
  • Microsoft Visual Basic 5.0 Édition Entreprise
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Mots-clés : 
kbautomation kbhowto kbprogramming KB259971
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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