EXCEl : Condition SI ==> Regroupez des pays selon un Code - VB/VBA/VBS - Programmation
Marsh Posté le 19-12-2008 à 15:33:42
Pour vous donné une idée du fichier voila ce qu'une personne m'a concocté :
http://www.cijoint.fr/cjlink.php?f [...] v5MKCa.xls
Le hic c'est que je n'arrive pas a comprendre le code a cause de la rechercheV ...
Marsh Posté le 19-12-2008 à 15:57:49
ce code est très bien qu'est ce que tu ne comprend pas dans la recherchev ?
Marsh Posté le 19-12-2008 à 16:01:27
En fait deux choses qui me bloquent :
La première chose c'est qu'en reprenant le fichier lorsque je rajoute la liste entière des pays et que je fais un glisser formule vers le bas pour le Code il faut que je reclique sur chaque ligne ou la formule est présente et que je valide par entrée pour que la formule soit prise en compte.
je ne comprends pas pouruqoi je dois faire cette manipulation.
Ensuite mon plus gros problème c'est que lorsque je veut récupérer ce code dans mon fichier à moi hé bien j'ai des soucis pour la mise a jour de la formule c'est a dire que je n'arriv pas a mettre les bons arguments pour la formule de la rechercheV en ce qui concerne la ligne Test_Logique mais également pour la ligne Valeur_Si_Vrai.
Donc au final pour être plus clair je ne sais pas m'approprier la formule dans mon cas.
Marsh Posté le 19-12-2008 à 16:04:37
Bonjour
Citation : Excem 2003 ne gère que 7 conditions SI donc je ne peut pas mettre mes 32 conditions à la ligne. |
C'est vrai.... et faux. Rien ne t'empeche dans la derniere condition de faire reference a une autre cellule qui reprendrait 7 SI, puis refaire reference a une autre cellule qui reprendrait 7 SI etc.
Mais c'est tout sauf propre.
RechercheV va chercher une valeur dans un tableau vertical et renvoyer une valeur de la colonne n°x de ce tableau.
Avec ton exemple : RECHERCHEV(A1;PaysCode;2;FAUX)
=SI(NB.SI(PaysCode;A1)>0;RECHERCHEV(A1;PaysCode;2;FAUX);"" )
Je laisse le NB.Si
On va chercher le pays saisi en A1 dans le tableau "PaysCode" et on va renvoyer la valeur de la deuxieme colonne du tableau (Ta colonne "Code" ) où cette valeur est sur la meme ligne que la valeur trouvée.
Si en A1 tu saisis Japan
Il va chercher JAPAN dans ton tableau PaysCode, et il va renvoyer la valeur qui est dans la seconde colonne ET sur la meme ligne que Japan. Donc APAC
Cordialement
Marsh Posté le 19-12-2008 à 16:12:02
Oui pour la technique que tu as décrite concernant la référence a une autre cellule j'ai commencé comme ca mais ce n'est pas propre comme tu le dis et puis dans mon cas ca m'a crée des doublons dans des colonnes différentes c'est pourquoi je recherche une autre solution.
Pour la recherche V j'ai compris le principe mais je ne comprends pas "PaysCode"
A quoi cela correspond ?
Pour moi ca correspond à la fois à la colonne A (Pays) et a la colonne B (Code).
Ais-je raison ? Si oui ou ce nom est-il déclaré?
Ca m'empêche d'y voir clair.
Marsh Posté le 19-12-2008 à 16:15:16
Voici ce qu'on ma répondu :
Pour nommer une cellule ou une plage de cellules
XL<2007
Sélectionner la plage voulue
Insertion-nom-définir
pour trouver la plage nommée
edition-atteindre et tu sélectionnes "payscode"
La je comprends mieux.
je vais essayer de le faire marcher dans mon fichier à présent je reviens ici si j'ai un souci.
merci pour tes réponses.
Marsh Posté le 19-12-2008 à 16:17:28
PaysCode c'est un nom que tu donnes a une plage de cellule.
Ca evite de se taper des $A$1:$B:X ou X devra etre incrémenté.
Là ton PaysCode change a chaque fois que tu ajoutes une ligne, donc pas besoin d'ajuster les formules.
[edit]
En fait il faut pas passer par Insertion, Definir. La tu vas donner un nom a une plage fixe. (Je fais court)
Il vaut mieux que tu sélectionnes ton tableau, click droit, créer une liste. Ensuite, tu vas dans Insertion, Definir pour lui donner un nom.
[/edit]
Cordialement
Marsh Posté le 19-12-2008 à 16:42:44
Merci pour tes précisions.
C'est plus clair maintenant.
Mais je ne vois toujours pas le role joué par cette déclaration :
NB.SI(PaysCode;A1)>0;
Le supérieure à 0 m'intrigue.
Marsh Posté le 19-12-2008 à 20:01:15
Ca evite, au cas ou il ne trouve pas la valeur cherchée, qu'Excel te renvoit #N/A dans la cellule.
Marsh Posté le 22-12-2008 à 09:49:26
A l'instar de dje, j'utilise aussi un truc pour éviter les #N/A, mais je lui préfère un "SIERREUR"
Par exemple sur cette recherche, je retourne la 3ème colonne des colonnes C à F de ma feuille "BoG and Classification"
(j'utilise aussi les colonnes sans préciser de numéro de ligne...)
=SIERREUR(RECHERCHEV($K2;'BoG and Classification'!$C:$F;3;FAUX);"" )
Marsh Posté le 22-12-2008 à 11:32:12
Bonjour,
sur ta feuil1 a partir de la ligne 7, en colonne 1 tu écris le code en colonne 2 tu mets le pays
fais attention que les noms ne soit pas précédé d'espace
Geog Country
APAC (Asia PACific) China
APAC (Asia PACific) Hong-Kong
APAC (Asia PACific) Japan
APAC (Asia PACific) Malaysia
APAC (Asia PACific) Singapore
APAC (Asia PACific) Taiwan
APAC (Asia PACific) Thailand
APAC (Asia PACific) Indonesia
BELUX (BElgium Luxembourg) Belgium
BELUX (BElgium Luxembourg) Luxembourg
FR France
FR Morocco
FR Austria
GCE Germany
GCE Poland
IB Andorra
IB Portugal
IB Spain
INDIA India
IT Italy
dans la feuille 2
dans cells(1,1) tu écris le non du pays
dans cells(1,2) tappes la formules =rep(LC(-1)
Fonction VBA :
Function rep(pays1)
pays1 = Trim(pays1)
Application.Volatile
Dim tab_code 'Crée une variable
Set tab_code = CreateObject("Scripting.Dictionary" )
l = 7
col = 2
While Sheets("feuil1" ).Cells(l, col) <> ""
pays = Trim(Sheets("feuil1" ).Cells(l, col))
' Sheets("feuil1" ).Cells(l, col) = pays
code = Trim(Sheets("feuil1" ).Cells(l, col - 1))
If code = "" Then
code = code_old
Else
code_old = code
End If
tab_code(pays) = code
l = l + 1
Wend
If tab_code.exists(pays1) Then
rep = tab_code(pays1)
Else
rep = "Non défini"
End If
End Function
Marsh Posté le 22-12-2008 à 14:36:27
Houlaaaa merci pour le code pyrof mais le VBA je n'ai encore jamais utilisé.
Ca fait 3 mois que je bosse sur excel deja que j'ai quelques difficultés avec la rechercheV comme le montre le fait que je n'ai pas réussi a faire fonctionner le code de dessus.
Mais je peut tenter pourquoi pas.
j'ai fait comme tu m'as dis mais je sèche ici :
dans cells(1,2) tappes la formules =rep(LC(-1)
cells(1,2) correspond à quoi exactement ?Colonne 1 ligne 2 ?
Pour la formule je l'ai mise dans une cellule mais ca ne fonctionne pas excel me dit qu'elle contient une erreur.
Enfin pour le code VBA pour l'insérer je dois créer une nouvelle macro ?
Marsh Posté le 22-12-2008 à 14:39:30
dans la feuille 2
ligne 1 colonne 1 tu saisis le nom du pays
dans le cellule ligne 1 colonne 2 su saisis :
=rep(LC(-1))
et tu auras le code
Marsh Posté le 22-12-2008 à 15:06:09
Merci pour ces précisions?
Mais en ce qui concerne l'ajout du code VBA j'ai ouvert la fenêtre Microsoft Visual Basic et c'est grisé foncé.
Pas moyen de faire nouveau code ou quelque chose du genre.
Est-ce bien ici que l'on doit entrer le code VBA ?
Marsh Posté le 22-12-2008 à 15:20:39
tu dois avoir une fenêtre Projet, si ce n'est pas le cas fait CTRL R
tu fais clic droit, insertion ,module
et tu colles le VBA
tu reviens dans la feuille, ça doit fonctionner
Marsh Posté le 22-12-2008 à 15:33:42
ALors j'ai ajouté le code VBA comme tu m'as dit.
IL n ya pas de systeme d'enregistrement donc j'ai simplement fermer la fenêtre je pense que le code st gardé en mémoire.
Ensuite j'a mis cette formule =rep(LC(-1)) en ligne 1 colonne 2.
mais rien ne se passe.
Ne devrais'-je pas selectionner le code vba quelque part? Dire a excel que la formule agit sur le code que j'ai copié collé? Car la aucune déclaration n'a relier le code et ma formule si je ne m'abuse ?
Marsh Posté le 22-12-2008 à 15:38:44
Connais tu le site http://www.excel-downloads.com/forum/forum-excel/
c'est un forum un peu plus performant, on peut joindre des fichiers
Marsh Posté le 22-12-2008 à 15:41:00
Je suis deja tomber dessus en cherchant des tuto je pense.
Je vais m'inscrire ca a l'air pas mal merci.
Marsh Posté le 22-12-2008 à 16:31:46
Il fallait mettre ca : =rep(A1)
Ca fonctionne maintenant;
Merci beaucoup pyrof
Marsh Posté le 22-12-2008 à 16:59:34
En effet, on peut faire du VBA, mais vu qu'un simple fonction "RECHERCHEV" suffit, c'est un peu idiot de ne pas l'utiliser (surtout que je doute que la macro soit autant optimisée qu'un RECHERCHEV)
Marsh Posté le 22-12-2008 à 17:12:15
En fait la j'utilise les deux.
Le travail que je fait n'est pas pour moi la personne choisira entre les deux méthodes celle qu'elle préfère.
pyrof j'ai une autre question :
d'apres ton code tu m'as dit de procéder ainsi :
dans cells(1,1) tu écris le non du pays
dans cells(1,2) tappes la formules =rep(LC(-1)
Mais que dois-je modifier dans le code pour que ton code s'applique à partir de la ligne suivante ? En fait je voudrais mettre un en-tête ou un titre à la colonne j'ai donc besoin de la 1ere ligne.
Marsh Posté le 23-12-2008 à 08:00:27
Bonjour,
l'argument de la fonction rep est l'adresse de la cellule contenant le nom du pays
dans l'exemple rep(LC(-1)), LC(-1) veut meme ligne(L) colonne précédente C(-1)
si tu met rep(A1) la fonction prendra la valeur de la première cellule
Avec LC(-1), tu peux recopier la formule dans la ligne 2, rep ira chercher le nom du pays dans ligne 2 colonne 1.
Voila pourquoi je préfère travailler ac LC(-1) que par A1
Il est évident que le recherchev fonctionne, mais il faut développer le cas ou le pays n'est pas dans la liste. Ce qui complique la commande. Parfois le vba est plus facile à mettre en œuvre que des commandes à rallonge qui parfois peuvent être appliquées à une multitude de cellule.
C'est mon expérience qui le démontre.
Bonne fête de fin d'année
Marsh Posté le 23-12-2008 à 09:47:54
Merci pour l'explication.
Je comprends mieux le code à présent.
Même si =rep(LC(-1)) ne fonctionne pas, excel indique que LC contient une erreur et ne vut donc rien éxecuter.
C'est vrai que ce serait plus pratique que par A1.
Bonne fête de fin d'année également.
Marsh Posté le 23-12-2008 à 11:43:05
Ah oui je reviens à vous pour un autre petit souci.
Comme dit dans mon premier post :
"Vous remarquerez peut-être que le dernier code (WL) est attribué à des pays qui sont déjà concerné par d'autres codes (FR pour France, GCE pour Germany et BELUX pour Belgium mais laissons ca de côté j'essaierai de gérer cela plus tard). "
je dois donc gérer cela a présent.
En fait, en plus des codes pays je voudrais rajouter un code "WL"
En plus de la colonne pays, WL devra automatiser une autre colonne "Service Line" si celle-ci contient le mot Worldine.
Mais, le problème, c'est que Wordline est assimilé soit à France, Germany, Spain ou Belgium ....
Vous l'aurez compris ces pays sont déjà automatisé par les codes pays FR, GCE, IB et Belux ...
Donc pour résumer j'aimerais modifier le code afin d'ajouter une autre "condition" :
si Pays = France ET si Service Line = Worldine ALORS le code VBA devrait dire Wordline.
Dans le cas contraire le code affiche simplement FR.
Je pense qu'il serait plus judicieux d'ajouter cette condition en globalité meme si cela concerne tout les pays.
j'ai commencé à "essayer" de modifier mon code qui fonctionne avec les conditions (car VBA je suis novice).
J'ai pondu cette ligne qui ne fonctionne pas pour le moment :
=SI(ET(NB.SI(PaysCode;LC(1))>0;LC(2)<>Wordline);RECHERCHEV(LC(1);PaysCode;2;FAUX);"Wordline" )
Explication :
ET ... C(2)="Wordline" ==> Je veut dire ET si Colonne + 2 est différent de Wordline alors afficher Code Pays, sinon afficher Worldine.
D'après mon raisonnement le code affiche soit le Code Pays, soit Wordline si la colonne "Service Line" contient le mot Wordline.
Je suppose que ma ligne contient des erreurs.
Marsh Posté le 23-12-2008 à 11:51:53
Bonjour,
J'ai du mal a te suivre
Nous étions sur Hardware, je t'ai dis d'aller sur Excel download pour pouvoir joindre des fichiers.
Tu l'as fais, c'est bien
Mais tu continues les fils sur les 2 Forum, ça devient dur à suivre
Marsh Posté le 23-12-2008 à 11:53:03
Car je suis sur la méthodo par condition ici et via le VBA dans l'autre.
Pas de souci je ferme ici si cela gêne.
Bonne fêtes
Marsh Posté le 23-12-2008 à 13:06:09
Je persiste et signe, ce genre de chose n'a pas à être géré avec du VBA !!!
Les fonctions peuvent très facilement être utilisées, sont claires, maintenables et performantes, je ne comprends pas pourquoi on devrait s'en passer.
Tu mixes des "SI" avec des "RECHERCHEV" et tu auras ton résultat...
Le plus simple, ça reste dans un premier temps de décomposer ton pb...
Dans une colonne, tu mets le résultats de ta recherche, puis ensuite, dans une autre colonne tu fais ton SI... etc...
Quand tout est OK, tu peux facilement remettre ça dans une seule formule.
Edit : si tu veux qu'on t'aide plus, indique qq valeurs (en mode "fixe" pour que ça soit lisible), avec les différent cas pour qu'on écrive bien le truc, et on te fait ça
Marsh Posté le 23-12-2008 à 17:02:33
Voilà ce que je te propose de mettre en "I2", et ensuite d'étendre...
Perso j'utilise le "SIERREUR", tu peux aussi remplacer le truc par ton NB.SI si tu préfères
=SIERREUR(SI(L2<>"Worldline";RECHERCHEV(J2;PaysCode;2;FAUX);"Worldline" );"" ) |
Tu parlais de la colonne "S&M or SL" (colonne K), mais je pense plutôt qu'il s'agit de la colonne "Service Line" (colonne L)... c'est pour ça que j'ai indiqué un "L2" dans ma formule.
Voilà.
Marsh Posté le 23-12-2008 à 17:42:28
Merci pour la proposition.
J'essaye ton code, je n'ai pas le résultat escompté pour le moment mais je fais des petit test pour voir d'ou provient l'erreur.
Bonne fête à toi également.
Marsh Posté le 23-12-2008 à 17:53:30
J'ai modifié le code que voici :
=SI(NB.SI(PaysCode;J5)>0;(SI(L5<>"Worldline";RECHERCHEV(J5;PaysCode;2;FAUX);"WL" )))
(exemple pour la ligne 5)
Ca fonctionne comme ca.
Marsh Posté le 19-12-2008 à 15:27:19
Bonjour,
tout d'abord j'ai hésité a poster ce sujet ici si il doit être déplacé dans software pas de souci.
Voici mon problème.
Je possède une liste de pays, et je veut faire en sorte que, selon le pays, un code soit attribué automatiquement à chaque pays dans une colonne à côté.
Voici les pays et les codes correspondants :
Geog
Country
APAC (Asia PACific)
China
Hong-Kong
Japan
Malaysia
Singapore
Taiwan
Thailand
Indonesia
BELUX (BElgium Luxembourg)
Belgium
Luxembourg
FR
France
Morocco
GCE
Austria
Germany
Poland
IB
Andorra
Portugal
Spain
INDIA
India
IT
Italy
MEA
Greece
South Africa (SAF)
Swiss
Turkey
NAM
US
Mexico
NL
The Netherlands
SAM
Brasil
Argentina
Chile
Colombia
Peru
Venezuela
UK
United Kingdom
WL
Belgium
France
Germany
Vous remarquerez peut-être que le dernier code (WL) est attribué à des pays qui sont déjà concerné par d'autres codes (FR pour France, GCE pour Germany et BELUX pour Belgium mais laissons ca de côté j'essaierai de gérer cela plus tard).
Donc pour réaliser ce petit automatisme j'éprouve quelques soucis.
Excem 2003 ne gère que 7 conditions SI donc je ne peut pas mettre mes 32 conditions à la ligne.
Je peut faire cela mais ca me crée plusieurs colonnes avec des doublons :
=SI(A1="France";"FR";SI(A1="Morocco";"FR";SI(A1="Spain";"IB";SI(A1="Andorra";"IB";SI(A1="Belgium";"BELUX";SI(A1="Luxembourg";"BELUX";"" ))))))
=F1 & SI(A1="Hong-Kong";"APAC";SI(A1="Japan";"APAC";SI(A1="Malaysia";"APAC";SI(A1="Singapore";"APAC";SI(A1="Taiwan";"APAC";SI(A1="Thailand";"APAC";"" ))))))
=F1 & SI(A1="Indonesia";"APAC";SI(A1="Austria";"GCE";SI(A1="Germany";"GCE";SI(A1="Poland";"GCE";SI(A1="Portugal";"IB";SI(A1="India";"INDIA";"" ))))))
Quelqu'un aurait-il une méthode plus simple afin de mener à bien mon projet?
Merci beaucoup