Recherche de valeur dans Visual Basic

Fermé
GAELAMONTREAL - 22 mai 2009 à 23:29
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 25 mai 2009 à 00:03
Bonjour

J’ai un projet de transport à réaliser sous Excel:

Une feuille interface permet à l’utilisateur de rentrer le nom d’un pays et d’un code postal et lui indique quel transporteur il doit utiliser en fonction de la surcharge de carburant appliquée pour ce code postal et dans ce pays.

Une feuille “base de données” regroupe les différents pays et certain codes postaux pour lesquels il y a une surcharge de carburant.

Je souhaite savoir comment programmer en visual basic une fonction recherchant ce code postal dans ce pays et renvoyant true si elle le trouve ou false sinon type function “IF”.

J’ai pensé à mettre en place une bloucle “for…next” mais je crains que cela ne m’oblige à mettre un index devant chaque ligne et il doit y en avoir plus de 10000.

Je pense par ailleurs que la disposition de mes donnes dans ma feuille “base de donnees
“ va poser probleme. En effet, mes pays sont situes dans une colone et dans la cellule juste a cote se trouve le code postal. Si il n’y avait que 2 colonnes pas de probleme mais il va y en avoir au moins 6 tels que:

PAYS CP PAYS CP PAYS CP

Voilà mon probleme c’est surtout que je ne connqit pas le language VB donc si quelqu’un pouvait m’aider ce serait super.

MERCI
J’ai un projet de transport à réaliser sous Excel:

Une feuille interface permet à l’utilisateur de rentrer le nom d’un pays et d’un code postal et lui indique quel transporteur il doit utiliser en fonction de la surcharge de carburant appliquée pour ce code postal et dans ce pays.

Une feuille “base de données” regroupe les différents pays et certain codes postaux pour lesquels il y a une surcharge de carburant.

Je souhaite savoir comment programmer en visual basic une fonction recherchant ce code postal dans ce pays et renvoyant true si elle le trouve ou false sinon type function “IF”.

J’ai pensé à mettre en place une bloucle “for…next” mais je crains que cela ne m’oblige à mettre un index devant chaque ligne et il doit y en avoir plus de 10000.

Je pense par ailleurs que la disposition de mes donnes dans ma feuille “base de donnees
“ va poser probleme. En effet, mes pays sont situes dans une colone et dans la cellule juste a cote se trouve le code postal. Si il n’y avait que 2 colonnes pas de probleme mais il va y en avoir au moins 6 tels que:

PAYS CP PAYS CP PAYS CP

Voilà mon probleme c’est surtout que je ne connqit pas le language VB donc si quelqu’un pouvait m’aider ce serait super.

MERCI
A voir également:

10 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
23 mai 2009 à 09:18
Bonjour,

Il y a 10000 pays ??? (l'ONU en est à un peu moins de 200...)

de type "IF" pourquoi, il y peut être d'autres solutions, pareil pour la boucle FOR...NEXT?

Tu n'as pas besoin de VBA pour faire ce que tu demandes:

tu sélectionne l'ensemble de tes colonnes et lignes par ex: A2:F5000
tu écris le nom cherché dans une cellule vide par ex:H1
=(NB.SI(A2:F5000;H1)>0)
te renvoie vrai si la valeur est dans le tableau
0
GAELAMONTREAL
23 mai 2009 à 17:31
Bonjour,

Merci pour votre réponse, en fait je voulais dire 10000 codes postaux....

Votre solution est plutôt sympa et j'y est déjà pensé mais ça ne peut pas fonctionner le but est de trouver un code postal connecté avec un pays cad:

l'utilisateur met france 44000 Le programme doit cherché si ce code fait partie des destinations présentant une surcharge: soit retrouver la combinaison de cellule (sur la meme ligne) france 44000.

Avec un nb.si le progamme va juste chercher si la valeur est présente dans la base de données sans réellement lier le pays avec le code postal si je met 2 fonction nombre de si. A moins que nombre de si puisse prendre en argument 2 éléments...

Si vous avez d'autres idées ça me sauverait....

Merci
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
23 mai 2009 à 17:45
bonjour,
OK, compris (mais pas résolu!...)

Afin de comprendre la structure de ton tableau pour faciliter la recherche d'une solution, pourrais tu mettre un extrait Excel (XL<2007) de quelques lignes seulement de ton tableau sur
https://www.cjoint.com/
et coller le lien proposé dans ton message.
0
GAELAMONTREAL
23 mai 2009 à 18:02
J'ai fait un exemple du tableau très rapide disponible ici:

https://www.cjoint.com/?fxsbknI4Ll

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
23 mai 2009 à 19:55
Classeur illisible par enregistré en XML
prière d'enregistrer en xls: j'avais précisé XL<2007!!!
0
GAELAMONTREAL
24 mai 2009 à 19:18
Bonjour,
Dsl pour l'erreur de format.

le lien pour mon exemple en 2003 est

https://www.cjoint.com/?fytqNVwQ1w
Merci
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 247
24 mai 2009 à 19:47
Bonjour,

comme michel c'est endormi je te propose :
=SI(SOMMEPROD((D6&E6=A1:A50&B1:B50)*1);"oui";"non")
mais il faut que toutes tes valeurs soient en A:B

eric
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
24 mai 2009 à 23:17
Bonsoir Gael, Eric

OK pour ta formule (belle astuce, d'ailleurs!), Eric, qui répond au classeur envoyé par Gael... mais comme tu le dis, pour 2 colonnes et d'après le 1° message, Il y aurait N fois 2 colonnes
Si c'est le cas, j'avais pensé partir sur la fonction find avec for each d'après l'exemple microsoft mais il y a peut-être + fute-fute...

là, maintenant je vais au dodo :-)
0
GAELAMONTREAL
24 mai 2009 à 23:38
Bonjour,

Merci Eric pour ta formule, ça fonctionne parfaitement pour 2 colonnes et elle est vraiment très astucieuse je n'avait pas du tout pensé à ça.

On va dire aussi que je ne maîtrise pas du tout la fonction somme produit avec du texte (très fort) par contre pourrait tu m'expliquer le 1 dans la formule représente une matrice ?

Par contre est-ce que je vais pouvoir m'en sortir avec plusieurs colonnes avec cette formule (enfin en la modifiant un peu) ?

Merci pour tout en tout cas ça fait plaisir d'avoir du monde qui m'aide !
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 247
25 mai 2009 à 00:03
Re,

oui, tu peux traiter autant de colonnes que tu veux mais en restant raisonnable quand même. Sommeprod() est assez gourmand, donc mieux vaut éviter les colonnes complètes.

Le principe est de multiplier des matrices de test (vrai*vrai=>vrai, vrai*faux=>faux,...) et de multiplier en dernier lieux soit par une matrice de valeurs (auquel cas on a la somme des valeurs ayant vrai à tous les tests), soit de multiplier par 1 pour transformer les vrai en 1 et les faux en 0. Dans ce cas on a le nombre de valeurs répondant aux tests.
Bien sûr les matrices doivent toutes avoir la même taille.
=sommeprod((tests_colonne1)*(tests_colonne2)*(...)*(test_colonne_n)*(valeurs_colonne_m))
ou
=sommeprod((tests_colonne1)*(tests_colonne2)*(...)*(test_colonne_n)*1)

Dans ton cas D6&E6=A1:A50&B1:B50 donne (avec 44002) :
"France44002"={"";"";"Surcharge";"PAYSCODE POSTAL";"France44000";"France44001";"France44002";"France44003";...;"";""}
=>
{FAUX;FAUX;FAUX;FAUX;FAUX;FAUX;VRAI;FAUX;...;FAUX;FAUX}
qui *1 donne : {0;0;0;0;0;0;1;0;...;0}
et sommeprod() te fait la somme de cette matrice soit =1

eric
0