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 :

Problème avec la fonction find-Envoi de mails à différentes adresses [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Problème avec la fonction find-Envoi de mails à différentes adresses
    Bonjour,
    Je viens vers vous car je suis bloquée sur un code.
    J'ai un onglet avec une liste de gestionnaires et leur adresse mail dans la cellule à droite de chaque nom.
    J'ai plusieurs onglets qui portent le nom des gestionnaires et j'aimerai envoyer ces onglets par mail au gestionnaires correspondant en prenant l'adresse dans la cellule ,dans un fichier excel.

    Tout fonctionne mais pas le After:=ActiveCell, cependant sans cette petite ligne de code, je ne peux pas appeler la cellule active plus loin pour lui dire de prendre la valeur de celle d'à coté...

    Je vous laisse le début de mon code, si vous savez comment m'aider, je vous en serai très reconnaissante !

    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
    Sub MAIL()
    Dim i As Integer
    Dim Recherche As Range
     
     
        For i = 3 To Sheets.Count - 1
        Set Recherche = Sheets("Gestionnaires").Columns("I:I")
     
            If Sheets(i).Name = Recherche.Cells.Find(what:=Sheets(i).Name, After:=ActiveCell, LookAt:=xlWhole) Then
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
    Sheets(i).Select
    Sheets(i).Copy
     
     
    ActiveWorkbook.SaveAs Filename:= _
    "G:\PARIS\partage\MOI\Encaissements du jour.xls" _
    , FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
    ReadOnlyRecommended:=False, CreateBackup:=False
    MsgBox "Cliquer sur ACCEPTER"
    With Workbooks("Encaissements du jour.xls")
    .SendMail "ActiveCell.Offset(0, 1).Value", Subject:="Encaissements du jour " & Format(Date, "dd/mmm/yy")
    End With
    Workbooks("Encaissements du jour.xls").Close SaveChanges:=False
     
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
            End If
        Next i
    End Sub
    A noter que l'envoi des mails fonctionne si j'enleve le After:=ActiveCell et que je rentre une seule adresse mail dans le champs concerné.


    Merci beaucoup !

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut



    Bonjour,

    vraiment pas clair …

    Je dirais juste une mauvaise utilisation de la méthode Range.Find pour commencer !
    Juste en lisant son aide et son exemple, son paramètre After se réfère à une cellule du Range source du Find

  3. #3
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    est ce que tu as des doublons entre onglet ?
    Par exemple est ce que toto peut apparaitre sur la feuille 1 et sur la feuille 2 ?

    Si tu veux juste boucler sur tous les noms de la liste, tu peux faire qqc comme ç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
    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
    Option Explicit
     
    Const colonneNom As Integer = 1
    Const colonneAdresse As Integer = 2
     
    Public Function getAllDestinataire() As String
     
        Dim strDestinataire As String
        Dim sheet_          As Worksheet
        Dim i                   as integer
     
        strDestinataire = ""
        For Each sheet_ In ThisWorkbook.Sheets 'on boucle sur toute les feuilles du classeur
            For i = 1 To sheet_.UsedRange.SpecialCells(xlCellTypeLastCell).Row 'on boucle sur toute les lignes de la feuille en cours
                strDestinataire = strDestinataire & sheet_.Cells(i, 2).Value & ";"
            Next
        Next
     
        getAllDestinataire = Left(strDestinataire, Len(strDestinataire) - 1) 'on retourne toute la chaine (-1 pour le dernier ; qui traine)
    End Function
     
     
    Public Sub sendMail()
        Dim OutApp As Object
        Dim OutMail As Object
     
        Set OutApp = CreateObject("Outlook.Application")
        Set OutMail = OutApp.CreateItem(0)
     
        On Error Resume Next
        With OutMail 'on créé l'objet eMail
            .To = getAllDestinataire
            .CC = ""
            .BCC = ""
            .Subject = "Sujet"
            .Body = "Corps du message"
            .Attachments.Add ActiveWorkbook.FullName
            .Send 'envois
        End With
        On Error GoTo 0
     
        Set OutMail = Nothing
        Set OutApp = Nothing
    End Sub

  4. #4
    Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    bonjour, merci de ta réponse !
    En effet j'ai des doublons, c'est pour ça que j'ai définit une plage particulière parce que les noms des gestionnaires apparaissent plusieurs fois dans l'onglet "Gestionnaires" et apparaissent encore dans les autres...

    Que faire ?

    Le problème vient fondamentalement du After:=ActiveCell et je ne comprends d'ailleurs pas pourquoi ce parametre de ma fonction find ne marche pas

    Marc-L, merci de ta réponse, je n'ai pas bien compris ce que tu veux dire et j'ai déjà essayé de comprendre avec l'aide mais je suis débutante... Peux-tu mieux m'expliquer ?

  5. #5
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Il faut coder la méthode Find comme dans l'exemple de son aide (afin d'éviter une erreur si rien n'est trouvé).

    Et comme c'est pourtant clairement expliqué,
    le paramètre After fait référence à une cellule de la plage à laquelle est appliquée cette méthode !

  6. #6
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    si tu as des doublons, deux solutions, soit tu les effaces, soit tu utilise une collection.

    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
     
    Public collection_ As Collection
    Const colonneNom As Integer = 1
    Const colonneAdresse As Integer = 2
     
    Public function gestiondoublonparcollection() as string
        Dim strDestinataire As String
        Dim sheet_          As Worksheet
        Dim i                   As Integer
     
        strDestinataire = ""
        Set collection_ = New Collection
        For Each sheet_ In ThisWorkbook.Sheets
            For i = 1 To sheet_.UsedRange.SpecialCells(xlCellTypeLastCell).Row 'on boucle sur toute les lignes de la feuille en cours
                If Not inCollection(collection_, sheet_.Cells(i, 1).Value) Then
                    collection_.Add sheet_.Cells(i, 1)
                    strDestinataire = strDestinataire & sheet_.Cells(i, 2).Value & ";"
                End If
            Next
        Next
     
        If Len(strDestinataire) > 0 Then
            gestiondoublonparcollection= left(gestiondoublonparcollection, len(gestiondoublonparcollection) - 1)
        Else
            gestiondoublonparcollection = vbnullstring
        End If
     
        Set collection_ = Nothing
     
    End Sub
     
    Public Function inCollection(pCol As Collection, pStr As String) As Boolean
        Dim i As Integer
        inCollection = False
        For i = 1 To pCol.Count
            If pCol(i) = pStr Then
                inCollection = True
                Exit For
            End If
        Next
    End Function
     
    Public Sub sendMail()
        Dim OutApp As Object
        Dim OutMail As Object
        Dim listTo as string
     
        Set OutApp = CreateObject("Outlook.Application")
        Set OutMail = OutApp.CreateItem(0)
     
        On Error Resume Next
     
        listTo =gestiondoublonparcollection 
     
        if listTo = vbnullstring then exit sub
     
        With OutMail 'on créé l'objet eMail
            .To = listTo
            .CC = ""
            .BCC = ""
            .Subject = "Sujet"
            .Body = "Corps du message"
            .Attachments.Add ActiveWorkbook.FullName
            .Send 'envois
        End With
        On Error GoTo 0
     
        Set OutMail = Nothing
        Set OutApp = Nothing
    End Sub

  7. #7
    Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Marc-L, ah oui d'accord j'ai compris. En fait je n'avais pas compris les choses comme ça. Mais du coup comment dire au code de rendre la cellule trouvée active ?

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    C'est inutile ‼ Pourquoi faire ? Quel est le but ?

    Vu que si la méthode trouve quelque chose elle pointe directement une cellule …

  9. #9
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    T'enflamme par Marc
    Je pense qu'il y a une méconnaissance de la notion de "Range" pour clemmb.

    La méthode .find te donne une range (adresse) de la cellule si un résultat est trouvé.
    Le paramètre after:= indique juste a partir de quel endroit il faut commencer la recherche, et c'est également une range (adresse).

    Par exemple,

    tu as dans ta colonne A


    toto
    tata
    tutu
    titi
    tete
    toto
    tutu
    titi

    si tu spécifie le after = "A4", il va retourner A7.
    Si tu spécifie le after = "A1", il va retourner A3.

    Le problème qui se pose est lorsqu'aucun enregistrement existe pour ta recherche.
    Exemple, tu cherche ZOZO, il va te retourner une erreur. ça, il faut que l'anticipe.

  10. #10
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Nan, suis pas enflammé, cherche juste à comprendre la question ! (Confucius)

    Et pourtant les deux problèmes sont réglés en suivant l'exemple de l'aide de cette méthode …


  11. #11
    Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Je suis vraiment débutante en vba et c'est pour cela que je demande votre aide..

    Je vous ai fabriqué un fichier exemple très court pour que vous compreniez peut-être mieux..
    Fichiers attachés Fichiers attachés

  12. #12
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Suffit d'expliquer clairement ce que tu cherches à faire, bref avec les tenants et les aboutissants,
    simplement, sans laisser de la place à une quelconque possibilité d'interprétation …

    Voir du côté de la propriété Offset

    Du reste, pourquoi utiliser la méthode Find ?

    Rien qu'en entrant une formule RECHERCHEV par exemple dans chaque feuille de gestionnaire,
    et hop, l'adresse e-mail est directement présente dans la feuille !
    Trop simple alors de la récupérer ensuite dans un code …


    Démonstration à coller dans le module de la feuille Gestionnaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Demo()
        MsgBox Me.UsedRange.Columns(1).Find("lulu").Offset(, 1).Value2
    End Sub
    _________________________________________________________________________________________________
    Il n'y a pas que les aigles qui atteignent les sommets, les escargots aussi mais ils en bavent !

  13. #13
    Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    J'ai réussi à incure dans chaque onglet l'adresse correspondante. Dans mon code, comment je lui dis que l'adresse mail se trouve dans telle cellule ?

  14. #14
    Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    C'est bon j'ai réussi ! Avec la piste du rechercheV, ca m'a beaucoup aidé ! Merci beaucoup beaucoup, bonne journée

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

Discussions similaires

  1. Problème avec la fonction Find
    Par kyros21 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/01/2013, 14h50
  2. problème avec la fonction Find et un passage en argument
    Par paiva44 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/12/2009, 19h56
  3. [E - 03] Problème avec la fonction Find
    Par documentation dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/02/2009, 18h54
  4. [VBA-E]Problème avec la fonction Find
    Par Mirx1 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 27/04/2006, 19h43
  5. [Mail] Problème avec mon script d'envoi de mail
    Par leroivert dans le forum Langage
    Réponses: 18
    Dernier message: 02/12/2005, 01h26

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