Remplacer plusieurs données d'une macro
Bonjour,
J'utilise aujourd'hui un classeur analytique contenant diverses macros que je viens mettre à jour régulièrement par des extractions système (SAP). Une des colonnes extraite me donne un code à deux caractères, chaque code correspondant à une spécialité.
Mon but original est qu'à la mise à jour de mon fichier de suivi, ces données soient remplacées par leur signification.
Pour l'instant, pour y parvenir j'ai codé une fonction Replace pour chaque valeur à remplacer :
Sub TypeSpé()
Application.ScreenUpdating = False
Columns("J:J").Select
Selection.Replace What:="A1", Replacement:="CHIRURGIE", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="A4", Replacement:="DENTAIRE", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="AH", Replacement:="ORL", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
...
Mon objectif a aujourd'hui évolué pour deux raisons :
- Je ne dois pas remplacer une quinzaine de chaines (A1, A4, AH, etc...) mais environ 200 !
- Je veux que ma "table de mapping" soit accessible depuis le classeur pour personnaliser facilement le remplacement sans passer par le code.
Je pense que la solution passe par un Array dans lequel j'impute les 200 équivalences à partir d'un tableau de mon classeur.
Puis que j'opère un Replace en jouant avec la première dimension de l'Array. Mais ça devient compliqué pour moi :S.
Une idée de code type pour ce genre de Replace ?
Merci pour votre temps !
waxscud
Bonsoir
Une solution
Ton tableau de correspondance en colonnes A:B
Sub TypeSpé()
Dim T1, I As Integer
Application.ScreenUpdating = False
T1 = Range("A1:B" & Range("A" & Rows.Count).End(xlUp).Row)
With Columns("J:J")
For I = 1 To UBound(T1)
.Replace What:=T1(I, 1), Replacement:=T1(I, 2), LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next I
End With
End Sub
Bonjour Banzai,
Encore un plaisir de voir que tu es toujours là quand il faut filer un coup de main!
Ton code était pour une fois seulement "presque" parfait
La propriété LookAt de la fonction Replace devait être fixée à xlWhole et non à xlPart.
Sans changer cela, la macro continuait de chercher dans les textes de remplacement si des codes à deux lettres apparaissaient pour à nouveau les remplacer par une équivalence etc...
Les champs se remplissaient donc sans aucune logique.
Hormis cela, tout roule !
Merci pour tout,
waxscud