EXCEl : Condition SI ==> Regroupez des pays selon un Code

EXCEl : Condition SI ==> Regroupez des pays selon un Code - VB/VBA/VBS - Programmation

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

Reply

Marsh Posté le 19-12-2008 à 15:27:19   

Reply

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 ...

Reply

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 ?

Reply

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.

Reply

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


---------------
Soyez malin, louez entre voisins !
Reply

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.

Reply

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.

Reply

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


Message édité par SuppotDeSaTante le 19-12-2008 à 16:21:47

---------------
Soyez malin, louez entre voisins !
Reply

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.

Reply

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.


Message édité par SuppotDeSaTante le 19-12-2008 à 20:01:28

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 19-12-2008 à 20:01:15   

Reply

Marsh Posté le 21-12-2008 à 12:24:38    

Merci pour la précision dje.

Reply

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);"" )

Reply

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

Reply

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 ?

Reply

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

Reply

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 ?

Reply

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

Reply

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 ?

Reply

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

Reply

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.

Reply

Marsh Posté le 22-12-2008 à 16:31:46    

Il fallait mettre ca : =rep(A1)
 
Ca fonctionne maintenant;
 
Merci beaucoup pyrof ;)

Reply

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)

Reply

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.
 

Reply

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

Reply

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.

Reply

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.

Reply

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
 

Reply

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 ;)

Reply

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


Message édité par Ptit loup le 23-12-2008 à 13:07:02
Reply

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à.

Reply

Marsh Posté le 23-12-2008 à 17:02:43    

et bonnes fêtes ! :p

Reply

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.
 
 

Reply

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.


Message édité par kiru@ le 23-12-2008 à 17:58:48
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed