IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Envoi de mail, fermeture d'outlook non voulue [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut Envoi de mail, fermeture d'outlook non voulue
    Bonjour et bonne année 2020,

    J'ai une question concernant les envoi de mail via Excel, je ne suis pas sur si je dois la poser ici ou dans le forum outllook dans le doute je ferais les deux.

    J'envoi régulièrement des serie de mails avec un code ressemblant à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub Macro1()
    Dim ObjOutlook As Object
    Set ObjOutlook = CreateObject("outlook.application")
    Set oBjMail = ObjOutlook.CreateItem(olMailItem)
        With oBjMail
        '.Display
            .To = "" 'destinataire
            '.cc  'copie
           .Subject = "sujet" ' l'objet du mail
           .htmlbody = "message"
           .Display
     
     
        End With
    End Sub
    Sur mon poste ça fonctionne niquel car Outlook est ma messagerie de base.
    J'ai crée une macro similaire pour des collègues pour qui c'est différent, la macro va bien ouvrir la messagerie Outlook et prépare les mail a envoyer, mais au moment d'appuyer sur envoyer, si il n'y a pas d'autre mails en attente, Outlook se ferme immédiatement.
    Or en cas d'envoi multiple au moment ou Outlook se ferme certain mails ne sont pas encore parti, et la fermeture les empêche de partir

    D'où mes questions est-il possible en vba:
    -d'empêcher cette fermeture non voulue ?
    - vérifier si tout les mails on bien été envoyé?

    Merci d'avance a tous ceux qui pourront m'apporter des éléments de réponses/compréhension.
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  2. #2
    Membre chevronné Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Points : 1 971
    Points
    1 971
    Par défaut Bjr
    Bonjour,

    En ligne 10, tu as un .Display, dans le cas où ton mail est totalement automatisé, si tu n as rien à ajouter au traitement de ta macro, essaie de modifier par. Send, le mail sera envoyé directement.

    Bat
    Michaël

    Si mon aide/avis vous a été profitable , n'hésitez pas à cliquer sur , ça fait toujours plaisir...
    _________________________________________________________________________________________________________________

    "Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu'il est stupide..."
    Albert Einstein

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Merci pour la réponse
    En ligne 10, tu as un .Display, dans le cas où ton mail est totalement automatisé, si tu n as rien à ajouter au traitement de ta macro, essaie de modifier par. Send, le mail sera envoyé directement.
    L'utilisateur souhaite voir le message avant l'envoyer (pour contrôler la correspondance destinaire / PJ notamment, (même si ils peuvent le feuille sur la feuille excel prévue pour, certains n'ont pas confiance quand ça va "trop vite"))
    De plus pour l'avoir déjà testé, Outlook n'étant ouvert qu'une fraction de seconde c'est pire, très peu de message sortent de la boite d'envoi.
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  4. #4
    Membre chevronné Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Points : 1 971
    Points
    1 971
    Par défaut Bjr
    Re,

    Assez spécial cette histoire d Outlook qui se ferme.
    je crains de ne pas pouvoir plus t aider dsl
    Michaël

    Si mon aide/avis vous a été profitable , n'hésitez pas à cliquer sur , ça fait toujours plaisir...
    _________________________________________________________________________________________________________________

    "Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu'il est stupide..."
    Albert Einstein

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Si jamais ça intéresse qqn un jour j'ai eu des réponses sur le forum Outlook: https://www.developpez.net/forums/d2...ok-non-voulue/
    Il faut demander a Outlook d'afficher la boite d'envoi.
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    Bonjour le file,

    je ne suis pas un expert d'ootlook et je pense que ce genre de question devrait plutot être posée dans dans le forum dédié à outlook. Ceci étant dit,

    je pense que cela viens de l'inspecteur(inspector : Représente la fenêtre dans laquelle s’affiche un élément Outlook). Il est probable qu'un objet inspector soit déjà créer à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oBjMail = ObjOutlook.CreateItem(olMailItem)
    et que .display en crée un autre je pense qu'il est préférable d'utiliser la méthode display comme suit :

    mais je ne garanti rien !

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Citation Envoyé par Phil Free Voir le message
    je pense que ce genre de question devrait plutot être posée dans dans le forum dédié à outlook.
    Ne sachant pas trop si le problème venait de Outlook ou de l'interaction Excel Outlook, dans le doute j'ai posé la question sur les deux forums (mais je l'ai déjà dit)

    Malheureusement ça ne change pas le problème
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    Bon ok, désolé, j'ai lu ta demande un peu en travers...

    et oui cette fermeture est normale car quand outlook n'est pas ouvert la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oBjMail = ObjOutlook.CreateItem(olMailItem)
    n'ouvre que la boite d'envois ! Qui ensuite se ferme automatiquement après le clic sur le bouton envois.

    Du coup voici une solution un peu complexe mais qui regarde ce que fait l'utilisateur et vérifie que les envois sont effectués avant fermeture d'outlook.

    il te faudra creer 2 modules de classes :

    le premier à renommer : "OutlkMailEvents"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public WithEvents OutlkMail As Outlook.MailItem
     
    Private Sub OutlkMail_Close(Cancel As Boolean)
        UserReturnAction.MailBoxClosed = True ' /!\  la boite d'envois peu n'être que la session ouverte d'outlook. Dans ce cas fermer la boite d'envois c'est fermer outlook
    End Sub
     
    Private Sub OutlkMail_Send(Cancel As Boolean)
        UserReturnAction.MailSend = True
        UserReturnAction.MailBoxClosed = True ' /!\ l'envois du message ferme la boite d'envois donc même situation que plus haut
    End Sub
    Le 2ieme module de classe est à renommer : OutlkSynchroEvents

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public WithEvents SynchroEvents As Outlook.SyncObject
     
     
    Private Sub SynchroEvents_SyncEnd()
        SynchroDone = True
    End Sub
    Enfin dans un module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Option Explicit
     
    Type UserActions 'type perso
        MailSend As Boolean
        MailBoxClosed As Boolean
        OutlkAlreadyOpen As Boolean
    End Type
     
    Dim ClassOutlkMail As New OutlkMailEvents ' on initi la classe
    Dim ClassOutlkSynchro As New OutlkSynchroEvents ' on initi la classe
    Public UserReturnAction As UserActions, SynchroDone As Boolean, SynchroStart As Boolean
     
    Sub EnvoisEtSynchro()
    Dim OutLookAppli As Object, oBjMail As Object
    Dim  PromptText As String
     
    UserReturnAction.MailSend = False
    UserReturnAction.OutlkAlreadyOpen = False
    UserReturnAction.MailBoxClosed = False
    SynchroStart = False
    SynchroDone = False
     
        On Error Resume Next
            Set OutLookAppli = GetObject(, "OUTLOOK.Application") ' on recupere outlook si déjà ouvert
        On Error GoTo 0
        If OutLookAppli Is Nothing Then 'si outlook n'est pas déjà ouvert la variable objet reste vide
            Set OutLookAppli = CreateObject("OUTLOOK.Application") 'dans ce cas on demarre outlook
        Else
            UserReturnAction.OutlkAlreadyOpen = True 'ici on note que outlook est déjà ouvert
        End If
         'ici on ouvre le dossier par défaut d'outlook(en général la boite de réception) si outlook était fermé ce qui permettra de garder outlook ouvert 
        If UserReturnAction.OutlkAlreadyOpen = False Then OutLookAppli.Session.GetDefaultFolder(olFolderInbox).Display
     
        Set ClassOutlkMail.OutlkMail = OutLookAppli.CreateItem(0) 'on connecte notre mail a la classe
     
        With ClassOutlkMail.OutlkMail
            .To = "bob@bob.gom" 'destinataire
           .Subject = "sujet" ' l'objet du mail
           .htmlbody = "message"
           '.Display
            .GetInspector.Display
                Do 'ici on demarre une boucle pour attendre l'action de l'utilisateur
                    DoEvents
                Loop Until UserReturnAction.MailBoxClosed = True
            On Error GoTo 0
        End With
        '------------cette partie est pour la demo ce n'est normalement pas utile
        If UserReturnAction.MailSend Then
            PromptText = "a envoyé le message."
        Else
            PromptText = "n'a pas envoyé le message."
        End If
        MsgBox "l'utilisateur " & PromptText, vbInformation + vbOKOnly
        '-----------------------------------------------------------------------
        DoEvents
        'on récupère le premier objet de synchronisation. En general il y en à qu'un. Si plusieurs
        'prevoir une boucle ou alors utiliser la methode "SendAndReceive"
        'Puis on connecte notre objet à la classe
        Set ClassOutlkSynchro.SynchroEvents = OutLookAppli.GetNamespace("MAPI").SyncObjects.Item(1)
        ClassOutlkSynchro.SynchroEvents.Start 'on démarre la synchro
        If SynchroStart Then 'si la synchro à bien démarrer alors :
            Do 'on boucle pour attendre la fin
                DoEvents
            Loop Until SynchroDone = True 'la synchro est terminée on sort
        End If
        'si outlook était fermé et que la synchro est terminée on ferme outlook
        If UserReturnAction.OutlkAlreadyOpen = False And SynchroDone = True Then OutLookAppli.Quit
        Set OutLookAppli = Nothing
        Set ClassOutlkSynchro.SynchroEvents = Nothing
        Set ClassOutlkMail.OutlkMail = Nothing
    End Sub
    voila tout ce que j'ai posté n'est pas nécessaire comme les événements de la classe OutlkMailEvents. Mais cela permet de montrer ce que l'on peu faire et comment.
    Je ne suis pas du tout un spécialiste d'outlook du coup il y a peut être mieux à faire mais c'est un début.

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Envoi de mail avec signature Outlook.
    Par Richard_35 dans le forum VBA Outlook
    Réponses: 11
    Dernier message: 27/03/2015, 16h19
  2. envoie de mail automatique sur outlook via Excel 2003
    Par shakelife dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 12/12/2011, 08h04
  3. Envoi de mail depuis compte outlook
    Par calagan99 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 09/02/2008, 20h19
  4. Gérer l'envoi de mail préformaté avec outlook depuis données Excel
    Par drthodt dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 06/12/2007, 10h52
  5. Réponses: 4
    Dernier message: 02/04/2007, 18h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo