Excel : Macro table de correspondance (utilisation de vba collection)

HUGOBASS

Membre confirmé
5 Mai 2012
11
0
55
Bonjour à toutes et tous,

Imaginons un classeur contenant 2 onglets : Table et Base

Table : table de correspondance entre d'anciens codes et de nouveaux code (alpha, numérique et ou alpha numérique)
Base : une base données (énormément de valeurs) contenant en colonne A dans mon exemple des valeurs avec des anciens codes ou nouveaux codes.

Je cherche via une macro (j'arrive par formule recherche V par exemple mais avec ajout d'une colonne supplémentaire que je veux absolument éviter de créer qui plus est avec obligation d'étirer la formule au fur et à mesure des imports de données, je voudrais automatiser un peu plus) remplacer dans base colonne A les anciens codes si présents par les nouveaux codes conformément à la table de correspondance. Les anciens codes seraient écrasés par les nouveaux. (pas besoin de conserver historique).Les anciens codes ne sont pas forcément présents systématiquement dans la base, la base peut contenir à la fois des nouveaux codes et des anciens (il ne faut modifier que les anciens codes).

On m'a proposé une solution via Macro (merci beaucoup à son créateur) ci aprés le code qui fonctionne très bien bien, mais qui fait appel à l'instruction "Dictionary" et donc pas opérationnel sur Excel pour Mac.

Bloc de code:
Sub MAJcode()
    Dim d As Object, n%, i%
    Set d = CreateObject("Scripting.Dictionary")
    With Worksheets("TABLE")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To n
            d(.Cells(i, 1).Value) = .Cells(i, 2)
        Next i
    End With
    With Worksheets("BASE")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To n
            If d.exists(.Cells(i, 1).Value) Then _
             .Cells(i, 1) = d(.Cells(i, 1).Value)
        Next i
        .Activate
    End With
End Sub

J'ai essayé via une instruction de type "collection" sans succès (je ne suis pas du tout un utilisateur confirmé des macros et des instructions VBA, je me débrouille avec perte de beaucoup de temps par
tâtonnement et ou via l'enregistreur de macro mais j'apprend).

J'espère que certains qui maitrisent les MACRO et VBA sous Excel Mac pourront m'apporter une piste de solution.

Merci
Cordialement
Hugues
 
Bonjour,

Je ne suis pas spécialiste en macro excel, comme toi je tâtonne !

si dans la feuille table les données sont : ancien code en colonne A et nouveau code en colonnes B et dans la feuille Base les codes en colonne A, tu peux essayer cette macro:

Sub MAJcode()
Application.ScreenUpdating = False
Dim n As Integer
Dim d() As String
With Worksheets("TABLE")
n = .Cells(.Rows.Count, 1).End(xlUp).Row
ReDim Preserve d(2, n + 1)
For i = 1 To n
d(1, i) = .Cells(i, 1).Value
d(2, i) = .Cells(i, 2).Value
Next i
End With
With Worksheets("BASE")
m = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 1 To m
For j = 1 To n
If d(1, j) = .Cells(i, 1).Value Then _
.Cells(i, 1).Value = d(2, j)
Next j
Next i
.Activate
End With
End Sub

Il doit y avoir moyen d'optimiser, mais bon !
 
  • J’aime
Réactions: HUGOBASS
Bonjour,
Je ne suis pas spécialiste en macro excel, comme toi je tâtonne !
Bonsoir ZELTRON54,

Je ne sais pas si tu es un spécialiste mais tes tâtonnements sont largement meilleurs que les miens.
Car je veux te dire merci, cela fonctionne et à priori exactement comme je veut mon besoin.
Je vais continuer à m'approprier et à adapter ton code pour le mettre en place sur ma base réelle.

Encore une fois je ne sais pas si on peut faire mieux et optimiser mais ce qui est sur c'est que je te remercie tu as résolu mon problème.

Merci

Cordialement
Hugues
 
Bonsoir,

Si tu dois adapter cette macro je te la remets avec des commentaires d'explications. Bon courage ...

Sub MAJcode()
Application.ScreenUpdating = False 'pour accélérer la macro sur mac
Dim n As Integer
Dim d() As String
With Worksheets("TABLE")
n = .Cells(.Rows.Count, 1).End(xlUp).Row ' compte le nombres de lignes utilisées dans table
ReDim Preserve d(2, n + 1) ' défini un tableau à 2 dimensions (2 , Nb de lignes)
For i = 1 To n
d(1, i) = .Cells(i, 1).Value 'boucle qui charge dans le tableau les anciens codes et les nouveaux
d(2, i) = .Cells(i, 2).Value
Next i
End With
With Worksheets("BASE")
m = .Cells(.Rows.Count, 1).End(xlUp).Row ' compte le nombre de lignes utilisées dans base
For i = 1 To m ' boucle sur nombre de lignes de base
For j = 1 To n ' boucle sur nombre de lignes de table
If d(1, j) = .Cells(i, 1).Value Then _
.Cells(i, 1).Value = d(2, j) ' compare la valeur ancienne du tableau avec le contenu de la cellule colonne a de base
Next j ' change la valeur si la comparaison est vrai
Next i
.Activate
End With
End Sub
 
  • J’aime
Réactions: HUGOBASS