Recherche de valeur dans Visual Basic
GAELAMONTREAL
-
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
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
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:
- Recherche de valeur dans Visual Basic
- Visual basic - Télécharger - Langages
- Visual basic editor - Télécharger - Langages
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Microsoft 365 basic - Accueil - Microsoft Office
- Visual c++ 2019 - Guide
10 réponses
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
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
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
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
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.
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.
J'ai fait un exemple du tableau très rapide disponible ici:
https://www.cjoint.com/?fxsbknI4Ll
Merci
https://www.cjoint.com/?fxsbknI4Ll
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
Dsl pour l'erreur de format.
le lien pour mon exemple en 2003 est
https://www.cjoint.com/?fytqNVwQ1w
Merci
Dsl pour l'erreur de format.
le lien pour mon exemple en 2003 est
https://www.cjoint.com/?fytqNVwQ1w
Merci
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
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
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 :-)
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 :-)
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 !
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 !
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
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