OVH Cloud OVH Cloud

Outlook 2000 VBA Supprimer les contacts d'une catégorie

17 réponses
Avatar
Céline Brien
Bonjour à tous et à toutes,
Quelqu'un peut-il me refiler les codes VBA pour supprimer tous les
contacts appartenant à une catégorie ?
Merci de votre aide,
Céline

10 réponses

1 2
Avatar
Anor
Bonjour,

"Céline Brien" a écrit dans le message de
news:%
| Bonjour à tous et à toutes,
| Quelqu'un peut-il me refiler les codes VBA pour supprimer tous les
| contacts appartenant à une catégorie ?
| Merci de votre aide,
| Céline

Je suppose que tu peux détourner le code suivant :
http://memoaccess.free.fr/outlook.htm#ReadContacts

il suffit de tester la valeur de la propriété qui correspond à la catégorie recherchée
dans une clause IF...THEN
puis d'utiliser la méthode .delete qui devrait être supportée par l'objet OlItems.


--
à+
Arnaud
--------------------------------------------------
Access Memorandum : http://memoaccess.free.fr
/Réponses souhaitées sur ce forum, merci/
--------------------------------------------------
Avatar
Céline Brien
Bonjour à tous,
Merci Arnaud pour ta réponse.
Je vais tenter le détournement !
Bon samedi,
Céline

"Anor" <http://memoaccess.free.fr/anor/email.htm> a écrit dans le
message de news:407705ab$0$21167$

Bonjour,

"Céline Brien" a écrit dans le message
de

news:%
| Bonjour à tous et à toutes,
| Quelqu'un peut-il me refiler les codes VBA pour supprimer tous les
| contacts appartenant à une catégorie ?
| Merci de votre aide,
| Céline

Je suppose que tu peux détourner le code suivant :
http://memoaccess.free.fr/outlook.htm#ReadContacts

il suffit de tester la valeur de la propriété qui correspond à la
catégorie recherchée

dans une clause IF...THEN
puis d'utiliser la méthode .delete qui devrait être supportée par
l'objet OlItems.



--
à+
Arnaud
--------------------------------------------------
Access Memorandum : http://memoaccess.free.fr
/Réponses souhaitées sur ce forum, merci/
--------------------------------------------------




Avatar
Céline Brien
Bonjour à toutes et à tous,
À la suggestion de Anor, j'ai tenté de détourner le code suivant :
http://memoaccess.free.fr/outlook.htm#ReadContacts
en ajoutant une clause IF... THEN. Voir mes codes ci-dessous.
Sans succès :-(
Quelqu'un peut m'aider ?
Merci,
Céline
-------------------------------------------------------------------
Sub DeleteOutlookContacts()
On Error Resume Next
Dim StrContacts As String

Dim OlApp As New Outlook.Application
Dim OlMapi As Outlook.NameSpace
Dim OlFolder As Outlook.MAPIFolder
Dim OlItems As Outlook.Items
Dim OlContact As Outlook.ContactItem

Set OlMapi = OlApp.GetNamespace("MAPI")
Set OlFolder = OlMapi.GetDefaultFolder(olFolderContacts)
Set OlItems = OlFolder.Items

For Each OlContact In OlItems
If OlContact.Categories = "Excel" Then
OlContact.Delete
End If
Next OlContact

MsgBox StrContacts

Set OlContact = Nothing
Set OlItems = Nothing
Set OlFolder = Nothing
Set OlMapi = Nothing
Set OlApp = Nothing

End Sub
-------------------------------------------------------------------



"Anor" <http://memoaccess.free.fr/anor/email.htm> a écrit dans le

message de news:407705ab$0$21167$

Bonjour,

"Céline Brien" a écrit dans le message
de

news:%
| Bonjour à tous et à toutes,
| Quelqu'un peut-il me refiler les codes VBA pour supprimer tous les
| contacts appartenant à une catégorie ?
| Merci de votre aide,
| Céline

Je suppose que tu peux détourner le code suivant :
http://memoaccess.free.fr/outlook.htm#ReadContacts

il suffit de tester la valeur de la propriété qui correspond à la
catégorie recherchée

dans une clause IF...THEN
puis d'utiliser la méthode .delete qui devrait être supportée par
l'objet OlItems.



--
à+
Arnaud
--------------------------------------------------
Access Memorandum : http://memoaccess.free.fr
/Réponses souhaitées sur ce forum, merci/
--------------------------------------------------




Avatar
Anor
Bonjour,

je viens de tester et cela fonctionne sur Outlook 2002.
Tu es sure d'avoir saisi "Excel" dans la propriété categories
de tes contacts ?

essaye de faire avancer le code en mode pas à pas pour voir
si c'est la catégorie qui n'est pas lue ou la suppression qui ne fonctionne pas.

Si je mets la valeur "Excel" et que je la teste comme tu fais,
le contact est bien supprimé.

--
à+
Arnaud
--------------------------------------------------
Conseils d'utilisation : http://users.skynet.be/mpfa/
Access Memorandum : http://memoaccess.free.fr
/Réponses souhaitées sur ce forum, merci/
--------------------------------------------------



Céline Brien wrote:
| Bonjour à toutes et à tous,
| À la suggestion de Anor, j'ai tenté de détourner le code suivant :
| http://memoaccess.free.fr/outlook.htm#ReadContacts
| en ajoutant une clause IF... THEN. Voir mes codes ci-dessous.
| Sans succès :-(
| Quelqu'un peut m'aider ?
| Merci,
| Céline
| -------------------------------------------------------------------
| Sub DeleteOutlookContacts()
| On Error Resume Next
| Dim StrContacts As String
|
| Dim OlApp As New Outlook.Application
| Dim OlMapi As Outlook.NameSpace
| Dim OlFolder As Outlook.MAPIFolder
| Dim OlItems As Outlook.Items
| Dim OlContact As Outlook.ContactItem
|
| Set OlMapi = OlApp.GetNamespace("MAPI")
| Set OlFolder = OlMapi.GetDefaultFolder(olFolderContacts)
| Set OlItems = OlFolder.Items
|
| For Each OlContact In OlItems
| If OlContact.Categories = "Excel" Then
| OlContact.Delete
| End If
| Next OlContact
|
| MsgBox StrContacts
|
| Set OlContact = Nothing
| Set OlItems = Nothing
| Set OlFolder = Nothing
| Set OlMapi = Nothing
| Set OlApp = Nothing
|
| End Sub
| -------------------------------------------------------------------
|
Avatar
Grég
Bonjour/soir,

La macro fonctionne aussi sous OL2K, MAIS "Excel" doit être la seule
catégorie définie pour le contact.

--
Grég


"Céline Brien" a écrit dans le message de
news:u0ho9%
Bonjour à toutes et à tous,
À la suggestion de Anor, j'ai tenté de détourner le code suivant :
http://memoaccess.free.fr/outlook.htm#ReadContacts
en ajoutant une clause IF... THEN. Voir mes codes ci-dessous.
Sans succès :-(
Quelqu'un peut m'aider ?
Merci,
Céline
-------------------------------------------------------------------
Sub DeleteOutlookContacts()
On Error Resume Next
Dim StrContacts As String

Dim OlApp As New Outlook.Application
Dim OlMapi As Outlook.NameSpace
Dim OlFolder As Outlook.MAPIFolder
Dim OlItems As Outlook.Items
Dim OlContact As Outlook.ContactItem

Set OlMapi = OlApp.GetNamespace("MAPI")
Set OlFolder = OlMapi.GetDefaultFolder(olFolderContacts)
Set OlItems = OlFolder.Items

For Each OlContact In OlItems
If OlContact.Categories = "Excel" Then
OlContact.Delete
End If
Next OlContact

MsgBox StrContacts

Set OlContact = Nothing
Set OlItems = Nothing
Set OlFolder = Nothing
Set OlMapi = Nothing
Set OlApp = Nothing

End Sub
-------------------------------------------------------------------



"Anor" <http://memoaccess.free.fr/anor/email.htm> a écrit dans le

message de news:407705ab$0$21167$

Bonjour,

"Céline Brien" a écrit dans le message
de

news:%
| Bonjour à tous et à toutes,
| Quelqu'un peut-il me refiler les codes VBA pour supprimer tous les
| contacts appartenant à une catégorie ?
| Merci de votre aide,
| Céline

Je suppose que tu peux détourner le code suivant :
http://memoaccess.free.fr/outlook.htm#ReadContacts

il suffit de tester la valeur de la propriété qui correspond à la
catégorie recherchée

dans une clause IF...THEN
puis d'utiliser la méthode .delete qui devrait être supportée par
l'objet OlItems.



--
à+
Arnaud
--------------------------------------------------
Access Memorandum : http://memoaccess.free.fr
/Réponses souhaitées sur ce forum, merci/
--------------------------------------------------







Avatar
Céline Brien
Bonjour à toutes et à tous,
Bonjour Anor,
Bonjour Greg,
Après avoir supprimé la ligne On error resume next (voir codes
ci-dessous), ma macro fonctionne un peu !
1) Après plusieurs boucles j'obtiens soudain un message Erreur
d'exécution 13. Incompatibilité de type. Je me demande si ce n'est pas
les listes de distribution.
2) Tous les contacts de la catégorie Excel ne sont pas supprimés.
J'ai aussi exposé mon problème sur microsoft.public.outlook.program_vba.
Selon Ken, si je veux supprimer tous les contacts de la catégorie je
dois utiliser un compteur.
De plus, si un des contacts est associé à plus d'une catégorie, je dois
utiliser InStr. Toutefois ce n'est pas le cas ici.
Voir sa réponse ci-dessous.
Je n'ai pas réussi à intégrer ces codes.
Quelqu'un peut-il m'aider, je sens que j'approche enfin de la solution.
Merci beaucoup,
Céline
----------------------------------------------------
Sub DeleteOutlookContactsExcelCeline()

Dim StrContacts As String
Dim OlApp As New Outlook.Application
Dim OlMapi As Outlook.NameSpace
Dim OlFolder As Outlook.MAPIFolder
Dim OlItems As Outlook.Items
Dim OlContact As Outlook.ContactItem
Set OlMapi = OlApp.GetNamespace("MAPI")
Set OlFolder = OlMapi.GetDefaultFolder(olFolderContacts)
Set OlItems = OlFolder.Items
For Each OlContact In OlItems
If OlContact.Categories = "Excel" Then
OlContact.Delete
End If
Next OlContact
MsgBox StrContacts
Set OlContact = Nothing
Set OlItems = Nothing
Set OlFolder = Nothing
Set OlMapi = Nothing
Set OlApp = Nothing

End Sub
----------------------------------------------------
For loop used to delete items from a collection should be a down
counting. For loop. Otherwise at best you will delete only half the
items in the collection because the loop index is being changed within
the loop.
For i = Items.Count To 1 Step -1
Categories can hold more than one category. It's probably best not to
use an equality comparison as you are using but to use something like
InStr.
If InStr(1,OlContact.Categories, "Excel") Then
Ken Slovak
[MVP - Outlook]
-----------------------------------------------------
Avatar
Anor
Bonjour,

Céline Brien wrote:
| Bonjour à toutes et à tous,
| Bonjour Anor,
| Bonjour Greg,
| Après avoir supprimé la ligne On error resume next (voir codes
| ci-dessous), ma macro fonctionne un peu !
| 1) Après plusieurs boucles j'obtiens soudain un message Erreur
| d'exécution 13. Incompatibilité de type. Je me demande si ce n'est pas
| les listes de distribution.

c'est possible

une autre test préliminaire :

If OlContact.MessageClass = "IPM.Contact"
If OlContact.MessageClass = "IPM.DistList"

Pour ce que dit Ken, oui on peut remplacer le for each -- next
par : (écrit à la volée non testé)

dim i as integer
for i = OlFolder.Items.count to 1 step -1
set olitems = OlFolder.Items(i)
If OlContact.MessageClass = "IPM.Contact" then
olitems.delete
end if
next i

euh...c'est grosso modo car je suis en train de me mélanger entre OlContact et OlItems, mais
en tatonnant un peu....

enfin, concernant la fonction Instr, cela permet de savoir si la chaîne "Excel" est trouvée dans
le nom de la catégorie qui dans le cas multi-catégoriel, sont séparées par un point-virgule par
exemple ?
(chez moi, ce champ Category est un champ texte ou on ne parle pas du même, alors j'ai du mal à
tester
et te proposer un code fonctionnel...)

--
à+
Arnaud
--------------------------------------------------
Access Memorandum : http://memoaccess.free.fr
/Réponses souhaitées sur ce forum, merci/
--------------------------------------------------

| 2) Tous les contacts de la catégorie Excel ne sont pas supprimés.
| J'ai aussi exposé mon problème sur
| microsoft.public.outlook.program_vba. Selon Ken, si je veux supprimer
| tous les contacts de la catégorie je dois utiliser un compteur.
| De plus, si un des contacts est associé à plus d'une catégorie, je
| dois utiliser InStr. Toutefois ce n'est pas le cas ici.
| Voir sa réponse ci-dessous.
| Je n'ai pas réussi à intégrer ces codes.
| Quelqu'un peut-il m'aider, je sens que j'approche enfin de la
| solution. Merci beaucoup,
| Céline
| ----------------------------------------------------
| Sub DeleteOutlookContactsExcelCeline()
|
| Dim StrContacts As String
| Dim OlApp As New Outlook.Application
| Dim OlMapi As Outlook.NameSpace
| Dim OlFolder As Outlook.MAPIFolder
| Dim OlItems As Outlook.Items
| Dim OlContact As Outlook.ContactItem
| Set OlMapi = OlApp.GetNamespace("MAPI")
| Set OlFolder = OlMapi.GetDefaultFolder(olFolderContacts)
| Set OlItems = OlFolder.Items
| For Each OlContact In OlItems
| If OlContact.Categories = "Excel" Then
| OlContact.Delete
| End If
| Next OlContact
| MsgBox StrContacts
| Set OlContact = Nothing
| Set OlItems = Nothing
| Set OlFolder = Nothing
| Set OlMapi = Nothing
| Set OlApp = Nothing
|
| End Sub
| ----------------------------------------------------
| For loop used to delete items from a collection should be a down
| counting. For loop. Otherwise at best you will delete only half the
| items in the collection because the loop index is being changed within
| the loop.
| For i = Items.Count To 1 Step -1
| Categories can hold more than one category. It's probably best not to
| use an equality comparison as you are using but to use something like
| InStr.
| If InStr(1,OlContact.Categories, "Excel") Then
| Ken Slovak
| [MVP - Outlook]
| -----------------------------------------------------
Avatar
Grég
Bonjour/soir,

En effet, utiliser un for each pour faire du nettoyage dans une collection
n'est pas propre du tout.
A part ça il y a deux autre problèmes dont l'un est que le "compilateur" de
vba est un ###CENSURE###, pas même capable de vérifier que l'on utilise une
constante comme nom de variable.
1/ olContact est une constante
2/ Votre variable OlContact pouvait être autre chose qu'un objet
Outlook.Contactitem d'où l'erreur de type.

Le test que j'ai mis reste un peu large.

Option Explicit
Sub DeleteOutlookContacts()

' On Error Resume Next
Dim StrContacts As String

Dim OlApp As New Outlook.Application
Dim OlMapi As Outlook.NameSpace
Dim OlFolder As Outlook.MAPIFolder
Dim OlItems As Outlook.Items
Dim OlContactItm As Object
Dim LgI As Long

Set OlMapi = OlApp.GetNamespace("MAPI")
Set OlFolder = OlMapi.GetDefaultFolder(olFolderContacts)
Set OlItems = OlFolder.Items

For LgI = OlItems.Count To 1 Step -1
Set OlContactItm = OlItems(LgI)
If OlContactItm.Class = OlContact Then
If OlContactItm.Categories = "Excel" Or InStr(1,
OlContactItm.Categories, "; Excel") Or _
InStr(1, OlContactItm.Categories, "Excel;") Then
OlContactItm.Delete
End If
End If
Next LgI

MsgBox StrContacts

Set OlContactItm = Nothing
Set OlItems = Nothing
Set OlFolder = Nothing
Set OlMapi = Nothing
Set OlApp = Nothing

End Sub


--
Grég




"Céline Brien" a écrit dans le message de
news:%
Bonjour à toutes et à tous,
Bonjour Anor,
Bonjour Greg,
Après avoir supprimé la ligne On error resume next (voir codes
ci-dessous), ma macro fonctionne un peu !
...


Avatar
Anor
Bonjour,

Grég wrote:
| Bonjour/soir,
|
| En effet, utiliser un for each pour faire du nettoyage dans une
| collection n'est pas propre du tout.

la notion de propreté est subjective pour un autodidacte,
mais cela peut effectivement se défendre....

| A part ça il y a deux autre problèmes dont l'un est que le
| "compilateur" de vba est un ###CENSURE###, pas même capable de
| vérifier que l'on utilise une constante comme nom de variable.
| 1/ olContact est une constante
| 2/ Votre variable OlContact pouvait être autre chose qu'un objet
| Outlook.ContactItem d'où l'erreur de type.

En tout cas, là, je dois avouer que c'est parfaitement bien vu ;-)
je n'ai plus qu'à corriger toutes mes déclarations pour les noms d'objets outlook :-(

--
à+
Arnaud
--------------------------------------------------
Access Memorandum : http://memoaccess.free.fr
/Réponses souhaitées sur ce forum, merci/
--------------------------------------------------
Avatar
Grég
Bonjour/soir,

"Anor" <http://memoaccess.free.fr/anor/email.htm> a écrit dans le message de
news:407d8c47$0$22851$
Bonjour,

Grég wrote:
| Bonjour/soir,
|
| En effet, utiliser un for each pour faire du nettoyage dans une
| collection n'est pas propre du tout.

la notion de propreté est subjective pour un autodidacte,
mais cela peut effectivement se défendre....

Je ne savais pas qu'un autodidacte était moins sujet qu'un autre à la

propreté !-) Mais un programme qui a des effets de bords celà peut "salire"
la mémoire à des endroits inattendus !


| A part ça il y a deux autre problèmes dont l'un est que le
| "compilateur" de vba est un ###CENSURE###, pas même capable de
| vérifier que l'on utilise une constante comme nom de variable.
| 1/ olContact est une constante
| 2/ Votre variable OlContact pouvait être autre chose qu'un objet
| Outlook.ContactItem d'où l'erreur de type.

En tout cas, là, je dois avouer que c'est parfaitement bien vu ;-)
je n'ai plus qu'à corriger toutes mes déclarations pour les noms d'objets
outlook :-(


En enlevant quelques voyelles (ou en utilisant du français) on évite
généralement les conflits de ce type.

...


--
Grég

1 2