OVH Cloud OVH Cloud

VBA Outlook renommer des catégories

8 réponses
Avatar
Céline Brien
Bonjour à toutes et à tous,
Dernièrement, j'ai reçu de l'aide de Grég pour créer une macro visant à
supprimer des contacts de la catégorie Excel.
Si je modifie un peu cette macro, est-il possible d'obtenir une macro
pour renommer une catégorie ?
Merci de votre aide,
Céline
--------------------------
Option Explicit
Sub RenommerCategories()
'
' Macro pour renommer une catégorie Outlook
'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_Itm As Object
Dim LgI As Long
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Excel" Or InStr(1,
ol_ContactItm.Categories, "; Excel") Or InStr(1,
ol_ContactItm.Categories, "Excel;") Then
ol_ContactItm.Rename
????? Comment indiquer le nouveau nom ??????
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub

8 réponses

Avatar
Grég
Céline,


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

Si je modifie un peu cette macro, est-il possible d'obtenir une macro
pour renommer une catégorie ?


Il faudra que vous fassiez un peu plus le ménage sur les cas que vous pouvez
avoir suivant que votre catégorie est seule, en début, fin ou milieu de la
chaîne des catégories. Puis, il suffit d'enlever l'ancienne catégorie et de
la remplacer par la nouvelle dans la chaîne, avant de la réaffecter à
ol_item.categories.

en gros
if ol_item.categories = "à changer" then
ol_item.categories = "changée"
else if InStr(1, ol_ContactItm.Categories, "; à changer;") then.
...
else if
End If.


De plus j'ai vu qu'il valait mieux utiliser dans les macros:

Dim ol_App As Outlook.Application
...
ol_App = application

plutôt que "Dim ol_App As New Outlook.Application"

Cela permet d'avoir un code "trusted" avec OL2K3.

--
Grég


--------------------------
Option Explicit
Sub RenommerCategories()
'
' Macro pour renommer une catégorie Outlook
'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_Itm As Object
Dim LgI As Long
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Excel" Or InStr(1,
ol_ContactItm.Categories, "; Excel") Or InStr(1,
ol_ContactItm.Categories, "Excel;") Then
ol_ContactItm.Rename
????? Comment indiquer le nouveau nom ??????
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub



Avatar
Céline Brien
Bonjour à toutes et à tous,
Bonjour Grég,
Merci pour ta réponse.
Avec l'aide de Ken Slovak, forum Outlook en anglais, j'ai réussi à
renommer les catégories des éléments du dossier Contacts (voir codes
ci-dessous).
Il était très important d'enregistrer les éléments : ol_ContactItm.Save
Je croyais que tes codes tenaient compte du fait que votre catégorie est
seule, en début, fin ou milieu de la chaîne des catégories. Voir ligne
suivante :
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
Je vais réviser le tout à partie de tes conseils.
Merci encore,
Céline


Option Explicit
Sub RenommerCategoriesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Ken Slovak, mai 2004
'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub
"Grég" a écrit dans le message de
news:
Céline,


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

news:

Si je modifie un peu cette macro, est-il possible d'obtenir une
macro


pour renommer une catégorie ?


Il faudra que vous fassiez un peu plus le ménage sur les cas que vous
pouvez

avoir suivant que votre catégorie est seule, en début, fin ou milieu
de la

chaîne des catégories. Puis, il suffit d'enlever l'ancienne catégorie
et de

la remplacer par la nouvelle dans la chaîne, avant de la réaffecter à
ol_item.categories.

en gros
if ol_item.categories = "à changer" then
ol_item.categories = "changée"
else if InStr(1, ol_ContactItm.Categories, "; à changer;") then.
...
else if
End If.


De plus j'ai vu qu'il valait mieux utiliser dans les macros:

Dim ol_App As Outlook.Application
...
ol_App = application

plutôt que "Dim ol_App As New Outlook.Application"

Cela permet d'avoir un code "trusted" avec OL2K3.

--
Grég



Avatar
Grég
Céline,


"Céline Brien" a écrit dans le message de
news:
Bonjour à toutes et à tous,
Bonjour Grég,
Merci pour ta réponse.
Avec l'aide de Ken Slovak, forum Outlook en anglais, j'ai réussi à
renommer les catégories des éléments du dossier Contacts (voir codes
ci-dessous).


Attention, votre code ne fait pas que renommer la catégorie "Avant". Si la
catégorie "Avant" est UNE DES catégories de de l'élément alors cet élément
aura ensuite come SEULE catégorie "Après".

Il était très important d'enregistrer les éléments : ol_ContactItm.Save


Oups, j'avais oublié de mettre le .save sous mes tests.

Je croyais que tes codes tenaient compte du fait que votre catégorie est
seule, en début, fin ou milieu de la chaîne des catégories. Voir ligne
suivante :
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then


Je me cite à ce sujet "Le test que j'ai mis reste un peu large." et "Les Or
permettent de gérer les catégories multiples sans retenir celles du
type *Excel*." Par contre je n'ai pas dit qu'il éliminait toutes les
"Excel*" et "*Excel". Votre code peut mettre dans la seule catégorie "Après"
des éléments appartenant à la catégorie "Avant-hier" et "le bidule Avant",
si ces éléments appartiennent à plusieurs catégories.

Pour renommer, il faut donc que vous testiez que si la chaîne n'est pas
"Avant" et ne contient pas "; Avant;", alors "Avant;" doit être en début de
chaîne et "; Avant" en fin de chaîne et remplacer cette sous-chaîne par
celle qui convient.

Je vais réviser le tout à partie de tes conseils.
Merci encore,


C'était un plaisir de vous aider et de vous lire sur
microsoft.public.outlook.program_vba !-))

--
Grég


Céline


Option Explicit
Sub RenommerCategoriesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Ken Slovak, mai 2004
'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub
"Grég" a écrit dans le message de
news:
Céline,


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

news:

Si je modifie un peu cette macro, est-il possible d'obtenir une
macro


pour renommer une catégorie ?


Il faudra que vous fassiez un peu plus le ménage sur les cas que vous
pouvez

avoir suivant que votre catégorie est seule, en début, fin ou milieu
de la

chaîne des catégories. Puis, il suffit d'enlever l'ancienne catégorie
et de

la remplacer par la nouvelle dans la chaîne, avant de la réaffecter à
ol_item.categories.

en gros
if ol_item.categories = "à changer" then
ol_item.categories = "changée"
else if InStr(1, ol_ContactItm.Categories, "; à changer;") then.
...
else if
End If.


De plus j'ai vu qu'il valait mieux utiliser dans les macros:

Dim ol_App As Outlook.Application
...
ol_App = application

plutôt que "Dim ol_App As New Outlook.Application"

Cela permet d'avoir un code "trusted" avec OL2K3.

--
Grég






Avatar
Céline Brien
Bonjour à toutes et à tous,
Bonjour Grég,
Merci beaucoup pour ta réponse.
J'ai intégré les codes que vous m'avez proposés (voir codes ci-dessous).
Si le champ Catégories contient plus qu'un Catégories, je ne peux
renommer seulement une des catégories.
Ou bien je change le contenu du champ Catégories pour obtenir une seule
catégorie.
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
Ou bien je renomme la catégorie seulemement si elle est seule :
If ol_ContactItm.Categories = "Avant" Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
Selon mes tests, les codes suivants sont inutiles :
' ElseIf InStr(1, ol_ContactItm.Categories, ";Avant;") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";;Avant") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
Merci encore pour cette important mise au point,
Céline
------------------------------------------------------------------------
---------------
Option Explicit
Sub RenommerCategoriesMultiplesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Grég et Ken Slovak, mai
2004
' Céline Brien (819) 326-7273
'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_App = Application
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Excel" Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";Excel;") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";;Excel") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub

"Grég" a écrit dans le message de
news:40a8847d$0$10205$
Céline,


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

news:
Bonjour à toutes et à tous,
Bonjour Grég,
Merci pour ta réponse.
Avec l'aide de Ken Slovak, forum Outlook en anglais, j'ai réussi à
renommer les catégories des éléments du dossier Contacts (voir codes
ci-dessous).


Attention, votre code ne fait pas que renommer la catégorie "Avant".
Si la

catégorie "Avant" est UNE DES catégories de de l'élément alors cet
élément

aura ensuite come SEULE catégorie "Après".

Il était très important d'enregistrer les éléments :
ol_ContactItm.Save



Oups, j'avais oublié de mettre le .save sous mes tests.

Je croyais que tes codes tenaient compte du fait que votre catégorie
est


seule, en début, fin ou milieu de la chaîne des catégories. Voir
ligne


suivante :
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then


Je me cite à ce sujet "Le test que j'ai mis reste un peu large." et
"Les Or

permettent de gérer les catégories multiples sans retenir celles du
type *Excel*." Par contre je n'ai pas dit qu'il éliminait toutes les
"Excel*" et "*Excel". Votre code peut mettre dans la seule catégorie
"Après"

des éléments appartenant à la catégorie "Avant-hier" et "le bidule
Avant",

si ces éléments appartiennent à plusieurs catégories.

Pour renommer, il faut donc que vous testiez que si la chaîne n'est
pas

"Avant" et ne contient pas "; Avant;", alors "Avant;" doit être en
début de

chaîne et "; Avant" en fin de chaîne et remplacer cette sous-chaîne
par

celle qui convient.

Je vais réviser le tout à partie de tes conseils.
Merci encore,


C'était un plaisir de vous aider et de vous lire sur
microsoft.public.outlook.program_vba !-))

--
Grég


Céline


Option Explicit
Sub RenommerCategoriesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Ken Slovak, mai
2004


'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub
"Grég" a écrit dans le message de
news:
Céline,


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



de
news:

Si je modifie un peu cette macro, est-il possible d'obtenir une
macro


pour renommer une catégorie ?


Il faudra que vous fassiez un peu plus le ménage sur les cas que
vous



pouvez
avoir suivant que votre catégorie est seule, en début, fin ou
milieu



de la
chaîne des catégories. Puis, il suffit d'enlever l'ancienne
catégorie



et de
la remplacer par la nouvelle dans la chaîne, avant de la
réaffecter à



ol_item.categories.

en gros
if ol_item.categories = "à changer" then
ol_item.categories = "changée"
else if InStr(1, ol_ContactItm.Categories, "; à changer;") then.
...
else if
End If.


De plus j'ai vu qu'il valait mieux utiliser dans les macros:

Dim ol_App As Outlook.Application
...
ol_App = application

plutôt que "Dim ol_App As New Outlook.Application"

Cela permet d'avoir un code "trusted" avec OL2K3.

--
Grég









Avatar
Grég
Céline,

Des petites remarques:

"Dim ol_App As Outlook.Application" au lieu de "Dim ol_App As New
Outlook.Application". Vous assignez ol_App à application, comme l'on doit
faire maintenant, au début de votre code, donc avec New vous créez un objet
inutilement.

Les tests supplémentaires, comme ajoutés ci-dessous vous permettent de
renommer la catégorie "Avant" en "Après" sans toucher aux éventuelles autres
catégories des contacts.

Vous pouvez d'ailleurs utiliser les tests un peu plus précis que j'ai fait
pour votre fonction de suppression. cela vous évitera de supprimer un
élément appartenant à une catégorie qui contient "Avant" sans être "Avant".

--
Grég


Sub RenommerCategoriesMultiplesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Grégoire Sandré et Ken
Slovak, mai 2004
' Céline Brien (819) 326-7273
'
Const T_BEF = "Avant"
Const T_AFT = "Après"
Dim ol_App As Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Dim strTmp As String

Set ol_App = Application
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items

For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = OlContact Then
If ol_ContactItm.Categories = T_BEF Then
ol_ContactItm.Categories = T_AFT
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, "; " & T_BEF & ";") > 1)
Then
strTmp = Left(ol_ContactItm.Categories, InStr(1,
ol_ContactItm.Categories, "; " & T_BEF & ";") - 1)
strTmp = strTmp & "; " & T_AFT & ";"
strTmp = strTmp & Right(ol_ContactItm.Categories,
Len(ol_ContactItm.Categories) - InStr(1, ol_ContactItm.Categories, "; " & T_
BEF & ";") - Len(T_BEF) - 2)
ol_ContactItm.Categories = strTmp
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, "; " & T_BEF) Len(ol_ContactItm.Categories) - Len(T_BEF) - 1) Then
strTmp = Left(ol_ContactItm.Categories, InStr(1,
ol_ContactItm.Categories, "; " & T_BEF) - 1)
ol_ContactItm.Categories = strTmp & "; " & T_AFT
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, T_BEF & ";") = 1) Then
strTmp = Right(ol_ContactItm.Categories,
Len(ol_ContactItm.Categories) - Len(T_BEF))
ol_ContactItm.Categories = T_AFT & strTmp
ol_ContactItm.Save
End If
End If
Next LgI

Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub


"Céline Brien" a écrit dans le message de
news:
Bonjour à toutes et à tous,
Bonjour Grég,
Merci beaucoup pour ta réponse.
J'ai intégré les codes que vous m'avez proposés (voir codes ci-dessous).
Si le champ Catégories contient plus qu'un Catégories, je ne peux
renommer seulement une des catégories.
Ou bien je change le contenu du champ Catégories pour obtenir une seule
catégorie.
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
Ou bien je renomme la catégorie seulemement si elle est seule :
If ol_ContactItm.Categories = "Avant" Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
Selon mes tests, les codes suivants sont inutiles :
' ElseIf InStr(1, ol_ContactItm.Categories, ";Avant;") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";;Avant") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
Merci encore pour cette important mise au point,
Céline
------------------------------------------------------------------------
---------------
Option Explicit
Sub RenommerCategoriesMultiplesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Grég et Ken Slovak, mai
2004
' Céline Brien (819) 326-7273
'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_App = Application
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Excel" Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";Excel;") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";;Excel") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub

"Grég" a écrit dans le message de
news:40a8847d$0$10205$
Céline,


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

news:
Bonjour à toutes et à tous,
Bonjour Grég,
Merci pour ta réponse.
Avec l'aide de Ken Slovak, forum Outlook en anglais, j'ai réussi à
renommer les catégories des éléments du dossier Contacts (voir codes
ci-dessous).


Attention, votre code ne fait pas que renommer la catégorie "Avant".
Si la

catégorie "Avant" est UNE DES catégories de de l'élément alors cet
élément

aura ensuite come SEULE catégorie "Après".

Il était très important d'enregistrer les éléments :
ol_ContactItm.Save



Oups, j'avais oublié de mettre le .save sous mes tests.

Je croyais que tes codes tenaient compte du fait que votre catégorie
est


seule, en début, fin ou milieu de la chaîne des catégories. Voir
ligne


suivante :
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then


Je me cite à ce sujet "Le test que j'ai mis reste un peu large." et
"Les Or

permettent de gérer les catégories multiples sans retenir celles du
type *Excel*." Par contre je n'ai pas dit qu'il éliminait toutes les
"Excel*" et "*Excel". Votre code peut mettre dans la seule catégorie
"Après"

des éléments appartenant à la catégorie "Avant-hier" et "le bidule
Avant",

si ces éléments appartiennent à plusieurs catégories.

Pour renommer, il faut donc que vous testiez que si la chaîne n'est
pas

"Avant" et ne contient pas "; Avant;", alors "Avant;" doit être en
début de

chaîne et "; Avant" en fin de chaîne et remplacer cette sous-chaîne
par

celle qui convient.

Je vais réviser le tout à partie de tes conseils.
Merci encore,


C'était un plaisir de vous aider et de vous lire sur
microsoft.public.outlook.program_vba !-))

--
Grég


Céline


Option Explicit
Sub RenommerCategoriesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Ken Slovak, mai
2004


'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub
"Grég" a écrit dans le message de
news:
Céline,


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



de
news:

Si je modifie un peu cette macro, est-il possible d'obtenir une
macro


pour renommer une catégorie ?


Il faudra que vous fassiez un peu plus le ménage sur les cas que
vous



pouvez
avoir suivant que votre catégorie est seule, en début, fin ou
milieu



de la
chaîne des catégories. Puis, il suffit d'enlever l'ancienne
catégorie



et de
la remplacer par la nouvelle dans la chaîne, avant de la
réaffecter à



ol_item.categories.

en gros
if ol_item.categories = "à changer" then
ol_item.categories = "changée"
else if InStr(1, ol_ContactItm.Categories, "; à changer;") then.
...
else if
End If.


De plus j'ai vu qu'il valait mieux utiliser dans les macros:

Dim ol_App As Outlook.Application
...
ol_App = application

plutôt que "Dim ol_App As New Outlook.Application"

Cela permet d'avoir un code "trusted" avec OL2K3.

--
Grég












Avatar
Céline Brien
Bonjour à toutes et à tous,
Bonjour Grégoire,
Merci pour votre réponse.
Les codes fonctionnent parfaitement. Je peux maintenant renommer une
catégorie parmi d'autres. L'utilisation des codes strTmp et Len, c'est
vraiment génial !
Je ne maîtrise pas très bien VBA, mais ce travail m'aide beaucoup à
mieux comprendre les concepts et de nouvelles fonctions.
J'aime bien la façon dont vous divisez les codes en section : Const et
Dim, Set, Instructions et Set.
Merci pour l'explication concernant "Dim ol_App As Outlook.Application"
vs "Dim ol_App As New Outlook.Application". J'aime comprendre et vos
explications me sont très précieuses.
Toutefois, je n'ai pas compris cette remarque :
Vous pouvez d'ailleurs utiliser les tests un peu plus précis que j'ai
fait pour votre fonction de suppression. cela vous évitera de supprimer
un élément appartenant à une catégorie qui contient "Avant" sans être
"Avant".
Comment une catégorie peut-elle contenir "Avant" sans être "Avant" ?
Bon mardi,
Céline


"Grég" a écrit dans le message de
news:%23l$
Céline,

Des petites remarques:

"Dim ol_App As Outlook.Application" au lieu de "Dim ol_App As New
Outlook.Application". Vous assignez ol_App à application, comme l'on
doit

faire maintenant, au début de votre code, donc avec New vous créez un
objet

inutilement.

Les tests supplémentaires, comme ajoutés ci-dessous vous permettent de
renommer la catégorie "Avant" en "Après" sans toucher aux éventuelles
autres

catégories des contacts.

Vous pouvez d'ailleurs utiliser les tests un peu plus précis que j'ai
fait

pour votre fonction de suppression. cela vous évitera de supprimer un
élément appartenant à une catégorie qui contient "Avant" sans être
"Avant".


--
Grég


Sub RenommerCategoriesMultiplesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Grégoire Sandré et
Ken

Slovak, mai 2004
' Céline Brien (819) 326-7273
'
Const T_BEF = "Avant"
Const T_AFT = "Après"
Dim ol_App As Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Dim strTmp As String

Set ol_App = Application
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items

For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = OlContact Then
If ol_ContactItm.Categories = T_BEF Then
ol_ContactItm.Categories = T_AFT
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, "; " & T_BEF & ";")
1)
Then
strTmp = Left(ol_ContactItm.Categories, InStr(1,
ol_ContactItm.Categories, "; " & T_BEF & ";") - 1)
strTmp = strTmp & "; " & T_AFT & ";"
strTmp = strTmp & Right(ol_ContactItm.Categories,
Len(ol_ContactItm.Categories) - InStr(1, ol_ContactItm.Categories, ";
" & T_

BEF & ";") - Len(T_BEF) - 2)
ol_ContactItm.Categories = strTmp
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, "; " & T_BEF) > Len(ol_ContactItm.Categories) - Len(T_BEF) - 1) Then
strTmp = Left(ol_ContactItm.Categories, InStr(1,
ol_ContactItm.Categories, "; " & T_BEF) - 1)
ol_ContactItm.Categories = strTmp & "; " & T_AFT
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, T_BEF & ";") = 1)
Then

strTmp = Right(ol_ContactItm.Categories,
Len(ol_ContactItm.Categories) - Len(T_BEF))
ol_ContactItm.Categories = T_AFT & strTmp
ol_ContactItm.Save
End If
End If
Next LgI

Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub


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

news:
Bonjour à toutes et à tous,
Bonjour Grég,
Merci beaucoup pour ta réponse.
J'ai intégré les codes que vous m'avez proposés (voir codes
ci-dessous).


Si le champ Catégories contient plus qu'un Catégories, je ne peux
renommer seulement une des catégories.
Ou bien je change le contenu du champ Catégories pour obtenir une
seule


catégorie.
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
Ou bien je renomme la catégorie seulemement si elle est seule :
If ol_ContactItm.Categories = "Avant" Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
Selon mes tests, les codes suivants sont inutiles :
' ElseIf InStr(1, ol_ContactItm.Categories, ";Avant;") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";;Avant") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
Merci encore pour cette important mise au point,
Céline


----------------------------------------------------------------------
--

---------------
Option Explicit
Sub RenommerCategoriesMultiplesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Grég et Ken Slovak,
mai


2004
' Céline Brien (819) 326-7273
'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_App = Application
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Excel" Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";Excel;") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";;Excel") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub

"Grég" a écrit dans le message de
news:40a8847d$0$10205$
Céline,


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



de
news:
Bonjour à toutes et à tous,
Bonjour Grég,
Merci pour ta réponse.
Avec l'aide de Ken Slovak, forum Outlook en anglais, j'ai réussi
à




renommer les catégories des éléments du dossier Contacts (voir
codes




ci-dessous).


Attention, votre code ne fait pas que renommer la catégorie
"Avant".



Si la
catégorie "Avant" est UNE DES catégories de de l'élément alors cet
élément

aura ensuite come SEULE catégorie "Après".

Il était très important d'enregistrer les éléments :
ol_ContactItm.Save



Oups, j'avais oublié de mettre le .save sous mes tests.

Je croyais que tes codes tenaient compte du fait que votre
catégorie




est
seule, en début, fin ou milieu de la chaîne des catégories. Voir
ligne


suivante :
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then


Je me cite à ce sujet "Le test que j'ai mis reste un peu large."
et



"Les Or
permettent de gérer les catégories multiples sans retenir celles
du



type *Excel*." Par contre je n'ai pas dit qu'il éliminait toutes
les



"Excel*" et "*Excel". Votre code peut mettre dans la seule
catégorie



"Après"
des éléments appartenant à la catégorie "Avant-hier" et "le bidule
Avant",

si ces éléments appartiennent à plusieurs catégories.

Pour renommer, il faut donc que vous testiez que si la chaîne
n'est



pas
"Avant" et ne contient pas "; Avant;", alors "Avant;" doit être en
début de

chaîne et "; Avant" en fin de chaîne et remplacer cette
sous-chaîne



par
celle qui convient.

Je vais réviser le tout à partie de tes conseils.
Merci encore,


C'était un plaisir de vous aider et de vous lire sur
microsoft.public.outlook.program_vba !-))

--
Grég


Céline


Option Explicit
Sub RenommerCategoriesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Ken Slovak, mai
2004


'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub
"Grég" a écrit dans le message de
news:
Céline,


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



de
news:

Si je modifie un peu cette macro, est-il possible d'obtenir
une






macro
pour renommer une catégorie ?


Il faudra que vous fassiez un peu plus le ménage sur les cas
que





vous
pouvez
avoir suivant que votre catégorie est seule, en début, fin ou
milieu



de la
chaîne des catégories. Puis, il suffit d'enlever l'ancienne
catégorie



et de
la remplacer par la nouvelle dans la chaîne, avant de la
réaffecter à



ol_item.categories.

en gros
if ol_item.categories = "à changer" then
ol_item.categories = "changée"
else if InStr(1, ol_ContactItm.Categories, "; à changer;")
then.





...
else if
End If.


De plus j'ai vu qu'il valait mieux utiliser dans les macros:

Dim ol_App As Outlook.Application
...
ol_App = application

plutôt que "Dim ol_App As New Outlook.Application"

Cela permet d'avoir un code "trusted" avec OL2K3.

--
Grég















Avatar
Grég
Céline,

"Céline Brien" a écrit dans le message de
news:
Bonjour à toutes et à tous,
Bonjour Grégoire,
Merci pour votre réponse.
Les codes fonctionnent parfaitement. Je peux maintenant renommer une
catégorie parmi d'autres. L'utilisation des codes strTmp et Len, c'est
vraiment génial !


strTmp n'est là que pour que le code soit un peu plus lisible. Le reste
n'est que l'utilisation des fonctions usuelles de manipulation de chaîne de
caractères dans la plupart des langages de programmation: Len, Left, mid,
right et la concaténation (&).


Je ne maîtrise pas très bien VBA, mais ce travail m'aide beaucoup à
mieux comprendre les concepts et de nouvelles fonctions.
J'aime bien la façon dont vous divisez les codes en section : Const et
Dim, Set, Instructions et Set.


Séparer les parties déclaratives des parties qui s'exécutent rend le code
plus agréable à (re)lire, donc à maintenir. Normalement, le code devrait
contenir au moins autant de lignes de commentaires que de ligne de code, ne
serait-ce que pour expliquer comment est construite la chaîne des
"categories" (séparées par des ; avec un blanc...)


Merci pour l'explication concernant "Dim ol_App As Outlook.Application"
vs "Dim ol_App As New Outlook.Application". J'aime comprendre et vos
explications me sont très précieuses.


Toutefois, je constate "qu'en anglais" vous restez sceptique !-)) Vous avez
bien raison !!!

Toutefois, je n'ai pas compris cette remarque :
Vous pouvez d'ailleurs utiliser les tests un peu plus précis que j'ai
fait pour votre fonction de suppression. cela vous évitera de supprimer
un élément appartenant à une catégorie qui contient "Avant" sans être
"Avant".
Comment une catégorie peut-elle contenir "Avant" sans être "Avant" ?


Désolé, ma phrase était ambigue. La catégorie "Avant-hier", contient la
chaîne "Avant" sans être la catégorie "Avant". Pour éviter de compter,
j'avais utilisé Instr comme une fonction booléenne. Donc, le test fourni,
comme précisé, n'éliminait pas, dans votre fonction de suppression, tous les
cas où la chaîne cherchée était inclue dans une autre.

--
Grég

Bon mardi,
Céline


"Grég" a écrit dans le message de
news:%23l$
Céline,

Des petites remarques:

"Dim ol_App As Outlook.Application" au lieu de "Dim ol_App As New
Outlook.Application". Vous assignez ol_App à application, comme l'on
doit

faire maintenant, au début de votre code, donc avec New vous créez un
objet

inutilement.

Les tests supplémentaires, comme ajoutés ci-dessous vous permettent de
renommer la catégorie "Avant" en "Après" sans toucher aux éventuelles
autres

catégories des contacts.

Vous pouvez d'ailleurs utiliser les tests un peu plus précis que j'ai
fait

pour votre fonction de suppression. cela vous évitera de supprimer un
élément appartenant à une catégorie qui contient "Avant" sans être
"Avant".


--
Grég


Sub RenommerCategoriesMultiplesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Grégoire Sandré et
Ken

Slovak, mai 2004
' Céline Brien (819) 326-7273
'
Const T_BEF = "Avant"
Const T_AFT = "Après"
Dim ol_App As Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Dim strTmp As String

Set ol_App = Application
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items

For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = OlContact Then
If ol_ContactItm.Categories = T_BEF Then
ol_ContactItm.Categories = T_AFT
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, "; " & T_BEF & ";")
1)
Then
strTmp = Left(ol_ContactItm.Categories, InStr(1,
ol_ContactItm.Categories, "; " & T_BEF & ";") - 1)
strTmp = strTmp & "; " & T_AFT & ";"
strTmp = strTmp & Right(ol_ContactItm.Categories,
Len(ol_ContactItm.Categories) - InStr(1, ol_ContactItm.Categories, ";
" & T_

BEF & ";") - Len(T_BEF) - 2)
ol_ContactItm.Categories = strTmp
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, "; " & T_BEF) > > Len(ol_ContactItm.Categories) - Len(T_BEF) - 1) Then
strTmp = Left(ol_ContactItm.Categories, InStr(1,
ol_ContactItm.Categories, "; " & T_BEF) - 1)
ol_ContactItm.Categories = strTmp & "; " & T_AFT
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, T_BEF & ";") = 1)
Then

strTmp = Right(ol_ContactItm.Categories,
Len(ol_ContactItm.Categories) - Len(T_BEF))
ol_ContactItm.Categories = T_AFT & strTmp
ol_ContactItm.Save
End If
End If
Next LgI

Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub


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

news:
Bonjour à toutes et à tous,
Bonjour Grég,
Merci beaucoup pour ta réponse.
J'ai intégré les codes que vous m'avez proposés (voir codes
ci-dessous).


Si le champ Catégories contient plus qu'un Catégories, je ne peux
renommer seulement une des catégories.
Ou bien je change le contenu du champ Catégories pour obtenir une
seule


catégorie.
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
Ou bien je renomme la catégorie seulemement si elle est seule :
If ol_ContactItm.Categories = "Avant" Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
Selon mes tests, les codes suivants sont inutiles :
' ElseIf InStr(1, ol_ContactItm.Categories, ";Avant;") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";;Avant") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
Merci encore pour cette important mise au point,
Céline


----------------------------------------------------------------------
--

---------------
Option Explicit
Sub RenommerCategoriesMultiplesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Grég et Ken Slovak,
mai


2004
' Céline Brien (819) 326-7273
'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_App = Application
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Excel" Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";Excel;") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";;Excel") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub

"Grég" a écrit dans le message de
news:40a8847d$0$10205$
Céline,


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



de
news:
Bonjour à toutes et à tous,
Bonjour Grég,
Merci pour ta réponse.
Avec l'aide de Ken Slovak, forum Outlook en anglais, j'ai réussi
à




renommer les catégories des éléments du dossier Contacts (voir
codes




ci-dessous).


Attention, votre code ne fait pas que renommer la catégorie
"Avant".



Si la
catégorie "Avant" est UNE DES catégories de de l'élément alors cet
élément

aura ensuite come SEULE catégorie "Après".

Il était très important d'enregistrer les éléments :
ol_ContactItm.Save



Oups, j'avais oublié de mettre le .save sous mes tests.

Je croyais que tes codes tenaient compte du fait que votre
catégorie




est
seule, en début, fin ou milieu de la chaîne des catégories. Voir
ligne


suivante :
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then


Je me cite à ce sujet "Le test que j'ai mis reste un peu large."
et



"Les Or
permettent de gérer les catégories multiples sans retenir celles
du



type *Excel*." Par contre je n'ai pas dit qu'il éliminait toutes
les



"Excel*" et "*Excel". Votre code peut mettre dans la seule
catégorie



"Après"
des éléments appartenant à la catégorie "Avant-hier" et "le bidule
Avant",

si ces éléments appartiennent à plusieurs catégories.

Pour renommer, il faut donc que vous testiez que si la chaîne
n'est



pas
"Avant" et ne contient pas "; Avant;", alors "Avant;" doit être en
début de

chaîne et "; Avant" en fin de chaîne et remplacer cette
sous-chaîne



par
celle qui convient.

Je vais réviser le tout à partie de tes conseils.
Merci encore,


C'était un plaisir de vous aider et de vous lire sur
microsoft.public.outlook.program_vba !-))

--
Grég


Céline


Option Explicit
Sub RenommerCategoriesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Ken Slovak, mai
2004


'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub
"Grég" a écrit dans le message de
news:
Céline,


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



de
news:

Si je modifie un peu cette macro, est-il possible d'obtenir
une






macro
pour renommer une catégorie ?


Il faudra que vous fassiez un peu plus le ménage sur les cas
que





vous
pouvez
avoir suivant que votre catégorie est seule, en début, fin ou
milieu



de la
chaîne des catégories. Puis, il suffit d'enlever l'ancienne
catégorie



et de
la remplacer par la nouvelle dans la chaîne, avant de la
réaffecter à



ol_item.categories.

en gros
if ol_item.categories = "à changer" then
ol_item.categories = "changée"
else if InStr(1, ol_ContactItm.Categories, "; à changer;")
then.





...
else if
End If.


De plus j'ai vu qu'il valait mieux utiliser dans les macros:

Dim ol_App As Outlook.Application
...
ol_App = application

plutôt que "Dim ol_App As New Outlook.Application"

Cela permet d'avoir un code "trusted" avec OL2K3.

--
Grég


















Avatar
Céline Brien
Bonjour à toutes et à tous,
Bonjour Grégoire,
Merci pour ces nombreuses précisions.
Votre générosité vous honore !
Je vais documenter chacune des lignes de code, je le fais toujours car
la mémoire est une faculté qui oublie...
Merci encore. Effectuer des recherches avec votre aide est un plaisir !
Céline


"Grég" a écrit dans le message de
news:
Céline,

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

news:
Bonjour à toutes et à tous,
Bonjour Grégoire,
Merci pour votre réponse.
Les codes fonctionnent parfaitement. Je peux maintenant renommer une
catégorie parmi d'autres. L'utilisation des codes strTmp et Len,
c'est


vraiment génial !


strTmp n'est là que pour que le code soit un peu plus lisible. Le
reste

n'est que l'utilisation des fonctions usuelles de manipulation de
chaîne de

caractères dans la plupart des langages de programmation: Len, Left,
mid,

right et la concaténation (&).


Je ne maîtrise pas très bien VBA, mais ce travail m'aide beaucoup à
mieux comprendre les concepts et de nouvelles fonctions.
J'aime bien la façon dont vous divisez les codes en section : Const
et


Dim, Set, Instructions et Set.


Séparer les parties déclaratives des parties qui s'exécutent rend le
code

plus agréable à (re)lire, donc à maintenir. Normalement, le code
devrait

contenir au moins autant de lignes de commentaires que de ligne de
code, ne

serait-ce que pour expliquer comment est construite la chaîne des
"categories" (séparées par des ; avec un blanc...)


Merci pour l'explication concernant "Dim ol_App As
Outlook.Application"


vs "Dim ol_App As New Outlook.Application". J'aime comprendre et vos
explications me sont très précieuses.


Toutefois, je constate "qu'en anglais" vous restez sceptique !-)) Vous
avez

bien raison !!!

Toutefois, je n'ai pas compris cette remarque :
Vous pouvez d'ailleurs utiliser les tests un peu plus précis que
j'ai


fait pour votre fonction de suppression. cela vous évitera de
supprimer


un élément appartenant à une catégorie qui contient "Avant" sans
être


"Avant".
Comment une catégorie peut-elle contenir "Avant" sans être "Avant" ?


Désolé, ma phrase était ambigue. La catégorie "Avant-hier", contient
la

chaîne "Avant" sans être la catégorie "Avant". Pour éviter de compter,
j'avais utilisé Instr comme une fonction booléenne. Donc, le test
fourni,

comme précisé, n'éliminait pas, dans votre fonction de suppression,
tous les

cas où la chaîne cherchée était inclue dans une autre.

--
Grég

Bon mardi,
Céline


"Grég" a écrit dans le message de
news:%23l$
Céline,

Des petites remarques:

"Dim ol_App As Outlook.Application" au lieu de "Dim ol_App As New
Outlook.Application". Vous assignez ol_App à application, comme
l'on



doit
faire maintenant, au début de votre code, donc avec New vous créez
un



objet
inutilement.

Les tests supplémentaires, comme ajoutés ci-dessous vous
permettent de



renommer la catégorie "Avant" en "Après" sans toucher aux
éventuelles



autres
catégories des contacts.

Vous pouvez d'ailleurs utiliser les tests un peu plus précis que
j'ai



fait
pour votre fonction de suppression. cela vous évitera de supprimer
un



élément appartenant à une catégorie qui contient "Avant" sans être
"Avant".


--
Grég


Sub RenommerCategoriesMultiplesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Grégoire Sandré
et



Ken
Slovak, mai 2004
' Céline Brien (819) 326-7273
'
Const T_BEF = "Avant"
Const T_AFT = "Après"
Dim ol_App As Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Dim strTmp As String

Set ol_App = Application
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items

For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = OlContact Then
If ol_ContactItm.Categories = T_BEF Then
ol_ContactItm.Categories = T_AFT
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, "; " & T_BEF &
";")



1)
Then
strTmp = Left(ol_ContactItm.Categories, InStr(1,
ol_ContactItm.Categories, "; " & T_BEF & ";") - 1)
strTmp = strTmp & "; " & T_AFT & ";"
strTmp = strTmp & Right(ol_ContactItm.Categories,
Len(ol_ContactItm.Categories) - InStr(1, ol_ContactItm.Categories,
";



" & T_
BEF & ";") - Len(T_BEF) - 2)
ol_ContactItm.Categories = strTmp
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, "; " & T_BEF) > > > Len(ol_ContactItm.Categories) - Len(T_BEF) - 1) Then
strTmp = Left(ol_ContactItm.Categories, InStr(1,
ol_ContactItm.Categories, "; " & T_BEF) - 1)
ol_ContactItm.Categories = strTmp & "; " & T_AFT
ol_ContactItm.Save
ElseIf (InStr(1, ol_ContactItm.Categories, T_BEF & ";") 1)
Then

strTmp = Right(ol_ContactItm.Categories,
Len(ol_ContactItm.Categories) - Len(T_BEF))
ol_ContactItm.Categories = T_AFT & strTmp
ol_ContactItm.Save
End If
End If
Next LgI

Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub


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



de
news:
Bonjour à toutes et à tous,
Bonjour Grég,
Merci beaucoup pour ta réponse.
J'ai intégré les codes que vous m'avez proposés (voir codes
ci-dessous).


Si le champ Catégories contient plus qu'un Catégories, je ne
peux




renommer seulement une des catégories.
Ou bien je change le contenu du champ Catégories pour obtenir
une




seule
catégorie.
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
Ou bien je renomme la catégorie seulemement si elle est seule :
If ol_ContactItm.Categories = "Avant" Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
Selon mes tests, les codes suivants sont inutiles :
' ElseIf InStr(1, ol_ContactItm.Categories, ";Avant;") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";;Avant") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
Merci encore pour cette important mise au point,
Céline




----------------------------------------------------------------------

--
---------------
Option Explicit
Sub RenommerCategoriesMultiplesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Grég et Ken
Slovak,




mai
2004
' Céline Brien (819) 326-7273
'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_App = Application
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder = ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Excel" Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";Excel;") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
' ElseIf InStr(1, ol_ContactItm.Categories, ";;Excel") Then
' ol_ContactItm.Categories = "Après"
' ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub

"Grég" a écrit dans le message de
news:40a8847d$0$10205$
Céline,


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



de
news:
Bonjour à toutes et à tous,
Bonjour Grég,
Merci pour ta réponse.
Avec l'aide de Ken Slovak, forum Outlook en anglais, j'ai
réussi






à
renommer les catégories des éléments du dossier Contacts
(voir






codes
ci-dessous).


Attention, votre code ne fait pas que renommer la catégorie
"Avant".



Si la
catégorie "Avant" est UNE DES catégories de de l'élément alors
cet





élément
aura ensuite come SEULE catégorie "Après".

Il était très important d'enregistrer les éléments :
ol_ContactItm.Save



Oups, j'avais oublié de mettre le .save sous mes tests.

Je croyais que tes codes tenaient compte du fait que votre
catégorie




est
seule, en début, fin ou milieu de la chaîne des catégories.
Voir






ligne
suivante :
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then


Je me cite à ce sujet "Le test que j'ai mis reste un peu
large."





et
"Les Or
permettent de gérer les catégories multiples sans retenir
celles





du
type *Excel*." Par contre je n'ai pas dit qu'il éliminait
toutes





les
"Excel*" et "*Excel". Votre code peut mettre dans la seule
catégorie



"Après"
des éléments appartenant à la catégorie "Avant-hier" et "le
bidule





Avant",
si ces éléments appartiennent à plusieurs catégories.

Pour renommer, il faut donc que vous testiez que si la chaîne
n'est



pas
"Avant" et ne contient pas "; Avant;", alors "Avant;" doit
être en





début de
chaîne et "; Avant" en fin de chaîne et remplacer cette
sous-chaîne



par
celle qui convient.

Je vais réviser le tout à partie de tes conseils.
Merci encore,


C'était un plaisir de vous aider et de vous lire sur
microsoft.public.outlook.program_vba !-))

--
Grég


Céline


Option Explicit
Sub RenommerCategoriesDeContacts()
'
' Macro pour renommer la catégorie de contacts
' Macro créée par Céline Brien, avec l'aide de Ken Slovak,
mai






2004
'
Dim ol_App As New Outlook.Application
Dim ol_Mapi As Outlook.NameSpace
Dim ol_Folder As Outlook.MAPIFolder
Dim ol_Items As Outlook.Items
Dim ol_ContactItm As Object
Dim LgI As Long
Set ol_Mapi = ol_App.GetNamespace("MAPI")
Set ol_Folder ol_Mapi.GetDefaultFolder(olFolderContacts)
Set ol_Items = ol_Folder.Items
For LgI = ol_Items.Count To 1 Step -1
Set ol_ContactItm = ol_Items(LgI)
If ol_ContactItm.Class = olContact Then
If ol_ContactItm.Categories = "Avant" Or InStr(1,
ol_ContactItm.Categories, "; Avant") Or InStr(1,
ol_ContactItm.Categories, "Avant;") Then
ol_ContactItm.Categories = "Après"
ol_ContactItm.Save
End If
End If
Next LgI
Set ol_ContactItm = Nothing
Set ol_Items = Nothing
Set ol_Folder = Nothing
Set ol_Mapi = Nothing
Set ol_App = Nothing
End Sub
"Grég" a écrit dans le message de
news:
Céline,


"Céline Brien" a écrit
dans le







message
de
news:

Si je modifie un peu cette macro, est-il possible
d'obtenir








une
macro
pour renommer une catégorie ?


Il faudra que vous fassiez un peu plus le ménage sur les
cas







que
vous
pouvez
avoir suivant que votre catégorie est seule, en début, fin
ou







milieu
de la
chaîne des catégories. Puis, il suffit d'enlever
l'ancienne







catégorie
et de
la remplacer par la nouvelle dans la chaîne, avant de la
réaffecter à



ol_item.categories.

en gros
if ol_item.categories = "à changer" then
ol_item.categories = "changée"
else if InStr(1, ol_ContactItm.Categories, "; à changer;")
then.





...
else if
End If.


De plus j'ai vu qu'il valait mieux utiliser dans les
macros:








Dim ol_App As Outlook.Application
...
ol_App = application

plutôt que "Dim ol_App As New Outlook.Application"

Cela permet d'avoir un code "trusted" avec OL2K3.

--
Grég