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 :

Mail automatisé retour de validation


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2019
    Messages : 101
    Par défaut Mail automatisé retour de validation
    Bonjour à tous,

    J'ai créé un fichier avec formulaire dans un fichier partagé sur un serveur. Une fois le formulaire envoyé, quelqu'un est censé valider en colonne 12 la demande par formulaire.

    Je souhaiterai ainsi que lorsqu'une cellule en colonne 12 est modifiée, un mail s'envoie automatiquement au demandeur formulaire en lui annonçant que sa demande a été validée.


    A l'heure actuelle, mon code fonctionne a moitié, puisqu'il envoie bien des mails… Mais pour chaque cellule de ma colonne 12 non vide…. Donc par exemple 10 mails pour une seule validation !


    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim appOutlook As Outlook.Application
        Set appOutlook = Outlook.Application
        Dim MESSAGE As Outlook.MailItem
        Dim objRecipient As Outlook.Recipient
     
     
    dligne = Range("A15000").End(xlUp).Row
     
    For I = 6 To dligne
     
     
     Set MESSAGE = appOutlook.CreateItem(olMailItem)
        With MESSAGE
     
            .Subject = "Changement de nomenclature " & Cells(dligne + 1, 5) & " modifi?"
            .BodyFormat = olFormatPlain
            .Body = "La modification de la nomenclature" & Cells(I, 5) & " que vous avez demand? a ?t? faite  " & "."
            'Ajout d'un destinataire principal
            Set objRecipient = .Recipients.Add(Left(Cells(I, 3), 1) & "." & Mid(Cells(I, 3), InStr(Application.UserName, " ") + 1) & "@as-XXX.com")
            objRecipient.Type = olTo
            objRecipient.Resolve
            .Send
        End With
        End If
    Next I
    End Sub


    Dans l'idée, le code devrait marcher comme ça: Si ma cellule(X,12) est modifiée, alors j'envoie un mail au demandeur dont les infos sont en cellule(X,3).
    Mon problème viens du fait que je n'arrive pas à cibler précisément cet évènement de par mon manque de connaissance technique…
    Si quelqu'un arrive à me donner un coup de main ça serait super !

    Mickamax

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    Je te conseille de bien borner l'objet Target (par exemple par sa colonne).

    La propriété à gérer pour l'item Outlook est ici

    La valeur de cette propriété sera la cellule de la ligne de l'objet Range nommé Target décalé de 9 colonnes à gauche.
    Je te laisse traduire en VBA.
    A titre d'information, tu peux consulter cet espace

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    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 681
    Par défaut
    Bonjour,

    1) Tu n'utilise pas le bon évènement Worksheet_Change plutôt que Worksheet_SelectionChange

    2) Commence par enlever ta boucle for

    3)Dans l'entête de ta fonction:
    Citation Envoyé par Mickamax Voir le message
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Il y a le paramètre Target qui te permet de savoir quelle cellule est modifiée
    Target.column te donnera la colonne de la cellule modifiée, vérifie que tu te situe bien sur la bonne colonne
    Target.row te donnera la ligne de la cellule modifiée, tu peux remplacer ton indice de boucle par cette valeur

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2019
    Messages : 101
    Par défaut
    Bonjour,
    Merci Marcel G et halaster08 pour vos conseils, j'ai avancé depuis.

    Je rencontre néanmoins un problème avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Set MESSAGE = appOutlook.CreateItem(olMailItem)
        With MESSAGE
     
            .Subject = " modification du " & Cells(Target.Row, Target.Column - 6) & " du produit " & Cells(Target.Row, Target.Column - 8) & " act?e."
            .BodyFormat = olFormatPlain
            .Body = "La demande de modification de nomenclature du produit " & Cells(Target.Row, Target.Column - 8) & " concernant le composant " & Cells(Target.Row, Target.Column - 6) & " a bien ?t? valid?e et act?e dans Navision." & vbCr & "Merci."
     
            'Ajout d'un destinataire principal (? variabiliser pour envoi au demandeur initial quand ?a marchera)
            Set objRecipient = .Recipients.Add(Left(Cells(Target.Row, Target.Column - 10), 1) & "." & Mid(Cells(Target.Row, Column.Row - 10), InStr(Cells(Target.Row, Target.Column - 10), " ") + 1) & "@XXX.com")
            objRecipient.Type = olTo
            objRecipient.Resolve
            .Send

    J'ai l'erreur suivante (classique): erreur d'exécution 424: Objet requis, en particulier avec la ligne suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Set objRecipient = .Recipients.Add(Left(Cells(Target.Row, Target.Column - 10), 1) & "." & Mid(Cells(Target.Row, Column.Row - 10), InStr(Cells(Target.Row, Target.Column - 10), " ") + 1) & "@XXX.com")

    La cellule Target.row, Target.column -10 est une cellule contenant application.username.
    Je vais donc successivement chercher la première lettre de ma cellule, je met un point, puis je vais chercher tout ce qui suit mon espace (mon nom de famille) et j'y ajoute la fin de l'adresse mail.



    Il y a sûrement une erreur toute bête mais j'avoue que je bloque dessus… Quelqu'un pour m'aiguiller ?

    Bonne journée !
    Mickamax

  5. #5
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Mickamax et bonjour au Forum,

    Pour alléger ton code, tu peux soit utiliser le bloc With soit affecter une variable à la cellule contenant l'identifiant.
    Si l'on considère le bloc With

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Cells(Target.Row, Target.Column - 10)
    Set objRecipient = Message.Recipients.Add(Left(.Value, 1) & "." & Mid(.Value, InStr(.Value, " ") + 1) & "@XXX.com")
    End With
    Il apparaît aussitôt un manque de 3ème argument à la fonction Mid.
    Tu peux consulter son aide ici.

    A plus tard.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2019
    Messages : 101
    Par défaut
    Merci Marcel G,
    En plus de fonctionner c'est beaucoup plus élégant que ce que j'avais fait !

    Dernière petite question et je crois que j'arriverai au bout ()

    J'essaie d'inscrire dans une cellule l'ensemble des sélections d'une ListBox comme celle-ci:

    Nom : listbox multiselect.PNG
Affichages : 122
Taille : 4,7 Ko

    Dans mon exemple, je voudrais qu'une cellule prédéfinie renvoie ici: Hubert Delabatte, Marc Hervé et Justine Roche.

    J'ai fait ce bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For J = 0 To atelierm.ListCount - 1
    If atelierm.Selected(J) = True Then
    listeatelierm = atelierm.List(J, 0)
    End If
     
    Next J
    Cells(1, 5) = listeatelierm
    Ca fonctionne… à moitié puisque cela n'inscrit qu'un seul des éléments sélectionnés et non pas tous…
    Quelqu'un pour me filer une piste ?

    Bonne journée,
    Mickamax

  7. #7
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut mickamax,

    Je ne suis pas grand utilisateur de listbox.
    Au demeurant, ici, tu pourrais alimenter ta variable sur elle même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim listeatelierm As String
     
    listeatelierm = ""
     
    For J = 0 To atelierm.ListCount - 1
    If atelierm.Selected(J) = True Then
    listeatelierm = listeatelierm & atelierm.List(J, 0) &","
    End If
     
    Next J
    Cells(1, 5) = listeatelierm

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

Discussions similaires

  1. [XL-2007] Vba Excel et Lotus Notes (envoi de mail automatisé)
    Par kocipia dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/12/2011, 10h43
  2. [Mail] mail de retour avec mail()
    Par afrodje dans le forum Langage
    Réponses: 4
    Dernier message: 12/07/2008, 14h37
  3. [Mail] Envoyer un mail avec retour d'erreur
    Par phpaide dans le forum Langage
    Réponses: 1
    Dernier message: 19/04/2006, 15h49
  4. [Mail] mail() et retour du "undelivery..."
    Par benoleg dans le forum Langage
    Réponses: 2
    Dernier message: 02/02/2006, 23h51
  5. Réponses: 4
    Dernier message: 01/10/2005, 13h52

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