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 à date limite [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    animateur qse
    Inscrit en
    Mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : animateur qse
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2016
    Messages : 11
    Par défaut Envoi de mail à date limite
    Bonjour à tous,

    avant de me décider à poster et demander votre aide, j'ai tout de même éplucher les différents sujets ayant été traité notamment:

    http://www.developpez.net/forums/d13...nction-d-date/
    http://www.developpez.net/forums/d10...59-80004005-a/

    dont je me suis fortement inspiré je ne le cacherai pas!

    Je cherchais à créer un fichier d'envoi de mail automatique (chaque lundi) et à la demande via bouton.
    à partir des codes trouvés sur ce forum j'ai donc réalisé un classeur composé de 2 feuilles:
    -l'un servira d'index pour remplissage
    -tandis que l'autre servira pour le calcul et sera masquée.

    l'outils passe par MicrosoftOutlook, bien entendu l'adresse mail renseigné ne correspond pas à celles qui seront utilisées.
    Ce code à été testé avec une adresse mail outlook mais lors du test d'envoi de mail, il s'avère que la commande ".send" ne fonctionne pas.

    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
    Sub Alertes()
        Dim B As Range, OL As Object, M As Object, Plage As Range
        Set olApp = CreateObject("Outlook.application")
        With Sheets("Service technique2")
            Set Plage = .Range(.[H4], .Cells(.Rows.Count, 1).End(xlUp))
        End With
        For Each B In Plage
            If B.Offset(, 5) - Date <= 70 Then
              Set M = olApp.CreateItem(olMailItem)
              With M
                  .Subject = "Alerte fin de validité d'habilisation BR"
                  .Body = B.Offset(, 19)
                  .Recipients.Add B.Offset(, 20)
                  .send
               End With
            End If
            If B.Offset(, 8) - Date <= 70 Then
              Set M = olApp.CreateItem(olMailItem)
              With M
                  .Subject = "Alerte fin de validité Caces"
                  .Body = B.Offset(, 19)
                  .Recipients.Add B.Offset(, 20)
                  .send
               End With
            End If
            If B.Offset(, 11) - Date <= 70 Then
              Set M = olApp.CreateItem(olMailItem)
              With M
                  .Subject = "Alerte fin de validité Formation SST"
                  .Body = B.Offset(, 19)
                  .Recipients.Add B.Offset(, 20)
                  .send
               End With
            End If
            If B.Offset(, 14) - Date <= 70 Then
              Set M = olApp.CreateItem(olMailItem)
              With M
                  .Subject = "Alerte fin de validité Formation CHSCT"
                  .Body = B.Offset(, 19)
                  .Recipients.Add B.Offset(, 20)
                  .send
               End With
            End If
            If B.Offset(, 17) - Date <= 70 Then
              Set M = olApp.CreateItem(olMailItem)
              With M
                  .Subject = "Alerte fin de validité FIMO - FCO"
                  .Body = B.Offset(, 19)
                  .Recipients.Add B.Offset(, 20)
                  .send
               End With
            End If
        Next B
    End Sub
    j'insiste sur le fait que j'ai planché dessus, mais le problème dépasse mes compétences.
    Vous trouverez en pièce jointe le fichier.

    Si une âme charitable pouvez me venir en aide ca serait top!

    Par avance merci.

    Oncle Ben
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Y a-t-il un message d'erreur ? si oui, lequel ?
    Est-ce qu'Outlook est ouvert lorsque tu démarres ta macro ?

  3. #3
    Membre régulier
    Homme Profil pro
    animateur qse
    Inscrit en
    Mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : animateur qse
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2016
    Messages : 11
    Par défaut
    hello, merci de ta réponse.

    oui outlook est ouvert et connecté.
    avec la version où l'adresse renseignée est outllook, le message d'erreur qui apparait est le suivant:

    erreur d'exécution '-2147467259 (80004005)'
    impossible de reconnaître un ou plusieurs nom

    suite à quoi je cherche à comprendre pourquoi en cliquant débogage et le surlignage se fait au niveau de la commande .send

    Pour information, je compte également rajouter un code permettant l'activation à fréquence définit (chaque lundi).
    Afin que l'envoi de mail ne se fasse pas tous les jours et que l'information ne passe pour un spam.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Et si tu mettais un msgbox avant les .Send ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Msgbox B.Offset(, 20)
    'ou encore
    Debug.Print B.Offset(, 20)
    Peut-être que ton code essaie d'envoyer un mail à une adresse vide (?)

    Tu pourrais aussi remplacer les .Send par .Display le temps de voir que tout fonctionne bien.

  5. #5
    Membre régulier
    Homme Profil pro
    animateur qse
    Inscrit en
    Mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : animateur qse
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2016
    Messages : 11
    Par défaut
    J'ai remplacé la fonction send par display et en plus j'ai mis msgbox pour trouvé l'erreur.

    voici les erreurs remontées:

    - l'outils s’arrête dès la première ligne Nom1 Prénom1
    - s'ouvre bien des fenêtres outlook, mais celles-ci ont en adresse destinataire ce qui correspond au corps du mail dans le tableau.

    la commande msg box a remonté les même erreurs.

    est-ce simplement une erreur dans le recipient.add B.offset (, x) ?

    j'ai donc décalé de 1 les B.offset(, x)

    résultat cela fonctionne.
    néanmoins j'ai toujours le msg d'erreur dans vba:
    erreur d'exécution '440':
    les zones A, Cc, Cci doivent contenir au moins un nom ou un groupe de contacts.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Lorsque la partie .Display est passée, le message est accessible dans Outlook.
    Il faut regarder toutes les parties du message et trouver les incohérences.
    C'est certain qu'Outlook n'aimera pas si l'adresse courriel est le texte du body...
    Il y a donc probablement différents ajustements à faire sur les Offset que tu utilises.

  7. #7
    Membre régulier
    Homme Profil pro
    animateur qse
    Inscrit en
    Mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : animateur qse
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2016
    Messages : 11
    Par défaut
    Top !
    j'ai bien aimé ta manière de m'en faire prendre conscience. Vraiment top.
    surtout qu'il y a encore 2 semaines, je ne connaissais pas le langage vba !

    Il y a juste un problème qui subsiste, comment affecter la répétitivité ?
    pour pas que le code s'arrête à la première ligne.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Je ne vois pas pourquoi ça s'arrête à la 1ere ligne...
    Peut-être ici ?
    Set Plage = .Range(.[H4], .Cells(.Rows.Count, 1).End(xlUp))
    Quelle est la plage que tu veux parcourir ? A, H ou tout ?

    Et comme ceci pour la plage H4:Hx?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = .Range(.[H4], .Cells(.Rows.Count, "H").End(xlUp))

  9. #9
    Membre régulier
    Homme Profil pro
    animateur qse
    Inscrit en
    Mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : animateur qse
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2016
    Messages : 11
    Par défaut
    l'outils doit contrôler les colonnes non plus H mais
    G; J; M; P; S et ce, à partir de la ligne 4, qui correspondent en fait aux dates limite de validité de chaque formation.

    je ne comprends pas non plus pourquoi le code s’arrête, j'ai bien décomposé la plage à partir de la cellule G4 (et non H4, c'était une autre de mes erreurs), et en comptant 1 pour se décaler d'une ligne.

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Difficile à dire sans vraiment comprendre le fichier...

    Tu pourrais y aller en pas à pas:
    Tu mets un point d'arrêt au début de la boucle (tape F9 sur la ligne For Each B....)
    Tu démarres la macro et elle va s'arrêter sur cette ligne.
    À partir de là, tu tapes F8 autant de fois que nécessaire en regardant les différentes valeurs (B.Offset(, 5), B.Offset(, 19), B.Offset(, 20) ou autres) que tu vérifies pour voir si ça concorde avec ce que tu veux faire

  11. #11
    Membre régulier
    Homme Profil pro
    animateur qse
    Inscrit en
    Mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : animateur qse
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2016
    Messages : 11
    Par défaut
    Hello,
    j'ai appliqué ta procédure pour trouver l'erreur.
    Elle est au niveau des adresses mails dans la seconde page.

    Vu qu'il s'agit d'une page renseigné à partir de la page 'interface", je me demande si la lecture de la case correspondante dans la page de calcul se fait et si le code ne lit pas ='Service technique'!HXX au lieu de lire l'adresse mail..

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Ajoute .Value ou .Text aux cellules que tu lis pour voir

  13. #13
    Membre régulier
    Homme Profil pro
    animateur qse
    Inscrit en
    Mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : animateur qse
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2016
    Messages : 11
    Par défaut
    C'est good ça marche, merci beaucoup pour ton aide PARMI!



    il ne me reste plus qu'à mettre une déclenchement à date, parce que avec le code, je me suis envoyé 300 mails en l'espace d'une minute..

    edit: ça marche avec la commande .text

  14. #14
    Membre régulier
    Homme Profil pro
    animateur qse
    Inscrit en
    Mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : animateur qse
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2016
    Messages : 11
    Par défaut
    Hello,
    mon code n'est pas complet, en fait.
    pour éviter le spam, je l'ai relié à un bouton. Cependant, le code ne tiens pas compte des individus n'ayant pas suivi de formation.
    De ce fait si l'individu n'a pas suivi une formation A mais une autre formation B, le fait de renseigner le mail, donne accès à l'envoi du mail.
    Ainsi le code ne prends pas en compte si le délai est dépassé et valable.

    Pour le bien il faudrait définir un intervalle entre 0 et 100 par exemple pour valider l'envoi de mail.
    Comment faire cela?

    j'ai tenté avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If 0 < B.Offset(, 8) - Date <= 70 Then
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If B.Offset(, 8) - Date <= 70 Or B.Offset(, 8) - Date > 0 Then
    mais cela ne fonctionne pas.

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Il faudrait voir ce que valent ces cellules...

    Ça prendrait un AND plutôt qu'un OR si tu recherches des résultats entre 0 et 70
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If B.Offset(, 8) - Date > 0 AND B.Offset(, 8) - Date <= 70 Then
    Ne pas oublier de mettre une date d'envoi ou quelque chose d'autre pour se rappeler que l'envoi a été fait...

  16. #16
    Membre régulier
    Homme Profil pro
    animateur qse
    Inscrit en
    Mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : animateur qse
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2016
    Messages : 11
    Par défaut
    Ok, aussi simple ! Merci.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/09/2015, 09h38
  2. [XL-2007] Alerte Dates d'échéance pas envoi de Mail
    Par pasterlouis dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 06/05/2013, 22h34
  3. Envoie de mail avec php dans une date precise
    Par salimtrois dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 04/04/2012, 17h50
  4. Envoi e-mail automatiquement à une date precise
    Par sooprano dans le forum Langage
    Réponses: 10
    Dernier message: 23/11/2008, 21h03
  5. [MySQL] Envoi de mails selon une heure et une date donnée stockée
    Par vw91 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 16/06/2008, 11h00

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