Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

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

Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Cet article peut contenir des liens vers des informations en langue anglaise (pas encore traduites).
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 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. 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 ExplicitPublic oClass1 As Class1Private Sub Timer1_Timer()    oClass1.TimerEventEnd 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 ExplicitPrivate oWord As Word.ApplicationPrivate strWordCaption As StringPrivate WithEvents oMyTimer As MyTimer.Class1Private Sub Form_Load()    'Crée l'objet MyTimer, puis le désactive par défaut :    Set oMyTimer = New MyTimer.Class1    oMyTimer.Enabled = FalseEnd SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)    'Termine l'objet MyTimer lorsque le formulaire est fermé :    oMyTimer.Enabled = False    Set oMyTimer = NothingEnd SubPrivate 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:=FalseDone:    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 SubErrorHandler:    Resume DoneEnd SubPrivate 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 = FalseEnd SubPrivate 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 = sEnd 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 : 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 :
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) :
Propriétés

ID d'article : 259971 - Dernière mise à jour : 12/05/2015 19:46:56 - Révision : 6.4

  • 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
  • kbnosurvey kbarchive kbautomation kbhowto kbprogramming KB259971
Commentaires
  • Marques commerciales
  • © 2015 Microsoft