Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
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.
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...
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.
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
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.
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 ?
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+
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
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.
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.