Importer email client a partir d'outlook 2010

kyliann

XLDnaute Nouveau
Bonjour le forum,

Je viens a nouveau vers vous pour une petite aide concernant l'importation des adresse mail de clients.

j'ai bien trouvé un modele de BOISGONTIER qui recherche les mails a partir des noms prénoms.

Outlook est un service courrier d'une entreprise ( exchange) .

Le code que j'ai va bien rechercher les adresses mail mais uniquement dans les contacts personnels de mon compte.

Est il possible que la recherche se face dans la liste globale de l'entreprise et nom dans mes contacts ?

Le code dont je me suis servi !
Sub LectureContacts()
Set olApp = CreateObject("Outlook.Application")
Set olns = olApp.GetNamespace("MAPI")
Set olfFolder = olns.GetDefaultFolder(10)
ligne = 2
On Error Resume Next ' contacts incomplets
For Each i In olfFolder.Items
Cells(ligne, 1) = i.FirstName
Cells(ligne, 2) = i.LastName
Cells(ligne, 3) = i.Email1Address
Cells(ligne, 4) = i.Categories
ligne = ligne + 1
Next i
On Error GoTo 0
[A1].Sort Key1:=[A1], Header:=xlYes
End Sub

Sub AjoutContact()
Set olApp = CreateObject("Outlook.Application")
Set olItem = olApp.CreateItem(2)
With olItem
.FirstName = "zzzzz"
.LastName = "zzzzz"
.Email1Address = "zzzzz@hotmail.com"
.HomeAddressCity = "Montigny"
.Categories = "Professionnel, Personnel"
.Save
End With
End Sub

Je vous remercie d'avance pour votre aide

Kyliann
 

david84

XLDnaute Barbatruc
Re : Importer email client a partir d'outlook 2010

Bonsoir JM,
difficile de te dire ce qui peut se passer puisque chez moi cela ne plante pas.
Combien la liste globale comporte-t-elle d'items (AdEntries.Count) ?
Quelle valeur te ramène
Code:
MsgBox NSpace.ExchangeConnectionMode
?
Comparer la valeur ramenée avec celles indiquées Ce lien n'existe plus pour voir quel est le mode de connection Exchange trouvé comme cela on pourra voir si le mode de connection est le même.
J'ai testé ça de mon côté pour ramener les 1000 premiers items dans une feuille de calcul et je n'ai pas de problème :
Code:
'cocher Microsoft Outlook xx Object Library
  Sub Liste_nom()
  Dim olApp As Outlook.Application
  Dim NSpace As Namespace
  Dim AdList As AddressList
  Dim AdEntries As AddressEntries
  Dim i As Long, T_AdEntries()
  
  [A:B].ClearContents 'efface les valeurs précédentes
  
  On Error Resume Next
  Set olApp = GetObject(, "Outlook.Application") 'cas où une session d'Outlook est déjà ouverte
  If Err.Number <> 0 Then
      Set olApp = New Outlook.Application 'cas où on doit créer une session d'Outlook
      Err.Clear
  End If
  Set NSpace = olApp.GetNamespace("MAPI")
  'on teste si ce compte utilise un serveur Exchange
  If NSpace.ExchangeConnectionMode = olNoExchange Then
    MsgBox "Ce compte n'utilise aucun serveur Exchange"
    Exit Sub
  End If
  
  Set AdList = NSpace.GetGlobalAddressList 'on ramène la liste d'adresses globales
  Set AdEntries = AdList.AddressEntries 'on ramène les entrées d'adresse
  'on stocke les données dans un tableau
  ReDim T_AdEntries(1 To 1000, 1 To 2)
  For i = 1 To 1000 'ou AdEntries.Count mais ca risque d'être long s'il y en a beaucoup
     T_AdEntries(i, 1) = AdEntries.Item(i).Name 'nom
     T_AdEntries(i, 2) = AdEntries.Item(i).GetExchangeUser.PrimarySmtpAddress 'adresse mail
   Next i
   'on copie ces données dans la feuille de calcul
   Range("A1").Resize(UBound(T_AdEntries), 2) = T_AdEntries
  End Sub
A+
 

Staple1600

XLDnaute Barbatruc
Re : Importer email client a partir d'outlook 2010

Re

david84
En faisant des recherches sur GetExchangeUser.PrimarySmtpAddress
je suis tombé sur ceci
source: outlookcode.com
march8 05-May-2009 19:38
Sub GetAddresses()
Dim o, AddressList, AddressEntry
Dim c As Range, r As Range, AddressName As String
Dim user As ExchangeUser
Set o = GetObject(, "Outlook.Application")

Set AddressList = o.Session.AddressLists("Global Address List")
Set r = Range("A1:A2")
For Each c In r
AddressName = c.Value
For Each AddressEntry In AddressList.AddressEntries
If AddressEntry.Name = AddressName Then
Set user = AddressEntry.GetExchangeUser()
c.Offset(0, 1).Value = user.PrimarySmtpAddress
Exit For
End If
Next AddressEntry
Next c
End Sub

I am sorry i was wrong earlier as i thought "/ou.../cn.../recipient..." was an error. I have run the code above but i got stuck on "c.Offset(0, 1).Value = user.PrimarySmtpAddress" it shows error - Run-time error '91': Object variable or with block variable not set. May you tell me how to fix this error?
Et la réponse donnée était
Sue Mosher 06-May-2009 08:08
Please reread my earlier response. olExchangeUserAddressEntry is a constant, part of the enumeration used by the AddressEntryUserType property.
As I said earlier, you should check the value of that property before invoking GetExchangeUser:

If AddressEntry.AddressEntryUserType = olExchangeUserAddressEntry Then
Set user = AddressEntry.GetExchangeUser()
etc.

Donc demain j'essaierai ceci
(ainsi que le code de ton dernier message)
Code:
Sub GetAddresses()
Dim olApp As Outlook.Application
Dim AddressList, AddressEntry
Dim user As ExchangeUser
Dim i
'Set olApp = GetObject(, "Outlook.Application")
Set olApp = New Outlook.Application
Set AddressList = olApp.Session.AddressLists("Global Address List")
For Each AddressEntry In AddressList.AddressEntries
If AddressEntry.AddressEntryUserType = olExchangeUserAddressEntry Then
Set user = AddressEntry.GetExchangeUser()
ActiveSheet.Cells(i, 1).Value = user.PrimarySmtpAddress
Exit For
End If
i = i + 1
Next AddressEntry
End Sub
 

kyliann

XLDnaute Nouveau
Re : Importer email client a partir d'outlook 2010

Bonjour Staple1600, David84, le forum

David84: je ne sais pas pourquoi mais ton dernier code fonctionne a merveille ce matin.
Cependant, il me recherche les 1000 premiers c'est bien.... si je change par le total cela va me faire beaucoup d'adresse environ 100000 dans exchange........!!!!!
Peut t on egalement ajouter Prénom ?

Moi j'ai les 800 Noms et prénom dans une listes il ne me manque que les email y aurait pas possibiliter de rechercher que les emails concerné ?

Staple160 : je viens d'essayer ton code ansi que celui que tu avait trouver et modifier avec la réponse et cela bug ici
Set AddressList = olApp.Session.AddressLists("Global Address List")

merci a tous les deux
je vous souhaite une bonne journée
 

david84

XLDnaute Barbatruc
Re : Importer email client a partir d'outlook 2010

Bonjour,
Peut t on egalement ajouter Prénom ?
Tu les as puisque
T_AdEntries(i, 1) = AdEntries.Item(i).Name 'nom
te ramène le nom et le prénom.
Moi j'ai les 800 Noms et prénom dans une listes il ne me manque que les email y aurait pas possibiliter de rechercher que les emails concerné ?
2 solutions :
- soit entrer toutes les adresses dans la feuille (traitement long bien sûr mais à ne faire qu'une fois) puis ensuite rechercher dans la feuile de calcul les adresses voulues en utilisant EQUIV
- soit utiliser une condition dans le code via l'utilisation de MATCH en comparant l'adresse mail traitée avec celles présentes dans les 800 adresses afin de ne traiter que celles-ci.
Je te laisse adapter de ton côté maintenant que tu as le code principal.

Staple160 : je viens d'essayer ton code ansi que celui que tu avait trouver et modifier avec la réponse et cela bug ici
Set AddressList = olApp.Session.AddressLists("Global Address List")
Utiliser plutôt
Set AddressList = olApp.Session.AddressLists("Liste d'adresses globale")
car c'est son nom français.
C'est pour cela qu'il me semble a priori préférable d'utiliser la méthode GetGlobalAddressList qui renvoie cette liste plutôt que de l'appeler par son nom en "dur".
Et si l'on veut le type d'adresse entrée on peut le faire :
Code:
    If AdEntries.Item(i).AddressEntryUserType = olExchangeUserAddressEntry Then
      T_AdEntries(i, 1) = AdEntries.Item(i).Name 'nom
      T_AdEntries(i, 2) = AdEntries.Item(i).GetExchangeUser.PrimarySmtpAddress 'adresse mail
    End If
Ceci-dit peut-être que la structure de code fournie par staple traite plus rapidement un grand nombre d'items (à tester).
A+
 
Dernière édition:

kyliann

XLDnaute Nouveau
Re : Importer email client a partir d'outlook 2010

Re David84, Staple1600, Le forum.

Je viens de faire avec le code de david des essais en augmentant progressivement le nombre de recherche

1000 6s ; 20000 1mn44s; 30000 2mn27s; 50000 8mn20s. .................!
je me suis arreté a 50000 pour le moment car je voulais savoir ou commençait la liste des utilisateur.

Elle commence a 33143 lettre A a la ligne 50000 je suis a la lettre B BOU.... ce qui veux dire qu'il y a encore pas mal de lignes.

les 33142 lignes du debut ce sont des lignes qui commence par # ou *

David84
Je viens de voir ton post.
Je te remercie
Je vais essayer avec le code de Staple

@@++ Kyliann
 

david84

XLDnaute Barbatruc
Re : Importer email client a partir d'outlook 2010

Ma liste d'adresses comporte 51281 items.
Avec le code proposé je la traite en 3 mn et 17 sec

Avec une structure For Each cela va plus vite (2 min et 27 sec):
Code:
  Sub Liste_nom()
  Dim olApp As Outlook.Application
  Dim NSpace As Namespace
  Dim AdList As AddressList
  Dim AdEntries As AddressEntries
  Dim AdEntry As AddressEntry
  Dim i As Long, T_AdEntries()
  Dim t
  t = timer
  [A:B].ClearContents 'efface les valeurs précédentes
  
  On Error Resume Next
  Set olApp = GetObject(, "Outlook.Application") 'cas où une session d'Outlook est déjà ouverte
  If Err.Number <> 0 Then
      Set olApp = New Outlook.Application 'cas où on doit créer une session d'Outlook
      Err.Clear
  End If
  Set NSpace = olApp.GetNamespace("MAPI")
  'on teste si ce compte utilise un serveur Exchange
  If NSpace.ExchangeConnectionMode = olNoExchange Then
    MsgBox "Ce compte n'utilise aucun serveur Exchange"
    Exit Sub
  End If
  Set AdList = NSpace.GetGlobalAddressList 'on ramène la liste d'adresses globales
  Set AdEntries = AdList.AddressEntries 'on ramène les entrées d'adresse
  'on stocke les données dans un tableau
  ReDim T_AdEntries(1 To AdEntries.Count, 1 To 2)
  For Each AdEntry In AdEntries
    'If AdEntries.Item(i).AddressEntryUserType = olExchangeUserAddressEntry Then
      i = i + 1
      T_AdEntries(i, 1) = AdEntry.Name 'nom
      T_AdEntries(i, 2) = AdEntry.GetExchangeUser.PrimarySmtpAddress 'adresse mail
    'End If
   Next AdEntry
   'on copie ces données dans la feuille de calcul
   Range("A1").Resize(UBound(T_AdEntries), 2) = T_AdEntries
   MsgBox timer - t
  End Sub

David84 : je ne comprend pas le sens peut tu m'expliquer ??
Et si l'on veut le type d'adresse entrée on peut le faire
Je m'adressais à staple qui évoquait cette piste dans son dernier message.
A+
 

kyliann

XLDnaute Nouveau
Re : Importer email client a partir d'outlook 2010

Re a tous,

Avec une structure For Each cela va plus vite (2 min et 27 sec):
Ok je vais essayer sur un second PC ce code EDIT: 166336 en 9mn46s

Je pense que dans ma societe , il y a au environ de 200 000 adresses
je viens de lancer avec le premier code une recherche a 400 000 on va bien voir.EDIT : 166336 en 29mm36s
Je m'adressais à staple qui évoquait cette piste dans son dernier message.
ok

@@+++
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Importer email client a partir d'outlook 2010

Bonsoir à tous________________________EDITION: Bonsoir JCGL

david84
Ton code du message #22 fonctionne sans erreur: (XP-XL2010)
49 secondes si Outlook est ouvert (53 s'il ne l'est pas) -> pour environ 7500 items recopiés dans la feuille
Alors je dis chapeau bas;)

Par contre le code* qui générait l'erreur, la génère toujours (*celui du message # 7)
Et je n'arrive pas à comprendre le pourquoi de l'erreur ?
Une idée ??

EDITION: J'en déduis que c'est ceci
If NSpace.ExchangeConnectionMode = olNoExchange Then
MsgBox "Ce compte n'utilise aucun serveur Exchange"
Exit Sub
End If
qui fait que je n'ai plus erreur.
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Importer email client a partir d'outlook 2010

Re
Merci les amis !
@JM : si le compte sur lequel tu testes n'utilise aucun serveur Exchange effectivement ça plante mais à ce moment-là le message de la MsgBox est déclenché et concernant le code du message #7 cela plante à
Set AdList = NSpace.GetGlobalAddressList
. Mais sinon je ne vois pas...à quelle ligne cela plante ?
A+
 

Staple1600

XLDnaute Barbatruc
Re : Importer email client a partir d'outlook 2010

Re

david84
Avec le code du message #7
Comme je le disais, cela plante au bout d'une trentaine d'adresses extraites
et c'est cette ligne qui est surlignée
[highlight]Debug.Print AdEntries.Item(i).GetExchangeUser.PrimarySmtpAddress[/code]
Et le message d'erreur est
Erreur d'éxécution '91' variable objet ou variable de bloc with non définie

Or je n'ai pas ce message d'erreur avec le code du message #22 ??

Et au boulot, on utilises bien un serveur Exchange
PS: Je ne suis plus au boulot, donc je ne peux faire de tests ce soir.

NB: L'espace en trop dans Addre ss c'est un bug d'affichage de vbullettin
Dans le VBA, le code est bien celui du message #7 sans l'espace en trop.
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Importer email client a partir d'outlook 2010

Donc ce n'est pas la partie
Code:
If NSpace.ExchangeConnectionMode = olNoExchange Then
MsgBox "Ce compte n'utilise aucun serveur Exchange"
Exit Sub
End If
qui influe sur le bon déroulement de ce code puisqu'il intervient avant l'entrée dans la boucle.
Je testerai à nouveau pour voir si cela plante de mon côté.
A+
 

kyliann

XLDnaute Nouveau
Re : Importer email client a partir d'outlook 2010

Bonsoir a tous, le forum.

Un grand merci a David84 et a Staple1600 et tout le fil sans oublier le forum ou chacun nous aide !!!! et moi qui suis encore un novice , c'est vraiment sympa !

J'ai donc extrait toute la base exchange 166336 adresses....!!!! J'ai fait du ménage dans la base, il me reste environ 120.000 données ce qui fait encore énorme.... Lol !!! mon fichier est alourdi de 13 Mo !!!!

1 - Il va falloir que je trouve une solution afin de rechercher les emails des 800 clients de ma liste en 1 seul fois ( il y a des noms et prénoms en double mais ce sont des personnes différentes et la chance que j'ai c'est le service d'appartenance est entre parenthese dans la liste : exemple: TOTO Philippe ( SERVICE COMPTA PARIS)

2 - ensuite dans USF d'ajout de nouveau client il va falloir que j'ajoute une solution de recherche pour sortir le mail et le mettre sur la bonne feuille. , nous avons toujours au moins le nom et le prénom.

3 - une question lorsque je suis sur outlook 2010, et que j'ouvre le carnet d'adresse j'arrive soi dans la liste global soit dans mon carnet perso . est il possible par macro sur mon USF d'ouvrir outlook et cette fenetre de contact ( directement sur liste globale) ce qui me permettrait d’alléger mon fichier des 12Mo de données ?

Encore merci a tous
Je vous souhaite une bonne soirée

Amicalement
Kyliann
 

david84

XLDnaute Barbatruc
Re : Importer email client a partir d'outlook 2010

Bonjour,

une question lorsque je suis sur outlook 2010, et que j'ouvre le carnet d'adresse j'arrive soi dans la liste global soit dans mon carnet perso . est il possible par macro sur mon USF d'ouvrir outlook et cette fenetre de contact ( directement sur liste globale) ce qui me permettrait d’alléger mon fichier des 12Mo de données ?

Le plus simple est de placer un fichier exemple avec juste l'userform et son code et si besoin quelques données pour faire fonctionner ta macro.
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 106
Messages
2 085 352
Membres
102 871
dernier inscrit
Maïmanko