Ce code sert a transferer des email d'un répertoire outlook a un autre, a sauvegarder les mails et pieces jointes et a cocher un champ acces quand vous avec recu la piece jointe...
Il traite les mails dans l'ordre d'arrivé.
Un petit compteur pour le temps d'execution...
Source / Exemple :
'library a charger menu "outil" "reference": Microsoft ActiveX Data Objects 2.7 library
'ouverture de la table access "vérification siges.mdb" passe la valeur du champ "siges recu" de false a TRUE
'plante en cas d'élément different de mail!! (ex: evenement outlook)
Dim trouvé As Boolean
Dim objoutlook As Outlook.Application
Dim olns As Outlook.NameSpace
Dim mItem As Outlook.MailItem
Dim att As Outlook.Attachment
Dim fld As Outlook.MAPIFolder
Dim CompteurMAIL, compteurDES, compteurSIGES As Integer
Dim compteurMAJAcces As Integer
Dim message, NomDeMAILSurDisque, NomdEMAIL As String
Dim RepertoireMAIL, RepertoireSIGESBR, RepertoireSIGESMG, RepertoireSIGESVF As String
Dim RepertoireSIGESBR2, RepertoireSIGESMG2, RepertoireSIGESVF2 As String
Dim RepertoireSIGESnonzipBR, RepertoireSIGESnonzipMG, RepertoireSIGESnonzipVF As String
Dim RepertoireDESBR, RepertoireDESMG, RepertoireDESVF As String
Dim NomDeFichierSurDisque, NomDeFichier, Taille, nom, Emetteur, nomTest As String
Option Explicit
Public Sub TransfertPJAccessV3()
On Error GoTo errorhandler
'déclaration des variables locales
Dim b, a As Integer
Dim i, j, x As Integer
Dim racine As String
Dim d1 As Date, DateEnvoi1 As Date, DateEnvoi2 As Date, dFin As Date, dInter As Date
'Création de l'objet Outlook
Set objoutlook = CreateObject("Outlook.application")
'Récupération de l'espace de nom d'outlook
Set olns = objoutlook.GetNamespace("MAPI")
'Récupération du répertoire "boite de réception" par défault
Set fld = olns.GetDefaultFolder(olFolderInbox)
' Initialisation des reperetoires de sauvegarde
' ne pas oublier l'anti-slash à la fin du repertoire
racine = "S:\06 CARD\02_CARD\Applications\SIGES\Reprise\"
RepertoireSIGESBR = racine & "SIGES\BR\00_SIGES_Compresses\"
RepertoireSIGESVF = racine & "SIGES\VF\00_SIGES_Compresses\"
RepertoireSIGESMG = racine & "SIGES\MG\00_SIGES_Compresses\"
RepertoireSIGESnonzipBR = racine & "SIGES\BR\01_SIGES_A_MAJ\"
RepertoireSIGESnonzipVF = racine & "SIGES\VF\01_SIGES_A_MAJ\"
RepertoireSIGESnonzipMG = racine & "SIGES\MG\01_SIGES_A_MAJ\"
'Repertoire = "M:\Siges_recus\export PJ outlook\"
RepertoireSIGESBR2 = "M:\Siges_recus\export SIGES outlook\BR\"
RepertoireSIGESVF2 = "M:\Siges_recus\export SIGES outlook\VF\"
RepertoireSIGESMG2 = "M:\Siges_recus\export SIGES outlook\MG\"
RepertoireDESBR = racine & "Ventes\BR\00_fichiers_Compresses\"
RepertoireDESVF = racine & "Ventes\VF\00_fichiers_Compresses\"
RepertoireDESMG = racine & "Ventes\MG\00_fichiers_Compresses\"
RepertoireMAIL = "M:\Siges_recus\export MAIL outlook\"
'Inialisation des variables Message, NomDeFichier, NomDeFichierSurDisque, Taille, Emetteur
message = NomDeMAILSurDisque = NomDeFichierSurDisque = nom = NomDeFichier = Taille = Emetteur = ""
' Initialisation
CompteurMAIL = 0
compteurSIGES = 0
compteurDES = 0
compteurMAJAcces = 0
' Sauve les pieces jointes des mails se trouvant dans la boîte de réception.
' Pour adresser un dossier dans la boite de réception on pourrait utiliser :
'fld.Folders(".SIGES").Items
' Confirmation du début de la procedure de traitement
a = MsgBox("Etes-vous sûr de vouloir lancer la récupérations des (Mails / Pieces jointes) contenus dans .SIGES?", vbYesNo)
If (a <> 6) Then Exit Sub
d1 = Time
début:
x = 0
i = 1
j = fld.Folders(".SIGES").Items.Count
If j = 0 Then GoTo fin
DateEnvoi1 = fld.Folders(".SIGES").Items(1).ReceivedTime
For i = 1 To j
DateEnvoi2 = fld.Folders(".SIGES").Items(i).ReceivedTime
If DateEnvoi2 < DateEnvoi1 Then DateEnvoi1 = DateEnvoi2
Next
For i = 1 To j
If fld.Folders(".SIGES").Items(i).ReceivedTime = DateEnvoi1 Then x = i
Next
'**Boucle pour parcourir tous les MAIL du répertoire ".SIGES" de la boite de reception
For Each mItem In fld.Folders(".SIGES").Items
If mItem.ReceivedTime = DateEnvoi1 Then
Taille = mItem.Size
Emetteur = mItem.SenderName
NomdEMAIL = mItem.Subject
nom = NomdEMAIL
'supression des caratères qui bloquent le programme au niveau de l'objet pour la sauvegarde du mail sur disque.
Do While InStr(1, nom, ":") <> 0
nom = Left(nom, InStr(1, nom, ":") - 1) & " " & Right(nom, Len(nom) - InStr(1, nom, ":"))
Loop
Do While InStr(1, nom, "/") <> 0
nom = Left(nom, InStr(1, nom, "/") - 1) & " " & Right(nom, Len(nom) - InStr(1, nom, "/"))
Loop
Do While InStr(1, nom, "\") <> 0
nom = Left(nom, InStr(1, nom, "\") - 1) & " " & Right(nom, Len(nom) - InStr(1, nom, "\"))
Loop
Do While InStr(1, nom, ";") <> 0
nom = Left(nom, InStr(1, nom, ";") - 1) & " " & Right(nom, Len(nom) - InStr(1, nom, ";"))
Loop
Do While InStr(1, nom, ".") <> 0
nom = Left(nom, InStr(1, nom, ".") - 1) & " " & Right(nom, Len(nom) - InStr(1, nom, "."))
Loop
Do While InStr(1, nom, "'") <> 0
nom = Left(nom, InStr(1, nom, "'") - 1) & " " & Right(nom, Len(nom) - InStr(1, nom, "'"))
Loop
Do While InStr(1, nom, "?") <> 0
nom = Left(nom, InStr(1, nom, "?") - 1) & " " & Right(nom, Len(nom) - InStr(1, nom, "?"))
Loop
Do While InStr(1, nom, "%") <> 0
nom = Left(nom, InStr(1, nom, "%") - 1) & " " & Right(nom, Len(nom) - InStr(1, nom, "%"))
Loop
Do While InStr(1, nom, "^") <> 0
nom = Left(nom, InStr(1, nom, "^") - 1) & " " & Right(nom, Len(nom) - InStr(1, nom, "^"))
Loop
'exclusion du double cote "
Do While InStr(1, nom, Chr(34)) <> 0
nom = Left(nom, InStr(1, nom, Chr(34)) - 1) & " " & Right(nom, Len(nom) - InStr(1, nom, Chr(34)))
Loop
'exclusion de étoile *
Do While InStr(1, nom, Chr(42)) <> 0
nom = (Left(nom, InStr(1, nom, Chr(42)) - 1) & " " & Right(nom, Len(nom) - InStr(1, nom, Chr(42))))
Loop
NomdEMAIL = nom
'nomTest = mItem.Name
NomDeMAILSurDisque = Emetteur & " " & Taille & " octet " & NomdEMAIL & ".msg"
'copie du MAIL sous forme spéciale sur archive
mItem.SaveAs (RepertoireMAIL & NomDeMAILSurDisque)
'compte les nombres de mail copiés
CompteurMAIL = CompteurMAIL + 1
'Initialisation de la boucle
i = 1
'Boucle pour faire toutes les pieces jointes d'un mail
Do While i < mItem.Attachments.Count + 1
' Nom du fichier modifié pour l'enregistrement. Evite les controles superflus en renommant.
'Taille = mItem.Size
'Emetteur = mItem.SenderName
NomDeFichier = mItem.Attachments.Item(i).FileName
'elements de taille du message permet la copie meme en cas de pieces jointes identiques sur messages différents
NomDeMAILSurDisque = Emetteur & " (" & Taille & " octets) " & NomdEMAIL
NomDeFichierSurDisque = NomDeFichier
'mItem.Attachments.Item(i).SaveAsFile Repertoire & NomDeFichierSurDisque
With mItem.Attachments.Item(i)
Select Case Right(NomDeFichier, 3)
Case "zip":
Select Case Left(NomDeFichier, 8)
Case "SIGES_BR":
.SaveAsFile RepertoireSIGESBR & NomDeFichierSurDisque
.SaveAsFile RepertoireSIGESBR2 & NomDeFichierSurDisque
compteurSIGES = compteurSIGES + 1
Case "SIGES_MG":
.SaveAsFile RepertoireSIGESMG & NomDeFichierSurDisque
.SaveAsFile RepertoireSIGESMG2 & NomDeFichierSurDisque
compteurSIGES = compteurSIGES + 1
Case "SIGES_AR":
.SaveAsFile RepertoireSIGESVF & NomDeFichierSurDisque
.SaveAsFile RepertoireSIGESVF2 & NomDeFichierSurDisque
compteurSIGES = compteurSIGES + 1
End Select
Select Case Left(NomDeFichier, 13)
Case "DESCRIPTIF_BR":
.SaveAsFile RepertoireDESBR & NomDeFichierSurDisque
compteurDES = compteurDES + 1
Case "DESCRIPTIF_MG":
.SaveAsFile RepertoireDESMG & NomDeFichierSurDisque
compteurDES = compteurDES + 1
Case "DESCRIPTIF_AR":
.SaveAsFile RepertoireDESVF & NomDeFichierSurDisque
compteurDES = compteurDES + 1
End Select
Case "xls":
Select Case Left(NomDeFichier, 8)
Case "SIGES_BR":
.SaveAsFile RepertoireSIGESnonzipBR & NomDeFichierSurDisque
.SaveAsFile RepertoireSIGESBR2 & NomDeFichierSurDisque
compteurSIGES = compteurSIGES + 1
Case "SIGES_MG":
.SaveAsFile RepertoireSIGESnonzipMG & NomDeFichierSurDisque
.SaveAsFile RepertoireSIGESMG2 & NomDeFichierSurDisque
compteurSIGES = compteurSIGES + 1
Case "SIGES_AR":
.SaveAsFile RepertoireSIGESnonzipVF & NomDeFichierSurDisque
.SaveAsFile RepertoireSIGESVF2 & NomDeFichierSurDisque
compteurSIGES = compteurSIGES + 1
End Select
End Select
Select Case Left(NomDeFichier, 8)
Case "SIGES_BR":
Call aCCesBR
Case "SIGES_AR":
Call aCCesAR
Case "SIGES_MG":
Call aCCesMG
End Select
End With
i = i + 1
Loop
'marquer comme non lu et transferer le message dans le repertoire .SIGES sauvé
fld.Folders(".SIGES").Items(x).UnRead = True ' marqueur message non lu
fld.Folders(".SIGES").Items(x).Move fld.Folders(".SIGES extraits")
End If
Next
GoTo début:
fin:
'***Calcul du temps de traitement
dFin = Time
dInter = dFin - d1
' Message du nombre de PJ enregisté
If CompteurMAIL > 0 Then
MsgBox " -> " & CompteurMAIL & " MAIL copié(s) dans " & _
"" & RepertoireMAIL & Chr(13) & _
" -> " & compteurSIGES & _
" SIGES copié(s) dans" & Chr(13) & " - S:\06 CARD\02_CARD\Applications\SIGES\Reprise\SIGES\" & Chr(13) & _
" - M:\Siges_recus\export PJ outlook\" & Chr(13) & _
" -> " & compteurDES & " Descriptifs copié(s) dans S:\06 CARD\02_CARD\Applications\SIGES\Reprise\Ventes" & Chr(13) & _
" -> " & compteurMAJAcces & " Mises à jour ACCESS " & Chr(13) & _
" -> Temps de traitement : " & Format(Hour(dInter), "00") & "h:" & _
Format(Minute(dInter), "00") & "min:" & Format(Second(dInter), "00") & "sec.", _
vbInformation, "Fin de procédure de Récupération des Pièces-jointes et de sauvegarde des Mails"
Else
b = MsgBox("Aucun message a traiter")
End If
'Dé-instanciation
Set objoutlook = Nothing
Set olns = Nothing
Set fld = Nothing
Exit Sub
errorhandler:
MsgBox Err.Description, , Err.Source
End Sub
'*********
'Fonctions de modifs ACCES non optimiser en place: facturation au kilo :-p
'*********
Function aCCesBR()
Dim db As New ADODB.Connection
Dim rs As New ADODB.Recordset
'Ouvre la base de données Access
db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=S:\06 CARD\02_CARD\Applications\SIGES\Reprise\SIGES\Vérification SIGES.mdb"
'Ouvre une table
rs.Open "SIGES_BR", db, adOpenStatic, adLockOptimistic
'Contrôle si il y a au moins une ligne
If rs.RecordCount > 0 Then
'Fais une boucle jusqu'à la dernière ligne
rs.MoveFirst
trouvé = False
Do While rs.EOF = False And trouvé = False
'Modifie la valeur
If rs.Fields("N° Section").Value = Mid(NomDeFichierSurDisque, 7, 5) Then
rs.Fields("reçu SIGES").Value = True 'Nouvelle valeur
trouvé = True
compteurMAJAcces = compteurMAJAcces + 1
End If
'Enregistre
rs.Update
'Va au suivant
rs.MoveNext
Loop
End If
'Ferme
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
End Function
Function aCCesMG()
Dim db As New ADODB.Connection
Dim rs As New ADODB.Recordset
'Ouvre la base de données Access
db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=S:\06 CARD\02_CARD\Applications\SIGES\Reprise\SIGES\Vérification SIGES.mdb"
'Ouvre une table
rs.Open "SIGES_MGB", db, adOpenStatic, adLockOptimistic
'Contrôle si il y a au moins une ligne
If rs.RecordCount > 0 Then
'Fais une boucle jusqu'à la dernière ligne
rs.MoveFirst
trouvé = False
Do While rs.EOF = False And trouvé = False
'Modifie la valeur
If rs.Fields("N° Section").Value = Mid(NomDeFichierSurDisque, 7, 5) Then
rs.Fields("reçu SIGES").Value = True 'Nouvelle valeur
trouvé = True
compteurMAJAcces = compteurMAJAcces + 1
End If
'Enregistre
rs.Update
'Va au suivant
rs.MoveNext
Loop
End If
'Ferme
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
End Function
Function aCCesAR()
Dim db As New ADODB.Connection
Dim rs As New ADODB.Recordset
'Ouvre la base de données Access
db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=S:\06 CARD\02_CARD\Applications\SIGES\Reprise\SIGES\Vérification SIGES.mdb"
'Ouvre une table
rs.Open "SIGES_VDF", db, adOpenStatic, adLockOptimistic
'Contrôle si il y a au moins une ligne
If rs.RecordCount > 0 Then
'Fais une boucle jusqu'à la dernière ligne
rs.MoveFirst
trouvé = False
Do While rs.EOF = False And trouvé = False
'Modifie la valeur
If rs.Fields("N° Section").Value = Mid(NomDeFichierSurDisque, 7, 5) Then
rs.Fields("reçu SIGES").Value = True 'Nouvelle valeur
trouvé = True
compteurMAJAcces = compteurMAJAcces + 1
End If
'Enregistre
rs.Update
'Va au suivant
rs.MoveNext
Loop
End If
'Ferme
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
End Function
Conclusion :
J'ai utilisé diverses sources de VBfrance alors je poste ma production pour eventuellement aider quelqu'un autant que ce site m'a aidé...
excusez la qualité du code qui n'est pas fameuse (notement la boucle de recherche du premier mail recu) mais il marche bien :-)