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 :

Automation depuis Access ne fonctionne plus


Sujet :

VBA Outlook

  1. #41
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Merci mille fois Oliv

    Je vais essayer ça dès que je peux, je te tiens au courant

    Bon Week-end

  2. #42
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    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

  3. #43
    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
    Citation Envoyé par clickandgo Voir le message
    Bon, ça marche presque nickel
    Salut,
    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 ?
    Combien as tu d'éléments dans ce dossier ?
    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 !


    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 ?
    je comprends pas ce dont tu parles

    3/ Une erreur 91 "variable non définie bloc with" apparait uniquement après importation du dossier "boite de réception"
    où ?

    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 ?
    tu peux selectionner avec pickfolder la racine !

    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
    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 )

  4. #44
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par Oliv- Voir le message
    Salut,

    Combien as tu d'éléments dans ce dossier ?
    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 !

    Il me semble que c'était ce que l'on faisait déjà en scannant les 3 possibles adresses mails du contact
    La boucle sert à attribuer l'argument "envoyé" et "reçu" ainsi que rapatrier le numéro de contact pour chaque mail trouvé en traitant l'envoi puis la réception
    Je suis ouvert à toute suggestion et amélioration de ce code car en effet il semble un peu complexe au niveau filtre et comme souvent ce que l'on recherche c'est l'efficacité de ce code / gain d’exécution.
    Si l'on peut en une seule passe tout traiter et décomplexifier le code allons y !




    je comprends pas ce dont tu parles


    où ?



    tu peux selectionner avec pickfolder la racine !

    Oui, et c'est là qu'apparait le message "Index de la matrice hors des limites"
    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 )
    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

  5. #45
    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,
    Combien as tu de contacts dans ta base access ?

  6. #46
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    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 ?

  7. #47
    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,
    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.

  8. #48
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    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 ...

Discussions similaires

  1. Réponses: 13
    Dernier message: 16/04/2013, 21h01
  2. Réponses: 0
    Dernier message: 14/04/2013, 21h16
  3. Réponses: 1
    Dernier message: 05/09/2011, 20h44
  4. Access ne fonctionne plus en réseau après compactage
    Par gbzmt dans le forum VBA Access
    Réponses: 6
    Dernier message: 13/04/2008, 19h06
  5. mes requetes sous access ne fonctionnent plus
    Par trialrofr dans le forum ASP
    Réponses: 12
    Dernier message: 04/12/2004, 21h52

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