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
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro recherche et changement de valeur

Bonjour Dudumomo,

Si tu nous préparais deux fichiers exemple ayant les mêmes structures que les originaux et avec quelques données non confidentielles, je suis sûr que tu obtiendrais une réponse très rapidement. Ce que tu demandes est facilement réalisable mais pour tester le code il faut que nous fassions cet effort à ta place et personnellement, ça me gave...
 

sousou

XLDnaute Barbatruc
Re : Macro recherche et changement de valeur

Bonjour à tous

Il est vrai que Robert à raison.

Mais ci joint de quoi t'aider si j'ai tout compris?
 

Pièces jointes

  • test.zip
    14.3 KB · Affichages: 131
  • test.zip
    14.3 KB · Affichages: 126
  • test.zip
    14.3 KB · Affichages: 126

dudumomo

XLDnaute Occasionnel
Re : Macro recherche et changement de valeur

Desole Robert, tu as parfaitement raison.
J'aurai du le faire.

Merci sousou. ton fichier represente en effet la structure du mien.
Je ne peux pas essayer le fichier de suite, mais demain je m'en charge.

Merci en tout cas a vous 2.
 

dudumomo

XLDnaute Occasionnel
Re : Macro recherche et changement de valeur

Bonjour,
je viens de tester la macro, elle fonctionne bien et répond tres bien a mon besoin.
Le seul point d'amelioration que j'aimerai serai une msgbox qui s'affiche pour nous demander le nom du "fichier" (contenant toute la table a modifier) puisque le nom change toutes les semaines pour l'updater.

(Va falloir que je prenne des cours moi)
 

sousou

XLDnaute Barbatruc
Re : Macro recherche et changement de valeur

Bonjour dudumomo,

Est ce que celà veux dire que la macro doit se être dans le fichier ici nommé Référence.
quel fichier change toute les semaines? Fichier référence ou fichier
 

sousou

XLDnaute Barbatruc
Re : Macro recherche et changement de valeur

Bon
Volià le résultat si j'ai compris
La macro se trouve dans référence,
Elle demande de choisir le fichier à modifier
 

Pièces jointes

  • test.zip
    17.1 KB · Affichages: 113
  • test.zip
    17.1 KB · Affichages: 114
  • test.zip
    17.1 KB · Affichages: 116

dudumomo

XLDnaute Occasionnel
Re : Macro recherche et changement de valeur

Bonjour a tous,
Sousou, j'ai essaye d'adapter ta macro a un fichier un peu different, mais en vain

Pourrais tu m'expliquer comment l'adapter un peu..

Les differences sont que le fichier "fichier" contenant la table a modifier est un peu differente. Les clients ne sont pas en A mais en C disons et les valeurs a modifier ne sont pas en F mais en J.

Comment cela fonctionne ?

Je pensais qu'il suffisait de modifier
'Definition de la zone a modifier
Set listclient = fich.Sheets(1).UsedRange.Columns(1).Rows

Par
Set listclient = fich.Sheets(1).UsedRange.Columns(3).Rows

Et modifier l'offset mais je coince un peu....mes essais ont ete infructueux.

Merci de ton aide
Ainsi qu'aux autres.


PS: D'ailleurs, dans le meme genre, j'aimerai faire cela:
https://www.excel-downloads.com/threads/macro-recherche-et-changement-de-valeur-selon-table.152675/

Si vous avez des idees, je serai tres interesse.

Merci
 

dudumomo

XLDnaute Occasionnel
Re : Macro recherche et changement de valeur

Hmm je viens d'essayer d'adapter cette macro a un autre fichier.
Mais elle ne convient pas, puisque cette macro recherche les mots contenant "i", mais dans mon cas, le mot peut contenir n'importe quoi...
Une idee ?
 

Gorfael

XLDnaute Barbatruc
Re : Macro recherche et changement de valeur

Salut dudumomo et le forum
Sans franchement empiéter sur le travail effectué :
Les clients ne sont pas en A mais en C disons et les valeurs a modifier ne sont pas en F mais en J.
effectivement, il suffit de remplacer Columns(1) => A par Columns(3).
Range("A1").offset(0,5) signifie : la cellule à 0 ligne et 5 colonnes de A1, soit J1
En suivant le même raisonnement on aura
Range("C1").offset(0,7) : la cellule à 0 ligne et 5 colonnes de C1 => J1
A+
 

dudumomo

XLDnaute Occasionnel
Re : Macro recherche et changement de valeur

Bonjour Gorfael

Merci de ta reponse, mais etant plutot debutant,je n'ai pas compris le sens de cette commande et surtout ou la mettre.
Pour rappel voici la macro de sousou:

Sub deb()
'Définition du répertoire de travail
chemin = ThisWorkbook.Path
'Fichier de référence est ce fichier
Set ficheref = ThisWorkbook
'Zone de référence
Set zonerecherche = ficheref.Sheets(1).Columns(1).Rows

'Chargement du fichier à modifier
rep = Application.Dialogs(xlDialogOpen).Show(chemin)
Set fich = ActiveWorkbook
'Définition de la zone à modifier
Set listclient = fich.Sheets(1).UsedRange.Columns(1).Rows

For Each i In listclient
'recherche dans le fichier de référence
Set resultat = zonerecherche.Find(i, lookat:=xlWhole)
Call change(resultat, i)
Next
End Sub

'Correction
Sub change(macellule, i)

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

End Sub


Pour le
if not(range(mes cellules à tester) like "*i*") then
Je pensais le mettre a la fin entre End if et End sub, puis en ajoutant modifiant range(A1,A20) mais en vain, ca n'a pas fonctionne...

Merci de votre a tous.
 

Gorfael

XLDnaute Barbatruc
Re : Macro recherche et changement de valeur

Salut dudumomo et le forum
Avec la macro, je comprends mieux ton problème.
Dans ta macro :
Code:
Set zonerecherche = ficheref.Sheets(1).Columns(1).Rows
La variable zonerecherche est "chargée" avec la colonne A (.Columns(1)) de la première feuille (.Sheets(1)) du fichier "ficheref"(.rows ne sert à rien)
De même :
Set listclient = fich.Sheets(1).UsedRange.Columns(1).Rows
La variable listclient est chargée avec la colonne A (Columns(1)), limitée à la plage utilisée (UsedRange) dans la feuille 1 (Sheets(1)) du fichier "fich"
Code:
For Each i In listclient
    'recherche dans le fichier de référence
    Set resultat = zonerecherche.Find(i, lookat:=xlWhole)
    Call change(resultat, i)
Next
i n'étant pas défini clairement, je comprends la confusion : Pour chaque i dans listclient => i est une variable, un "objet" au sens VBA du terme.
Avec l'instruction, comme Listclient est une plage (un range), VBA va affecter à i un type de variable range et la plus petite unité d'une plage est la cellule => on peut donc lire pour la première ligne :
pour chaque cellule de la plage listclient.
resultat : sera aussi (à ce niveau du code) une cellule
trouver une cellule (.find) dans la plage "zonerecherche" (définie comme colonne A, feuille n°1 du classeur ficheref) qui soit égale à la valeur de la cellule i en entier (xlWhole).
lancer la macro change avec les paramètres resultat et i (toutes deux aynt un type range.
Pour faire des recherches, n'ayant qu'une seule valeur, Find très rapide (il y en a peut-être d'autres plus rapides. Avec Excel, il y a tellement de possibilité...

Une chose me choque, dans le code donné, c'est qu'on est (trop) sûr de trouver une correspondance de chaque valeur de Listclient et les valeurs de zonerecherche ça ne coûte que quelques lignes de code de traiter le cas de valeurs de listclient qui ne se retrouvent pas dans zonerecherche, au lieu de planter la macro.

Là, je ne suis pas sûr de ton problème : (comme on parle de feuille n°1, colonne A pour les deux fichier, je ne vais pas le répéter)
A- Soit tu recherches les valeurs de fich qui n'apparaissent pas dans fichref
Pour reprendre le code fourni :
Code:
Set resultat = zonerecherche.Find(i, lookat:=xlWhole)
i : les cellules appartenant à listclient (colonne A, plage utilisée de fich)
Resultat : une cellule(la première) qui est égale à cellule testée.
S'il n'y en a aucune, resultat = nothing (rien) ne sachant pas ce que tu veux en faire, il suffit d'utiliser un test : i=rien on effectue ce qu'il faut, sinon on lance la macro change : ce qui nous donne, sur la macro donnée (beaucoup trop de don ^^)
Code:
For Each i In listclient
     'recherche dans le fichier de référence
          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)
        endif
    endif
Next
Comme on teste les valeurs de i sur la plage utilisée de fich, et pas sur de A1 à dernière utilisée, je préfére éviter les valeurs nulles.
ou, sans modifier le code, faire un traitement directement dans la macro Change => mais je ne sais pas comment se comporte la transmission du paramètre range en cas de "rien, quand le type de paramètre de réception n'est pas défini.

B- Soit tu recherches les valeurs de fichref qui n'apparaissent pas dans fich
Donc, là, pour aller vite, on va aussi utiliser Find, mais il faudra vérifier que les valeurs de fichref ne seront pas traitées plusieurs fois (en cas de doublons. On va faire une seconde boucle, mais partant de l'autre fichier (fichref) et en regardant dans la listclient qu'il n'y a pas de correspondance.
Code:
Set zonerecherche = fich.sheets(1).columns(1)
with ficheref.Sheets(1)
    Set Listclient = .range(.cells(1,"A"), .cells(rows.count,"A").end(xlup))
    'fichref feuille n°1 de Ai à dernière non vide en A
end with
for each i in listclient
    if i <>"" then
        set resultat = zonerecherche.find(i,  lookat:=xlWhole)
        if resultat is nothing then
            'traitement, sans oublier qu'on peut avoir des doublons (ou pas)
        endif
    endif
next i
C'est à mettre après le next de ton code.

Comme je ne sais pas ce qu'on doit faire, dans les deux cas (A et B), on se retrouve avec une variable i contenant une cellule d'un fichier n'apparaissant pas dans l'autre. on peut faire un call, et créer une macro qui traitera ce cas, ou mettre le code de traitement directement dans la macro.

A+
 

Discussions similaires

Réponses
3
Affichages
289

Membres actuellement en ligne

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa