Résolu Macro RECHERCHER-REMPLACER

Mirguy23

Habitué
#1
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

svoglimacci

check memory failed but no bug detected
#2
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é
#3
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é
#4
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
#5
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 ? http://jcbne.free.fr/uploads/excel/Dictionnaire_Scripting.Dictionary.pdf. 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é
#6
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:

svoglimacci

check memory failed but no bug detected
#7
Cool pour toi, et merci pour tes remerciements :)
 

magellan

Modérâleur
Staff
#8
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?
1564668637661.png
Ensuite on clique sur "Code"
1564668669813.png
Et on choisit sa syntaxe. Perso dans le cas du vb, je mets "C-like"

Puis on valide le tout :D
 

svoglimacci

check memory failed but no bug detected
#10
Mais c'est un réel challenge de s'en sortir avec un tel tanchisme :D
Non. Tu es un être intrinsèquement méchant. Avec les coqs, avec les gars qui font des travaux... la totale :lol:

Oui, pour le code, j'aurais du le signaler, au moins cela préserve les indentations ! Mici modérâleur :)
 

Mirguy23

Habitué
#12
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?
Voir la pièce jointe 4622
Ensuite on clique sur "Code"
Voir la pièce jointe 4623
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.
Staff en ligne
  • job31
    Admin tout frippé
Membres en ligne
  • Millan
  • job31
  • labul671
  • longaripa
  • hein
  • Louis71
Derniers messages publiés
Statistiques globales
Discussions
868 868
Messages
8 102 150
Membres
1 579 398
Dernier membre
willyiams
Partager cette page
Haut