Résolu Macro RECHERCHER-REMPLACER

Mirguy23

Habitué
Bonjour,

Je coince un peu sur mon code ... J'ai visualisé plusieurs fichiers mais toujours des difficultés ...

Je cherche sous excel à avoir une macro me permettant de faire un remplacer-rechercher automatiquement afin de me simplifier la tâche.

Exemple:

Si PC802179-00 colonne "B" feuil1 est égal à la même valeur PC802179-00 colonne "B" feuil2 alors remplacer toute les cellules de la colonne "B" (feuil1) ayant la valeur PC802179-00 par RX134537-01 colonne "A" sur toute la feuil1.

Je vous ai joint les images pour plus de compréhension.

Quelqu'un peut me proposer un code afin que je me lance svp?
 

Fichiers joints

  • feuil1.PNG
    feuil1.PNG
    42.8 KB · Affichages: 2
  • feuil2.PNG
    feuil2.PNG
    50 KB · Affichages: 2

svoglimacci

check memory failed but no bug detected
Salut :)

On ne te fournira pas le code, ce n'est pas le style de la maison, mais le moyen d'y parvenir ok ? A court terme, cela te permettra plus facilement d'adapter ton programme en cas de modification, a long terme la connaissance acquise t'aidera pour tes futurs besoins.
Ensuite, pas d'offenses si nous te conseillons des choses évidentes à tes yeux, nous ne pouvons pas présumer de ton niveau :)

Pour commencer, pour toi et nous, tu dois clairement exprimer ton besoin. En français clair et structuré comme pour l'expliquer à un incompétent. Et incompétents nous le sommes car nous ne savons rien de ton besoin.
D'ailleurs, tu commences par bien le faire mais tu dois aller encore plus loin. Par exemple, faut-il relire toutes données des colonnes "B" ? Faut'il ne prendre que certaines valeurs ? Lesquelles ? Les nouvelles ? Comment les trouver ?
A voir ta feuille 2 je suppose que le couple PC802179-00 --> RX134537-01 n'est pas unique et qu'il y a aussi PC802171-00 --> RX134537-02 et bien d'autres. Oui ? Dans ce cas, comment savoir quel "B" est associé à quel "A" ? Existe-t-il une table de correspondance ?
Etc.
Nous passerons ensuite à la programmation proprement dite.
 

Mirguy23

Habitué
Salut :)

On ne te fournira pas le code, ce n'est pas le style de la maison, mais le moyen d'y parvenir ok ? A court terme, cela te permettra plus facilement d'adapter ton programme en cas de modification, a long terme la connaissance acquise t'aidera pour tes futurs besoins.
Ensuite, pas d'offenses si nous te conseillons des choses évidentes à tes yeux, nous ne pouvons pas présumer de ton niveau :)

Pour commencer, pour toi et nous, tu dois clairement exprimer ton besoin. En français clair et structuré comme pour l'expliquer à un incompétent. Et incompétents nous le sommes car nous ne savons rien de ton besoin.
D'ailleurs, tu commences par bien le faire mais tu dois aller encore plus loin. Par exemple, faut-il relire toutes données des colonnes "B" ? Faut'il ne prendre que certaines valeurs ? Lesquelles ? Les nouvelles ? Comment les trouver ?
A voir ta feuille 2 je suppose que le couple PC802179-00 --> RX134537-01 n'est pas unique et qu'il y a aussi PC802171-00 --> RX134537-02 et bien d'autres. Oui ? Dans ce cas, comment savoir quel "B" est associé à quel "A" ? Existe-t-il une table de correspondance ?
Etc.
Nous passerons ensuite à la programmation proprement dite.

Désolé j'ai oublié de mettre le code.

Le voici:

C-like:
Option Explicit

Private Sub CommandButton1_Click()

Dim Feui11 As Worksheet, Feui12 As Worksheet, rg As Range

Dim rech As Scripting.Dictionary

Set rech = New Scripting.Dictionary

Set Feui11 = ThisWorkbook.Worksheets("Feui11")

Set Feui12 = ThisWorkbook.Worksheets("Feuil2")

For Each rg In Intersect(Feui12.Columns(2), Feui12.UsedRange)

    If rg.Value <> "" Then

        Call rech.Add(rg.Value, rg.Offset(0, -1).Value)

    End If

Next rg

For Each rg In Intersect(Feui11.Columns(2), Feui11.UsedRange)

    If rech.Exists(rg.Value) Then

        rg.Value = rech.Item(rg.Value)

    End If

Next rg

End Sub
 
Dernière édition par un modérateur:

Mirguy23

Habitué
Merci de m'éclairer svoglimacci.

En faite, l
Salut :)

On ne te fournira pas le code, ce n'est pas le style de la maison, mais le moyen d'y parvenir ok ? A court terme, cela te permettra plus facilement d'adapter ton programme en cas de modification, a long terme la connaissance acquise t'aidera pour tes futurs besoins.
Ensuite, pas d'offenses si nous te conseillons des choses évidentes à tes yeux, nous ne pouvons pas présumer de ton niveau :)

Pour commencer, pour toi et nous, tu dois clairement exprimer ton besoin. En français clair et structuré comme pour l'expliquer à un incompétent. Et incompétents nous le sommes car nous ne savons rien de ton besoin.
D'ailleurs, tu commences par bien le faire mais tu dois aller encore plus loin. Par exemple, faut-il relire toutes données des colonnes "B" ? Faut'il ne prendre que certaines valeurs ? Lesquelles ? Les nouvelles ? Comment les trouver ?
A voir ta feuille 2 je suppose que le couple PC802179-00 --> RX134537-01 n'est pas unique et qu'il y a aussi PC802171-00 --> RX134537-02 et bien d'autres. Oui ? Dans ce cas, comment savoir quel "B" est associé à quel "A" ? Existe-t-il une table de correspondance ?
Etc.
Nous passerons ensuite à la programmation proprement dite.


Oui il existe une table de correspondance qui est la feuil2.

Si la valeur X de la feuil1 trouve sa correspondance dans la feuil2 alors il remplace son ancienne dénomination (ex: PC802171-00) par sa nouvelle correspondance X (ex: RX134537-02)
 

svoglimacci

check memory failed but no bug detected
Bon, soyons clairs : je suis une vraie tanche en vba (comme en bien d'autres choses d'ailleurs :D ) Comme en toute chose, je me permets d'intervenir pour déblayer le terrain et parfois aider. Ce qui ne m'empêche pas de pouvoir donner quelques conseils d'organisation ou de méthodes, voire de faire mumuse" pour essayer de trouver des solutions. Mais là, tu sembles être à un niveau bien au delà de mes moyens.
Cela étant dit, avec ces faibles moyens :
0) Tu ne dis pas où tu as des erreurs.
1) Sur mon Excel 2007 je me fais jeter pour le "Dim rech As Scripting.Dictionary" (message "type défini par l'utilisateur non défini").
Par contre, un
Dim rech
Set rech = CreateObject("Scripting.Dictionary")

fonctionne. Est-ce une question de version ?
2) je ne comprends pas ces deux lignes :
Set Feui11 = ThisWorkbook.Worksheets("Feui11")
Set Feui12 = ThisWorkbook.Worksheets("Feuil2")

Tes feuilles s'appellent "Feuil1" et "Feuil2" sur les images que tu as postées en #1. Pourquoi as-tu nommé tes variables Feui11 et 12 ? (note que ce n'est pas grave tu en as le droit).
Par contre, lors de l'initialisation =, tu mets Feui11 et feuil2. C'est le chiffre 1 ou la lettre L ?
3) "Call rech.Add(rg.Value, rg.Offset(0, -1).Value)". Pourquoi y a-t-il un "Call" ?

Je viens de trouver un pdf qui donne quelques exemples d'utilisation de dico, cela pourrait t'aider ? . Ca m'a permis de trouver pour le point 1).

Enfin, je te conseille vivement de faire ton boulot progressivement.
- Tu veux remplir ton dictionnaire ? Mets y le couple ("A", "1"), relis via "A" et affiche pour constater que tu as "1". Recommence avec 2 couples. Essaie une recherche sur une Key qui n'existe pas pour voir ce que cela donne (le cas peut t'arriver).
- Tu veux lire une partie de feuille pour remplir ton dictionnaire ? Vérifie que tu lis bien. Une valeur de la première colonne ? Affiche là. Celle de la deuxième ? Affiche là. Puis boucle sur tout, en affichant (tout) avec bien entendu un tableau réduit à 3 ou 4 lignes :lol:
- etc.
Et a chaque fois, morceau par morceau. Sinon tu vas pleurer ;)

A nouveau, je suis désolé si je te prodigue des conseils dont tu n'as pas besoin. J'espère toutefois que cela pourra te servir.

P.S. Si tu ne progresses pas, je peux essayer de le faire en même temps, ça à l'air rigolo, il y a plein de méthodes que je ne connais pas (toutes :D)
 

Mirguy23

Habitué
Meilleure réponse
merci svoglimacci j'ai reussi à le faire grâce à vous :) !

Voici mon bout de code :)
Code:
Private Sub CommandButton1_Click()



Application.Calculation = xlCalculationManual



Dim f1 As Worksheet, f2 As Worksheet, rg As Range



Dim rech As Scripting.Dictionary



Set rech = New Scripting.Dictionary



Set f1 = ThisWorkbook.Worksheets("OF")



Set f2 = ThisWorkbook.Worksheets("basedecorrespondancesRXPC")



For Each rg In Intersect(f2.Columns(2), f2.UsedRange)



    If rg.Value <> "" Then



        If Not rech.Exists(rg.Value) Then



            Call rech.Add(rg.Value, rg.Offset(0, -1).Value)



        End If



    End If



Next rg



For Each rg In Intersect(f1.Columns(2), f1.UsedRange)



    If rech.Exists(rg.Value) Then



        rg.Value = rech.Item(rg.Value)



    End If



Next rg



MsgBox "Traduction PC-> RX fait !"



Application.Calculation = xlCalculationAutomatic



End Sub
 
Dernière édition:

magellan

Modérâleur
Staff
Petites informations
1° Quand vous collez du code, pensez à utiliser les fonctionnalités pour le rendre lisible.
J'ai édité les posts en conséquence. Cela aidera les gens à vous lire et vous comprendre.
2° Comment qu'on fait?
Vous devez être connecté pour voir les pièces jointes.

Ensuite on clique sur "Code"
Vous devez être connecté pour voir les pièces jointes.

Et on choisit sa syntaxe. Perso dans le cas du vb, je mets "C-like"

Puis on valide le tout :D
 

Mirguy23

Habitué
Petites informations
1° Quand vous collez du code, pensez à utiliser les fonctionnalités pour le rendre lisible.
J'ai édité les posts en conséquence. Cela aidera les gens à vous lire et vous comprendre.
2° Comment qu'on fait?
Vous devez être connecté pour voir les pièces jointes.

Ensuite on clique sur "Code"
Vous devez être connecté pour voir les pièces jointes.

Et on choisit sa syntaxe. Perso dans le cas du vb, je mets "C-like"

Puis on valide le tout :D

Désolé, je l'ai fait par inadvertance je pensais avoir mis du general code ... Je viens de le changer. Merci !
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 180
Messages
6 719 005
Membres
1 586 480
Dernier membre
Aidezmoisv
Partager cette page
Haut