Outlook en premier plan

Bonjour,

Mon problème:

Via un bouton sous Access, je prépare un mail que j'envoie . display ou par .send en VBA.
Tout fonctionne correctement.

Cependant, Outlook s'ouvre en second plan, l'application Access reste en premier plan !. Je souhaiterais que Outlook passe en premier plan après l'envoi de la commande . display ou .send

Avez vous la solution ?

Merci

Configuration: Android / Chrome 81.0.4044.96

18 réponses

Résumé de la discussion

Enjeux techniques : l'envoi d'un mail via un bouton Access qui prépare un message avec Outlook en VBA (display ou send), Outlook restant en arrière-plan par rapport à Access. Plusieurs réponses indiquent d'ajouter un paramètre utilisateur pour mettre Outlook en premier plan par défaut, mais des cas montrent que cela fonctionne parfois et pas durablement. D'autres évoquent qu'Outlook peut déjà être ouvert et se ferme ou que le focus dépend fortement de l'environnement (Win7, Access 2013), tandis que certains recommandent d'utiliser un bouton séparé ou de partager le fichier. En cas de besoin, certains indiquent qu'un exemple de code ou un lien de référence peut aider à viser une solution fiable sans modifier l'état du fil.

Bobot (l’IA à votre service)
  1. Contributeur
    bonjour, tu nous permettras de mieux t'aider en nous montrant ton code.
    1. Contributeur
      se pourrait-il que ton code VBA fasse repasser Access en avant plan?
  2. Bonjour,
    Voici mon code qui fonctionne très bien, cependant je n'arrive pas a mettre Outlook en premier plan !

    Merci pour votre aide

    Mon Code :

    Function EnvViaOutlook(DestMail As String, CCMail As String, SujetMail As String, TxtMail As String, Signature As String, Optional PJ1 As String) As String
    Dim OL As Outlook.Application, mi As Outlook.MailItem
    On Error GoTo OLMailErr
    Set OL = New Outlook.Application
    Set mi = OL.CreateItem(olMailItem)
    With mi
    .To = DestMail
    .CC = CCMail
    .Subject = SujetMail
    .Body = TxtMail
    .HTMLBody = "Test <b>Signature<\b>" & "<br>" & .HTMLBody
    .Display
    End With
    Set mi = Nothing: Set OL = Nothing
    Exit Function
    OLMailErr:
    MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description
    Exit Function
    End Function
    1. Contributeur
      comment utilises-tu cette fonction? c'est peut-être après l'avoir appelée que Access fait quelque-chose et revient en avant plan.
  3. Bonjour,
    Dans une fonction, j'appelle cette fonction pour créer un mail puis l'afficher (.Display) afin que l'utilisateur puisse l'adapté.
    Tu peux essayer avec le code que j'ai joint
    Merci
    1. Bonjour,

      tu peux tester ce code directement dans une sub d'un bouton, pour voir...

      Private Sub boutonTest_Click()
      Dim OL As Outlook.Application, mi As Outlook.MailItem
      On Error GoTo OLMailErr
      Set OL = New Outlook.Application
      Set mi = OL.CreateItem(olMailItem)
      With mi
      .To = DestMail
      .CC = CCMail
      .Subject = SujetMail
      .Body = TxtMail
      .HTMLBody = "Test <b>Signature<\b>" & "<br>" & .HTMLBody
      .Display
      End With
      Set mi = Nothing: Set OL = Nothing
      Exit Sub
      OLMailErr:
      MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description
      Exit Sub
      End Sub
      
      1. Bonjour,
        Ta solution ne change rien, c'est exactement le même code avec Function remplacé par SUB
        Si tu as Access, tu peux t'en rendre compte en testant ce code, il manque juste la commande pour mettre Outlook en premier plan
        Merci
        1. Bonjour a vous tous,

          Je suis cette demande depuis le debut et comme d'autre s'en occupaient, j'ai passe la main momentanement.
          flomen:
          J'ai teste votre code sur Access et pas de probleme Outlook et bien en premier plan avec .display. Ce qui est normal. Je fait ca couramment, principalement avec Excel pour tester le contenu des @Mail a envoyer, mais ca ne change rien a la chose
        2. Contributeur
          Je pense que cela ne sert à rien de mettre Outlook en avant plan, car il l'est déjà au moment du .display. Access revient ensuite en avant plan, peut-être suite à une action faite dans la fonction appelante.
          Peux-tu partager ton fichier?
        3. Contributeur
          As-tu testé la suggestion de RV71 (via un simple bouton)?
      2. Bonjour,
        Que veux tu dire par Un simple bouton ?
        Je test avec un bouton dans lequel j'ai mis l'exécution du code sur l’événement clic
        Regardes le code est dis-moi ce qu'il faut modifier ou as tu un autre code pour afficher un mail avant de l'envoyer
        Merci
        1. Contributeur
          Peux-tu partager ton fichier?
      3. Bonjour,
        Je ne comprends pas ta demande : Peux-tu partager ton fichier?
        De quel fichier s'agit il ?
        1. As-tu essayé de mettre le code sur un bouton ?

          Car je l'ai fait (sans passer par une fonction) et cela fontionne.

          Comme dit yg_be, partage ta base de données (en enlevant les données strictement confidentielles), en utilisant par exemple https://fr.fromsmash.com/

          A+
          1. Bonjour,
            Ca ne fonctionne pas " SUB" et "FUNCTION"
            J'ai une mini base 692 K, comment puis-je la partager avec vous ?
            1. Je viens de partager la base Access, voici le lien https://www.cjoint.com/c/JDup5xiHoxP

              Merci pour votre aide
              1. Contributeur
                j'ai testé avec ton fichier, et le message s'affiche en avant-plan.
                j'ai testé avec Outlook déjà ouvert, ou pas: même comportement.
            2. Merci pour ton aide,
              Je viens d'essayer avec la base que tu as corrigée (3 références) malheureusement ça ne fonctionne toujours pas !
              Pour information, j'utilise office 2013 et Windows 10

              Encore merci, peut être auras tu une autre solution !
              1. J'ai une autre question, avec cette méthode, je peux créer un mail puis l'envoyer, cependant je souhaiterais l'insertion de la signature telle quelle est définie dans Outlook, je n'ai pas trouvé la solution
                Merci
              2. @f894009Merci, ça fonctionne parfaitement, j'ai pu intégrer un logo (jpg) dans la signature avec du code html
            3. Bonjour,

              sincèrement je sèche, puisque cela fonctionne chez moi (win7 + office 2013 32bits).

              Tu peux essayer la base sur une autre machine ??

              A+
              1. J'ai testé en ouvrant Outlook avant, ça fonctionne aussi, peut-être que du coup cela va fonctionner chez toi.
                Par contre, c'est crado, car en cas de changement de version outlook, faudra modifier le vba...

                Vois le fichier modifié ici --> https://www.cjoint.com/c/JDvmTYg3xgU
                1. Effectivement avec cette méthode ça fonctionne, si l'utilisateur envoi plusieurs mails, avec cette méthode, à chaque fois on ouvre une nouvelle sessions Outlook, donc beaucoup de sessions ouvertes !
                  Merci pour tout le temps
                2. @flomenComment cela ?

                  S'il ferme outook, la session se ferme, no ?

                  A+
                3. @RV71Quand je dis plusieurs sessions, ce sont toutes les session ouverte à chaque envoi de mail, peut être peut on fermer la session Outlook que l'on a ouverte ?, le fait d'envoyer le mail, cela ferme la fenêtre du mail mais pas Outlook !
              2. Vu que la fenêtre Outlook est devant celle de Access, l'utilisateur devra la fermer pour revenir sur Access, à moins qu'il ne la réduise volontairement, mais ce n'est pas le comportement habituel.

                Sinon, oui, on peut killer le processus Outlook (s'il existe) avant de déclencher la création du mail...
                1. Mais cela n'explique pas pourquoi cela ne fonctionne pas sans le shell...

                  As-tu outlook de défini comme programme par défaut ?

                  A+
                  1. Contributeur
                    chez moi, Outlook n'est pas défini comme programme par défaut pour email, et tout fonctionne bien avec le fichier de départ de flomen.
                  2. Aurais tu le code pour fermer Outlook , ce qui me permettrai d'utiliser ta méthode : Ouverture Outlook avec le code que tu ma donner, envoi du mail et pour terminer fermer Outlook pour éviter d'avoir des sessions d'empilées
                  3. @yg_beNon il n'était pas défini par défaut, je l'ai défini par défaut mais çà ne change rien !
                    J'ai fait un essai sur un deuxième ordinateur, même problème ! Outlook se cache toujours !
                  4. @flomenOn ne peut pas savoir dans Access ce que l'utilisateur a fait dans Outlook, donc à quel moment le fermer.
                    Accèss n'a plus la main quand l'utilisateur écris son message dans Outlook.
                    Il faut :
                    1/ vérifier si outlook est ouvert
                    2/ si ouvert, le fermer
                    3/ Relancer Outlook avec le code

                    Mais je reste persuadé que 99% des utilisateurs font fermer Outlook pour revenir à Access...
                  5. @RV71Bonjour,
                    Je suis toujours à la recherche d'une solution,
                    je ne suis pas le seul à avoir le problème voir :

                    https://www.commentcamarche.net/forum/affich-34949745-forcer-la-fenetre-d-envoi-outlook-en-premier-plan-access-2013-16

                    J'ai l'essai sur un autre ordinateur après avoir tout réinstallé Windows 10 et Office 2013, toujours le problème !
                    La ou j'ai un doute, c'est sur Windows 10 car toi tu me dis que çà fonctionne, la différence c'est toi tu est en Windows 7.
                    Je vais voir si je peux réinstaller un Windows 7.
                    Merci
                2. Bon,

                  voici le code à mettre sur le bouton :

                  Private Sub Go_Click()
                  
                  '--- On ferme le Processus Outlook ---
                  Dim ovc As Object
                  Dim sQuery As String
                  Dim oproc
                  Set ovc = GetObject("winmgmts:root\cimv2")
                  sQuery = "select * from win32_process where name='" & "Outlook.EXE" & "'"
                  For Each oproc In ovc.execquery(sQuery)
                  oproc.Terminate
                  Next
                  Set ovc = Nothing
                  
                  ' on relance outlook
                  
                  Dim SessionOutlook
                  Const Chemin As String = "C:\Program Files\Microsoft Office\office15\OUTLOOK.exe" '  ---> tu adaptes ce chemin si c'est nécessaire
                  SessionOutlook = Shell(Chemin, 1)
                  Dim MonOutlook As Outlook.Application
                  Dim MonMessage As Outlook.MailItem
                   
                  On Error GoTo Err_envoyerMail
                   
                      ' ===== Initialisation =====
                      Set MonOutlook = CreateObject("Outlook.Application")
                      Set MonMessage = MonOutlook.CreateItem(0)
                   
                      ' ===== Création de l'email =====
                      With MonMessage
                          .To = "menon.florent@gmail.com"
                          .Subject = "Sujet de ce mail"
                          .Body = "Ici le contenu du mail à envoyer"
                          ' Affiche le mail (commenter la ligne pour envoi du mail en tâche de fond)
                          .Display
                          ' Envoie le mail automatiquement (décommenter la ligne pour envoi du mail en tâche de fond)
                          '.Send
                      End With
                   
                  Exit_envoyerMail:
                  
                      Set MonOutlook = Nothing
                      Exit Sub
                   
                  Err_envoyerMail:
                      Select Case Err.Number
                          Case Else
                              MsgBox "Erreur n°" & Err.Number & vbCrLf & "Description : " & Err.Description & vbCrLf & "Source : " & Err.Source, vbCritical, "Erreur"
                      End Select
                      Resume Exit_envoyerMail
                   
                  
                  
                  End Sub