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

VBA Outlook Discussion :

Recuperer des références dans mes mails


Sujet :

VBA Outlook

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    J'aimerai pouvoir parcourir le texte et objet des mails dans ma boite de reception pour recupérer certaines reférences et reprendre celles-ci dans un fichier excel.
    Les références commencent toujours par le même texte et sont de longueur fixes : ABC0xxxxxx
    xxxxxx représente la reférence que je veux récupérer.
    Par contre ces références peuvent être n'importe où dans le texte du mail.

    Pensez vous déjà que cela soit réalisable par avec une macro ?
    Et si vous avez des pistes sur comment effectuer la recherche et la récupération du texte notamment.

    Merci

    ps : Je n'ai pas d'expérience dans les macro outlook mais j'ai pas mal bricolé les macros sur excel.

    personne ne peut m'aider ?

  2. #2
    Membre régulier
    Avatar de wape
    Profil pro
    Inscrit en
    Février 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2003
    Messages : 90
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    A priori cela est possible par macro. Pourrais-tu toutefois préciser les points suivants :

    . le dossier "Boîte de réception" contient-il des sous-dossiers ?
    . dans combien de mails environ ces références doivent-elles être recherchées ?

    wape

  3. #3
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    SAlut,
    Oui c'est faisable mais il faut préciser plusieurs choses :
    ta version outlook ?
    a quel moment veux tu faire cela (reception, autre ...)
    où se trouvent les mails ?
    l'objet du mail est il le même ?
    si oui tu peux utiliser restrict voir l'aide

    Une fois le mail isolé il faut utilser la fonction InStr

    Renvoie une valeur de type Variant (Long) indiquant la position de la première occurrence d'une chaîne à l'intérieur d'une autre chaîne.

    Syntaxe :
    InStr([start, ]string1, string2[, compare])

    et mid
    Renvoie une valeur de type Variant (String) contenant un nombre indiqué de caractères extraits d'une chaîne de caractères.

    Syntaxe :
    Mid(string, start[, length])

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos infos, il va falloir que je digère un peu cela.
    Pour répondres aux questions :
    - j'ai outlook 2003 SP2
    - la recherche porte sur un volume de 100 à 5-600 mails
    - l'objet du mail varie, ainsi que la taille, le format, l'expéditeur ...
    - En général les mail sont dans la boite de réception (sans sous dossier)
    mais il pourrait être utile de pouvoir tourner la macro dans une archive mail
    - pour l'execution ce serait plutot sur demande (j'ajouterai un bouton dans les menus)

    Si je suis l'idée ce serait d'utiliser le coprs du mail (mail.body) comme chaine pour la commande InStr et avec comme chaine de recherche mon "ABC0" ?
    Il n'y a pas de problème de longueur ?
    Les éventuelles images, fichiers attachés et autres ne sont pas inclus dans le "body"

  5. #5
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Salut,
    Pour ta digestion désolé mais je suis victime de la "charte " ...

    Donc pour ton problème je préconise de chercher dans le dossier en cours.

    au bout de ce lien un exemple d'ajout dans un fichier excel :
    http://www.developpez.net/forums/sho...d.php?t=476977

    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
    Sub recherche_dans_dossier()
    Dim MonOutlook As Outlook.Application
    Dim LeMail As Object
    Dim LesMails
    Set MonOutlook = Outlook.Application
     
    Set LesMails = MonOutlook.ActiveExplorer.CurrentFolder.Items
     
        For Each LeMail In LesMails
            If InStr(1, LeMail.Body, "ABC0") > 0 Then
                maChaine = Mid(LeMail.Body, InStr(1, LeMail.Body, "ABC0"), 16)
    'ici l'ajout dans excel
            Else
                maChaine = 0
            End If
        Next LeMail
     
    Set LesMails = Nothing
    MsgBox "Fin de traitement"
    End Sub

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup,
    je viens de faire un bon en avant.

    Deux questions :
    - avec InStr j'obtient la première occurence de ma recherche, existe-t-il un moyen de chercher les suivantes autre qu'un système récursif du type appliquer InStr le reste de la chaine après la reférence trouvée (que je peux etraire avec Mid)
    - Il n'y a pas moyen de tout stoquer dans une "liste" avant l'appel a excel. Ainsi cela éviterai les passage excel/outlook, non ?

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    voilà ou j'en suis.
    Ca marche par trop mal.
    Mais pour éviter des doublon de références, je voulais faire une recherche dans le fichiern excel et là ça marche plus ...
    voici mon code :

    Il bloque sur la ligne ou je fait le find.

    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
     
    Sub recherche_dans_dossier()
    Dim MonOutlook As Outlook.Application
    Dim LeMail As Object
    Dim LesMails
    Set MonOutlook = Outlook.Application
     
    Set LesMails = MonOutlook.ActiveExplorer.CurrentFolder.Items
        Set es = CreateObject("Excel.Application")
        es.Visible = True
        es.workbooks.Add
     
        es.activesheet.Name = "res"
        ligne = 1
        For Each LeMail In LesMails
            lachaine = LeMail.Body
            Position = InStr(1, lachaine, "RES0")
            jour = LeMail.CreationTime
            While Position > 0
                machaine = Mid(lachaine, Position, 10)
    ' ça bug ici
                rech = es.sheets("res").Range(es.sheets("res").cells(1, 1), es.sheets("res").cells(ligne, 1)).Find(machaine, LookIn:=xlValues)
                If Not rech Is Nothing Then
                    If es.sheets("res").cells(rech.row, 2).Value > jour Then
                        es.sheets("res").cells(rech.row, 2).Value = jour
                    End If
                Else
     
                    es.sheets("res").cells(ligne, 1).Value = machaine
                    es.sheets("res").cells(ligne, 2).Value = jour
     
                    Debug.Print machaine
                    ligne = ligne + 1
                End If
                lachaine = Mid(lachaine, Position + 10)
                Position = InStr(1, lachaine, "RES0")
            Wend
                machaine = 0
     
        Next LeMail
     
    Set LesMails = Nothing
    MsgBox "Fin de traitement"
    End Sub

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Personne pour trouver mon erreur dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rech = es.sheets("res").Range(es.sheets("res").cells(1, 1), es.sheets("res").cells(ligne, 1)).Find(machaine, LookIn:=xlValues)
    C'est forcément un truc con, mais quoi ?

  9. #9
    Membre régulier
    Avatar de wape
    Profil pro
    Inscrit en
    Février 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2003
    Messages : 90
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    Essaye avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rech = es.sheets("res").Range(es.sheets("res").cells(1, 1), es.sheets("res").cells(ligne, 1)).Find(machaine, LookIn:=xlValues)
    wape

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Pas mieux avec le set.
    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set zone = es.sheets("res").Range(es.sheets("res").cells(1, 1), es.sheets("res").cells(ligne, 1))
    Set rech = zone.Find(machaine, LookIn:=xlValues)
    Et j'ai toujours : erreur d'éxécution 9 : l'indice n'apartient pas à la sélection.
    Erreur sur la 2nd ligne

    des idées ?

  11. #11
    Membre régulier
    Avatar de wape
    Profil pro
    Inscrit en
    Février 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2003
    Messages : 90
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    As-tu coché la référence "Microsoft Excel X.0 Object Library" dans l'éditeur VBA d'Outlook (cf. Outils > Références...") ?

    wape

  12. #12
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Salut,
    quand tu recherches tu plusieurs possibilités selon ce que tu veux obtenir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       nom_query = Cells.Find(What:="Query", After:=ActiveCell, LookIn:=xlFormulas _
            , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False).Offset(1, 0).Value
     
     
        Set titre = Cells.Find(What:="Dossier client", After:=ActiveCell, LookIn:=xlFormulas _
            , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False).EntireRow
    Dans le premier cas j'ai une valeur si elle existe, dans le second j'ai un objet ici une ligne.

    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
                machaine = "toto"
                ligne = 10
                Set rech = Sheets("res").Range(Cells(1, 1), Cells(ligne, 1)).Find(machaine, LookIn:=xlValues)
                If Not rech Is Nothing Then
                MsgBox "ok"
                End If
    End Sub
    attention les paramétres de find restent en mémoire après chaque utilisation donc mieux vaut les entrer tous.

Discussions similaires

  1. [VB]recuperer le contenu de mes mails
    Par mick84m dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/03/2006, 11h07
  2. [Mail] Faire figurer des images dans un mail
    Par JeanMi66 dans le forum Langage
    Réponses: 4
    Dernier message: 04/12/2005, 22h49
  3. problème de detection des CD dans mes lecteurs
    Par zakfa dans le forum Windows XP
    Réponses: 8
    Dernier message: 31/03/2005, 11h07
  4. Réponses: 3
    Dernier message: 22/02/2004, 20h09
  5. Réponses: 2
    Dernier message: 19/01/2004, 12h19

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