Office 365 Code VBA pour rechercher et remplacer une valeur dans une plage de données

khenri

XLDnaute Nouveau
Bonjour,

je débute sur les macros excel et j'ai besoin de votre aide :
J'ai 3 colonnes A, B, C
- A avec des données Chiffres (A2:A1000)
- B avec des données chiffres (B2:B40)
- C avec des données texte (C2:C40)
Je souhaite remplacer les données de la colonne A en recherchant la valeur de chaque
cellule dans B, puis remplacer cette valeur par C.

Plus simple:

On recherche le correspond de A dans B, puis on remplace A par C (sachant que B=C)


Merci de votre aide
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

khenri (Bienvenue sur le forum)
Un petit fichier exemple concocté par tes soins rendrait nos réponses plus faciles et plus rapides
 

Staple1600

XLDnaute Barbatruc
Re

Voici une petite macro basique
VB:
Sub Remplacer()
Dim c As Range
Application.ScreenUpdating = False
For Each c In Range(Cells(2, 1), Cells(Rows.Count, 1).End(3))
c = Application.VLookup(c, Range("$B$2:$C$49"), 2, 0)
Next
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

Une autre solution (moins basique)
(juste pour varier les plaisirs - on utilise ici les tableaux (ou Array))
VB:
Sub RemplacerII()
Dim t, v, i&
t = Range(Cells(2, 1), Cells(Rows.Count, 1).End(3)): v = Range("$B$2:$C$49")
Application.ScreenUpdating = False
For i = LBound(t, 1) To UBound(t, 1)
x = Application.Match(t(i, 1), Application.Index(v, , 1), 0)
t(i, 1) = v(x, 2)
Next i
[A2].Resize(UBound(t, 1) + 1) = t
End Sub
NB: Normalement, c'est plus rapide quand il y a beaucoup de données à traiter.
Je te laisse tester et comparer les deux macros (en testant sur une colonne A contenant par exemple 50 000 lignes)
 

Staple1600

XLDnaute Barbatruc
Re

Et pour finir (en ce qui me concerne)
Une dernière variante d'écriture (avec des endives ;))
VB:
Sub RemplacerIII()
Dim t, v, i&
t = Range(Cells(2, 1), Cells(Rows.Count, 1).End(3)): v = Range("$B$2:$C$49")
With Application
  .ScreenUpdating = False
  For i = LBound(t, 1) To UBound(t, 1)
  x = .Match(t(i, 1), .Index(v, , 1), 0): t(i, 1) = v(x, 2)
  Next i
End With
[A2].Resize(UBound(t, 1) + 1) = t
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @khenri :),
et surtout pour saluer @Staple1600 ;)
Un autre code:
Code:
Sub Substituer()
Dim t, d, i&, k&
   t = Range("a1:c" & Cells(Rows.Count, "a").End(xlUp).Row)
   Set d = CreateObject("scripting.dictionary")
   k = Cells(Rows.Count, "b").End(xlUp).Row
   For i = 1 To k: d(CStr(t(i, 2))) = t(i, 3): Next
   For i = 2 To UBound(t): t(i, 1) = d(CStr(t(i, 1))): Next
   Range("a1").Resize(UBound(t), 1) = t
End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

Et parce qu'il faut ici que je dise : chapeau bas, mapomme ;)
C'est beau comme un cheval au galop ;)
(j'avais pas d'autres rimes en tête)
 
Haut Bas