Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Outlook > VBA Outlook
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2008, 11h55   #1
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 0
Points : 0
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 ?
pascal_macro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2008, 14h33   #2
Membre habitué
 
Avatar de wape
 
Inscription : février 2003
Messages : 90
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 90
Points : 101
Points : 101
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
wape est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2008, 18h06   #3
Membre chevronné
 
Avatar de Oliv-
 
Inscription : mars 2006
Messages : 643
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : mars 2006
Messages : 643
Points : 699
Points : 699
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])
Oliv- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2008, 14h53   #4
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 0
Points : 0
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"
pascal_macro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2008, 16h54   #5
Membre chevronné
 
Avatar de Oliv-
 
Inscription : mars 2006
Messages : 643
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : mars 2006
Messages : 643
Points : 699
Points : 699
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 :
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
Oliv- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2008, 18h52   #6
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 0
Points : 0
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 ?
pascal_macro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 16h13   #7
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 0
Points : 0
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 :
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
pascal_macro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2008, 15h46   #8
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 0
Points : 0
Personne pour trouver mon erreur dans :
Code :
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 ?
pascal_macro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2008, 08h40   #9
Membre habitué
 
Avatar de wape
 
Inscription : février 2003
Messages : 90
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 90
Points : 101
Points : 101
Bonjour,

Essaye avec :

Code :
Set rech = es.sheets("res").Range(es.sheets("res").cells(1, 1), es.sheets("res").cells(ligne, 1)).Find(machaine, LookIn:=xlValues)
wape
wape est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 12h23   #10
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 0
Points : 0
Pas mieux avec le set.
J'ai essayé :

Code :
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 ?
pascal_macro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 12h57   #11
Membre habitué
 
Avatar de wape
 
Inscription : février 2003
Messages : 90
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 90
Points : 101
Points : 101
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
wape est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 14h33   #12
Membre chevronné
 
Avatar de Oliv-
 
Inscription : mars 2006
Messages : 643
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : mars 2006
Messages : 643
Points : 699
Points : 699
Salut,
quand tu recherches tu plusieurs possibilités selon ce que tu veux obtenir.

Code :
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 :
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.
Oliv- est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h03.


 
 
 
 
Partenaires

Hébergement Web