Macro recherche et changement de valeur

dudumomo

XLDnaute Occasionnel
Bonjour a tous,

J'essaye d'effectuer une macro mais je ne m'en sors pas vraiment.
Ce que j'aimerai faire:

Dans le fichier "client" se trouve une liste de clients colonne A avec différentes références sur une dizaine de colonnes dont une colonne représentant leur catégorie de client.
Or il existe certains clients spéciaux qui ont été mis dans une mauvaise catégorie.

Il me faudrait une macro qui va chercher dans un fichier "01" ou se trouve une table contenant des numéros de clients spécifiques en colonne A (Nombre de lignes indéterminées) et en colonne B se trouve une valeur alphanumérique représentant la bonne catégorie client.

Il faudrait que cette macro cherche les Num client specifique en colonne A et change la valeur de la colonne F de la bonne ligne (le client), puis la met en couleur jaune pour pouvoir facilement repérer le changement.

Parfois la catégorie a déjà été corrigé a la main et il ne faut donc pas changer la couleur.

Une idée de comment faire cela ?
Des exemples ?

Merci bien
 

dudumomo

XLDnaute Occasionnel
Re : Macro recherche et changement de valeur

Merci Gorfael de ta reponse tres detaillee ! J'apprecie.

J'ai donc compris la valeur "i"...je pensais au debut que ca cherchait les valeurs contenant un i....Bref maintenant je comprends ce que ca represente et je t'en remercie.
Et tu avais egalement raison, j'avais des soucis avec la macro car elle ne trouvait pas de correspondance...en ajoutant ta premiere solution, ca fonctionne parfaitement.

Merci a toi et a sousou evidemment.

Maintenant il me faut essayer de resoudre cette macro plus complexe: https://www.excel-downloads.com/threads/macro-recherche-et-changement-de-valeur.152030/
Si tu as des idees, elles sont plus que les bienvenues !!
 

dudumomo

XLDnaute Occasionnel
Re : Macro recherche et changement de valeur

J'ai bien reussi a integrer cette macro et a l'adapter pour plusieurs fichiers et j'aimerai maintenant etendre la liste des changements qu'elle doit effectuer.
C'est a dire que pour le moment, j'ai une table avec un code client + un code produit et j'aimerai lui donner d'autres instructions du genre pour un code vendeur ca donne tel code produit.
Bref la meme macro mais avec des valeurs differentes a des endroits differents.

Au lieu faire une seconde macro similaire, j'aimerai simplement integrer d'autres parametres a celle ci.

Voici la macro original:
Code:
Sub deb()
'Definition du repertoire de travail
chemin = ThisWorkbook.Path
'Fichier de reference est ce fichier
Set ficheref = ThisWorkbook
'Zone de reference
Set zonerecherche = ficheref.Sheets(1).Columns(1).Rows

'Chargement du fichier a modifier
rep = Application.Dialogs(xlDialogOpen).Show(chemin)
Set fich = ActiveWorkbook
'Definition de la zone a modifier
Set listclient = fich.Sheets(1).UsedRange.Columns(6).Rows

For Each i In listclient
     'recherche dans le fichier de reference
          Set resultat = zonerecherche.Find(i, LookAt:=xlWhole)
    If i <> "" Then
        If resultat Is Nothing Then
            'traitement de i sans correspondance
        Else 'sinon
            Call change(resultat, i)
        End If
    End If
Next
End Sub

--------------------------------------------------------------
'Correction
Sub change(macellule, i)

If i.Offset(0, 27) <> macellule.Offset(0, 1) Then
    i.Offset(0, 27).Interior.ColorIndex = 6
    i.Offset(0, 27) = macellule.Offset(0, 1)
        
End If
End Sub

Si j'ai bien compris, il me faut rajouter une zone de recherche du genre:
Code:
'Zone de reference
Set zonerecherche = ficheref.Sheets(1).Columns(1).Rows
Set zonerecherche2 = ficheref.Sheets(1).Columns(4).Rows
La seconde table sera sur la meme page et debutera a la colonne 4.

Une zone a modifier:
Code:
'Definition de la zone a modifier
Set listclient = fich.Sheets(1).UsedRange.Columns(6).Rows
Set listclient2 = fich.Sheets(1).UsedRange.Columns(8).Rows
Le code vendeur se trouvera colonne 8

Puis un autre pave pour "For Each i In listclient2"
qui renvoi a une autre macro Correction du genre
Code:
Sub change2(macellule, i)

If i.Offset(0, 20) <> macellule.Offset(0, 1) Then
    i.Offset(0, 20).Interior.ColorIndex = 6
    i.Offset(0, 20) = macellule.Offset(0, 1)
        
End If
End Sub

Vous ferez ainsi ? Autre chose?

Et si par exemple je souhaite une double equation.
Au lieu "si code client = XX alors code produit = YY " comme traite cette macro
Je souhaite "si code client == XX et code vendeur == YY alors code produit = ZZ"
Comment dois je proceder ??

Merci encore de votre aide.
 

Gorfael

XLDnaute Barbatruc
Re : Macro recherche et changement de valeur

Salut dudumomo et le forum
Là, je m'y perd un peu : une macro avec 2 traitements différents impose qu'on lui indique à quel moment elle doit utiliser l'un ou l'autre.
Ne pas oublier que si toi, tu sais ce que la macro doit faire réellement, nous, on en a une idée et seulement une idée, à travers tes postes.

Pour ce que j'en comprends, tu veux que la macro puisse travailler sur plusieurs plage différentes et plusieurs traitements différents.

Soit tu te fais une feuille dans laquelle tu indiques tes données, puis tu lances la macro, soit tu lances la macro, et à l'aide de différentes InputBox, tu y introduis tes données : l'une comme l'autre des solutions dépend de toi.
Regardes dans l'aide VBA : inputBox, méthode

on peut imaginer un macro construite sur ce type :
sub......
fixer le fichier et la feuille de référence :thisworkbook =>F_O
do
choisir un fichier => toujours feuille 1, ou choix feuille =>F_R
si faux, sortir
choisir le type de traitement => typ (1, 2, 3 ,etc)
select case Typ
case 1
choisir la plage de client (dans F_O)
Choisir la plage de recherche (dans F_R)
traitement 1
case 2
choisir la plage de client (dans F_O)
choisir la plage de vendeur (dans F_O)
Choisir la plage de recherche client (dans F_R)
choisir la plage de recherche vendeur (dans F_R) (ou avec Offset/client)
case etc....
end select
loop
end sub

Sauf que faire plusieurs macros me semble moins lourd, et on sait, en fonction du nom ce qu'on doit faire. Il y a plein de possibilité, mais le premier critère doit être de limiter la possibilité d'erreur. Et tout programmeur sait que le principal générateur de dysfonctionnement se situe sur un siège et fait l'interface entre l'écran et le clavier et/ou la souris.

Il est plus simple de faire une feuille de menu, avec boutons et explications claires, que de compter qu'on se souviendra que "client/vendeur" veut bien dire que l'on fait une manip sur les feuilles en tenant compte que ça concerne les listes clients, par rapport aux vendeurs. Sans compter qu'au fil du temps, les vendeurs peuvent évoluer.

Déjà, je te conseille de bien choir le nom de tes macros : deb veut dire quelque chose aujourd'hui, mais après un mois de vacances (si, si, ça existe) savoir quelle macro fait quoi...
Code:
'Zone de reference
Set ZoneRecherche = ficheref.Sheets(1).Columns(1)
Set ZoneRecherche2 = ficheref.Sheets(1).Columns(4)
La seconde table sera sur la meme page et debutera a la colonne 4.
Jusqu'à là, ça va (comme disait celui qui tombait du 20àme étage en passant devant le second)
Une zone a modifier:
Code:
'Definition de la zone a modifier
Set ListClient = fich.Sheets(1).UsedRange.Columns(6)
Set ListClient2 = fich.Sheets(1).UsedRange.Columns(8)
Le code vendeur se trouvera colonne 8
Je suis pas trop fana de UsedRange, mais comme c'est avec un Find...
Code:
Sub change2(macellule, i)
If i.Offset(0, 20) <> macellule.Offset(0, 1) Then
    i.Offset(0, 20).Interior.ColorIndex = 6
    i.Offset(0, 20) = macellule.Offset(0, 1)
End If
End Sub
Vous ferez ainsi ? Autre chose?
En schématisant :
traitement pour sélection d'une cellule
envoi à la seconde macro
traitement après retour de la macro

seconde macro qui traite la cellule
retour à la macro principale

C'est un principe couramment utilisé, mais dans des cas de plus des 3 lignes qu'on a ici : Excel perd plus de temps à sauvegarder les données de la première macro (où elle en est, ses piles, etc) et à les remettre en route qu'à effectuer le traitement => autant mettre le sous-programme (le traitement de la seconde macro) dans la première. De plus, on a qu'une seule macro qui l'utilise.

Pour moi, on utilise l'appel à sous-programmes que quand le traitement est conséquent, et que plusieurs macros l'utilisent. Si beaucoup de macros utilisent la même séquence d'instructions, ce peut être profitable, en cas de modifications, pour éviter les oublis : Tu as 5 macros qui utilisent ta macro Change2, mais c'est à 22 colonnes => une seule modif que tu peux vérifier en pas-à-pas à la première utilisation, et tu es sûr que ça marchera pour les 4 autres, plutôt que d'aller dans chaque macro et de vérifier que la modif est juste (et si c'est sur 50, au bout de la 3ème, tu vérifies plus).
Et si par exemple je souhaite une double equation.
Au lieu "si code client = XX alors code produit = YY " comme traite cette macro
Je souhaite "si code client == XX et code vendeur == YY alors code produit = ZZ"
Comment dois je proceder ??
Il faut que tu cherches avec Find et Findnext le code client, puis si tu le trouves, vérifier que la cellule à côté correspond à ton second critère directement s'il est seul, avec une boucle s'il y en a plusieurs et en cas d'égalité de tous les critères, effectuer la bonne modification, en tenant compte des 2 critères.

Mais ce genre de code demande de savoir exactement de quoi on parle, pas de partir sur des idées générales.
A+
 
Dernière édition:

Discussions similaires

Réponses
3
Affichages
301

Statistiques des forums

Discussions
312 307
Messages
2 087 101
Membres
103 468
dernier inscrit
TRINITY