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

  • Initiateur de la discussion Initiateur de la discussion khenri
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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
 
Solution
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)
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)
 
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
 
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:
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)
Bonjour @khenri 🙂,

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
Bonjour c'est curieux. j'ai essayé ton code et ca ne remplace pas toutes les valeurs sur mon fichier ci joint. Je premier code ne remplace pas toutes les valeurs et les autres sortent en erreur. Suis sur mac est ce que c'est pour cela ?

merci !
 

Pièces jointes

Bonsoir le fil, cloum1

=>cloum1
Oui , le dico n'est pas la CAMe du MAC 😉
(C'est ici que le bât blesse)
Set d = CreateObject("scripting.dictionary")

Mais je laisse mapomme t'expliquer plus en détails le pourquoi du comment 😉 (vu que c'est son code)
(Et je crois me souvenir qu'il pourra de proposer une alternative à l'objet Dictionary fonctionnel sur Mac)
 
Bonjour @khenri 🙂,

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
bonsoir
je suis vraiment intéressé par ce code, comment l'adapter pour que la substituions des données puisse se passer sur deux feuilles différentes
cdt
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Code VBA
Réponses
10
Affichages
773
Retour