Merci mille fois Oliv
Je vais essayer ça dès que je peux, je te tiens au courant
Bon Week-end
Merci mille fois Oliv
Je vais essayer ça dès que je peux, je te tiens au courant
Bon Week-end
Bon, ça marche presque nickel
1/ L'importation s'effectue bien mais dans le cas du dossier de mails envoyés l'importation est hyper lente du genre 1 seconde pour chaque mail les autres dossiers sont 3 x plus rapides , pourquoi ?
2/ Il apparaît une erreur si je demande à importer depuis l'adresse souche "en dehors de la matrice" cela veut il dire qu'il n'y a plus d'espace mémoire ?
3/ Une erreur 91 "variable non définie bloc with" apparait uniquement après importation du dossier "boite de réception"
4/ Pour l'instant on utilise une méthode pickfolder qui oblige à choisir les dossiers principaux à importer et qui scanne les sous dossiers, je suppose que l'on pourrait en solutionnant le problème de mémoire donner le dossier racine d'une adresse donnée et que tous les sous dossiers soient traités sans avoir à importer leur contenu un par un ?
5/ Existe il une manière de faire un genre de requête de façon à proposer un compteur avant importation qui n'importerait que ce qui n'est pas encore dans la table d'importation ?
En tous cas bravo, à part 2 messages d'erreurs et la lenteur l'importation se fait bien et ça c'est génial
Salut,
Combien as tu d'éléments dans ce dossier ?1/ L'importation s'effectue bien mais dans le cas du dossier de mails envoyés l'importation est hyper lente du genre 1 seconde pour chaque mail les autres dossiers sont 3 x plus rapides , pourquoi ?
On peut accélérer en faisant plusieurs choses :
- 1 boucle sur les Emails au lieu de 2 , avec un test pour savoir si c'est entrant ou sortant
- marquer les mails déjà traités, et appliquer un filtre en conséquence, pour ne traiter la fois suivante que les nouveaux.
- autre possibilité, si le nombre de contact est peu nombreux dans ta base access, il faut travailler à l'envers :
pour chaque contact, trouver les Emails correspondant avec un filtre !
je comprends pas ce dont tu parles2/ Il apparaît une erreur si je demande à importer depuis l'adresse souche "en dehors de la matrice" cela veut il dire qu'il n'y a plus d'espace mémoire ?
où ?3/ Une erreur 91 "variable non définie bloc with" apparait uniquement après importation du dossier "boite de réception"
tu peux selectionner avec pickfolder la racine !4/ Pour l'instant on utilise une méthode pickfolder qui oblige à choisir les dossiers principaux à importer et qui scanne les sous dossiers, je suppose que l'on pourrait en solutionnant le problème de mémoire donner le dossier racine d'une adresse donnée et que tous les sous dossiers soient traités sans avoir à importer leur contenu un par un ?
Peut être avec le marquage et le filtre indiqué en 1, en utilisant une table qui ne donne malheureusement pas tous les éléments (notamment PJ )5/ Existe il une manière de faire un genre de requête de façon à proposer un compteur avant importation qui n'importerait que ce qui n'est pas encore dans la table d'importation ?
En tous cas bravo, à part 2 messages d'erreurs et la lenteur l'importation se fait bien et ça c'est génial
Je republie le code en entier
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221 Public Function ImportMailsOutlook() Dim Ol_App As New Outlook.Application Dim Ol_Mapi As Outlook.NameSpace Dim Ol_Folder As Outlook.MAPIFolder 'debug 'On Error GoTo Description_Err ' Déclaration de l'objet sous-dossier Set rsMail = CurrentDb.OpenRecordset("Mails importés outlook") Set Ol_Mapi = Ol_App.GetNamespace("MAPI") Set Ol_Folder = Ol_Mapi.PickFolder 'On spécifie ici la fenêtre de sélection de dossiers Outlook Set db = CurrentDb Debut: DoCmd.OpenForm ("compteur importation de mails") Call ProcessFolder(Ol_Folder, True) rsMail.Close MsgBox "Les données ont été importées" DoCmd.Close Description_Err: MsgBox " Erreur " & err.Number & Chr(10) & err.Description 'On libère la mémoire : Set rsMail = Nothing Set Ol_Folder = Nothing Set Ol_Mapi = Nothing Set Ol_App = Nothing End Function Sub ProcessFolder(StartFolder As Outlook.MAPIFolder, SubFolder As Boolean) '--------------------------------------------------------------------------------------- ' Procedure : ProcessFolder ' Author : OCTU ' Date : 16/06/2015 ' Purpose : Fonction recursive pour faire quelque chose dans le dossier et ses sous dossiers '--------------------------------------------------------------------------------------- ' Dim objFolder As Outlook.MAPIFolder Dim item As Object 'Dim objItem As Object 'On Error Resume Next ' process all the subfolders of this folder For Each objFolder In StartFolder.Folders Call ProcessFolder(objFolder, SubFolder) Next ' process all the items in this folder For Each item In StartFolder.Items Call Traitement_Mails(item) Next Set objFolder = Nothing End Sub Sub Traitement_Mails(Ol_Items) Dim Ol_Mail As Outlook.MailItem Dim boucle As Variant Dim strMail As String Dim strSQL As String Dim strNumContact 'suppression type oliv- Dim strTypeMail As String Dim blnMailTrouvé As Boolean Dim strAttachment As String Dim Compteur As Byte Dim Ol_Attach As Outlook.Attachment Compteur = 0 If Ol_Items.Class = olMail Then Set Ol_Mail = Ol_Items For Each boucle In Array("1", "2") ' Initialisation des variables strMail et strSQL en fonction du numéro de boucle Select Case boucle Case "1" ' Première Boucle If Ol_Mail.Recipients.Count > 0 Then 'ajout oliv- strMail = GetSMTPAddressForRecipient(Ol_Mail.Recipients.item(1)) 'Filtre pour éléments envoyés par adresse mail du contact strSQL = "SELECT NumContact FROM Contacts" _ & " WHERE Mail1 = """ & strMail & """" _ & " OR Mail2 = """ & strMail & """" _ & " OR Mail3 = """ & strMail & """" 'Variable avec Dlookup pour recherche du numéro de contact correspondant à chaque mail importé : strNumContact = DLookup("numcontact", "contacts", "mail1 = """ & strMail & """ Or Mail2 = """ & strMail & """ Or Mail3 = """ & strMail & """") strTypeMail = "Envoyé" 'Cette variable permettra ensuite de distinguer le type du mail dans la table "Mails importés outlook" End If Case "2" ' Deuxième Boucle strMail = Get_sender_exchange(Ol_Mail) '.SenderEmailAddress 'Filtre pour éléments reçus par adresse mail du contact strSQL = "SELECT NumContact FROM Contacts" _ & " WHERE Mail1 = """ & strMail & """" _ & " OR Mail2 = """ & strMail & """" _ & " OR Mail3 = """ & strMail & """" 'Variable avec Dlookup pour recherche du numéro de contact correspondant à chaque mail importé : strNumContact = DLookup("numcontact", "contacts", "mail1 = """ & strMail & """ Or Mail2 = """ & strMail & """ Or Mail3 = """ & strMail & """") strTypeMail = "Reçu" 'Cette variable permettra ensuite de distinguer le type du mail dans la table "Mails importés outlook" End Select If strSQL <> "" Then 'ajout oliv- Set db = CurrentDb 'ajout oliv- With db.OpenRecordset(strSQL) blnMailTrouvé = (.EOF = False) End With If blnMailTrouvé Then 'Vérifie si il y a des données pour un enregistrement donné For Each Ol_Attach In Ol_Mail.Attachments strAttachment = strAttachment & Ol_Attach.DisplayName & vbCrLf Next Ol_Attach With rsMail ' Remplissage de la table avec le résultat des filtres : .AddNew !Bcc = Ol_Mail.Bcc !Categories = Ol_Mail.Categories !Cc = Ol_Mail.Cc !ConversationTopic = Ol_Mail.ConversationTopic !CreationTime = Ol_Mail.CreationTime !HTMLBody = Ol_Mail.HTMLBody !LastModificationTime = Ol_Mail.LastModificationTime !ReceivedByName = Ol_Mail.ReceivedByName !ReceivedTime = Ol_Mail.ReceivedTime !SenderName = Ol_Mail.SenderName !Sent = Ol_Mail.Sent !SentOn = Ol_Mail.SentOn !SenderAddress = Get_sender_exchange(Ol_Mail) !Size = Ol_Mail.Size !Subject = Ol_Mail.Subject !TO = Ol_Mail.TO !UnRead = Ol_Mail.UnRead !RecipientMail = GetSMTPAddressForRecipient(Ol_Mail.Recipients.item(1)) !Attachments = strAttachment !TypeMail = strTypeMail 'On ajoute le type du mail actuel (on peut facilement rajouter des types en recherchant dans les champs du mail une valeur donnée) !NumContact = strNumContact ' On récupère le numéro ou Id du contact actuel On Error Resume Next .Update If (err = 3022 Or err = 0) Then Else MsgBox err & vbCr & err.Description Stop End If On Error GoTo 0 End With strAttachment = "" End If End If Next boucle Compteur = Compteur + 1 With Forms("compteur importation de mails") .Libellé = Format(rsMail!SentOn, "long date") & " de : " & rsMail!SenderName .Compteur = Compteur End With End If Set Ol_Mail = Nothing Set Ol_Attach = Nothing End Sub Function GetSMTPAddressForRecipient(recip As Outlook.Recipient) As String 'Dim recip As Outlook.Recipient Dim pa As Outlook.PropertyAccessor Const PR_SMTP_ADDRESS As String = _ "http://schemas.microsoft.com/mapi/proptag/0x39FE001E" Set pa = recip.PropertyAccessor On Error Resume Next 'Debug.Print recip.Name & " SMTP=" _ & pa.GetProperty(PR_SMTP_ADDRESS) GetSMTPAddressForRecipient = pa.GetProperty(PR_SMTP_ADDRESS) If GetSMTPAddressForRecipient = "" Then GetSMTPAddressForRecipient = recip.Address End Function Private Function Get_sender_exchange(OITEM As Outlook.MailItem) As String Dim oEU As Outlook.ExchangeUser On Error Resume Next Set oEU = OITEM.Sender.GetExchangeUser Get_sender_exchange = oEU.PrimarySmtpAddress If Get_sender_exchange = "" Then Get_sender_exchange = OITEM.SenderEmailAddress End Function
Salut,
Combien as tu de contacts dans ta base access ?
Bonjour Oliv,
Cette base de contacts / prospects contient des centaines de clients et son évolution est prévue pour être exponentielle, on arrivera donc rapidement à des milliers de registres ...
Je me demandais si l'on ne pouvait pas plutôt faire une liaison avec Outlook par automation par VBA vu que les tables liées en automatique ne reprennent pas tous les champs ou bien insérer des contrôles Outlook dans Access qui filtreraient eux même par rapport au numéro de client ?
Cela nous éviterait tout ce code et temps de traitement non ?
Salut,
Déjà tu dois marquer les Emails déjà traités !
Ensuite ce que tu peux faire, aussi mais je ne sais pas si cela sera plus rapide, tu importes tous les Emails dans une table temporaire, ensuite dans access tu fais une jointure entre ta table contact et cette table sur l'adresse Email, et tu ajoutes les lignes.
Oui Oliv, excellente solution d'importer tout et de faire ensuite un filtre en interne, j'y pensais moi aussi ...
par contre rappelle-toi que lorsque j'essaie de pointer sur l'adresse du compte mail il y a le fameux message de débordement de matrice qui apparait , il faudra donc le solutionner...
Je pensais aussi à faire en sorte qu"en donnant une adresse mail globale tous les dossiers de celle ci soient recréés dans Access si besoin ...
Il doit y avoir un champ idmail récupérable en automation qui permettrait de n'importer que les messages nouveaux.
Je trouve l'approche intéressante car une fois en table access on peut faire des centaines de traitements facilement ... Je vais dès que je vais mieux m'y atteler et je partagerai le code ici ...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager