Aide sur fonctions de recherche [Excel] - VB/VBA/VBS - Programmation
Marsh Posté le 05-08-2008 à 23:57:47
Peut-il y avoir pour un OM plusieurs AV, TR et/ou VL ?
Veux-tu que ces lignes se mettent les unes en dessous des autres ?
Marsh Posté le 06-08-2008 à 00:02:22
Non, il ne peut y avoir pour chaque OM qu'une seule de ces prestations, simplement on ne sait lesquels ont été combinées.
La remontée se fait dans un tableau avec OM en lignes et AV, TR, puis VL en colonnes. J'ignore si je suis clair ?
Marsh Posté le 06-08-2008 à 00:10:24
C'est tordu )
Je file me coucher, fais en autant ^^
Bonne soirée
Marsh Posté le 06-08-2008 à 10:23:02
Regarde si ce résultat te convient (et si tu comprends qqch) : http://cjoint.com/?igkvypSMY7
Cela repose sur la validation matricielle.
En gros, le principe est de recherche la ligne qui correspond aux intersections du tableau et ensuite on l'affiche.
Marsh Posté le 06-08-2008 à 10:56:23
Je regarde cela dès que possible dans la journée,
Merci quoiqu'il en soit pour le coup de pousse
Marsh Posté le 06-08-2008 à 11:46:52
Quelques explications sur une partie de la formule utilisée dans ce post : http://forum.hardware.fr/hfr/Progr [...] m#t1770087
Marsh Posté le 06-08-2008 à 17:37:00
Tout le monde collé à mes bask aujourdhui...mais je look cela dès mon retour à la maison
Merci milles fois!
Marsh Posté le 06-08-2008 à 18:26:19
Bon j'en ai touché deux mots à mon boss avant de quitter...
lui pencherait plutôt vers un Somme.si et Si imbirquée mais en tt état de cause, a exclu la validation matricielle :x
Ceci étant dès mon retour, je m'attarderai un peu sur cette fonction que je ne connais pas encore
A plus
Marsh Posté le 07-08-2008 à 13:24:09
Bon bah non, je n'y arrive pas :x
J'essaie cette formule;
=SI(Liste_transport_2008!I:I="Avion";RECHERCHEV(tableau_bord!A:A;Liste_transport_2008!$A$2:$J$12117;10);"0" )
mais cela ne renvoie que la valeur 0 dans mon tableau, moaurf!
Vous auriez une idée s'il vous plait ?
Marsh Posté le 07-08-2008 à 13:39:48
Serais-tu breton ?
Ta formule ne peut pas marcher car tu lui demandes de faire un "SI" sur un résultat sur qqch qui est déjà à plat... (ton RechercheV a transformé ton tableau à deux dimensions en un nombre donc tu ne peux plus rien faire avec ce nombre)
La meilleure solution (enfin, la plus logique par rapport au potentiel réel d'Excel) est celle du fichier joint.
Après si tu ne veux pas utiliser de validation matricielle, il y a une autre solution : si on part du principe que tu as trois colonnes ("indice 1", "indice 2" et "résultat" à afficher respectivement en A,B et C), il faut que tu en crées une 4° à gauche de "résultat" avec la formule : =CONCATENER(A1;B1)
Ensuite tu fais : =RECHERCHEV(CONCATENER("indice 1 à trouver";"indice 2 à trouver" );"zone de recherche avec ta colonne concaténée en premier";"numéro de la colonne à affciher";FAUX)
Marsh Posté le 07-08-2008 à 14:02:17
lol non je ne suis pas breton, mais mon boss si ^^
Bon bah tu as l'air tellement sûr de ton résultat, que je retourne voir le fichier joint et essaie de l'appliquer à mon cas d'espèce
Marsh Posté le 07-08-2008 à 14:10:49
J'ai du mal à l'appliquer ...
même en ayant relu tes explications et après avoir consulté le fichier joint
Marsh Posté le 07-08-2008 à 14:37:59
Je me suis gourré qqpart apparemment mais je ne sais pas où...
Vois ce que j'ai marqué :
=INDEX(Liste_transport_2008!$J$2:$J$65000;EQUIV(FAUX;SI(SI(SI(Liste_transport_2008!$I$2:$I$65000="Avion";Liste_transport_2008!$A$2:$A$65000)=Liste_transport_2008!$A18;Liste_transport_2008!$J$2:$J$65000;0)=0;0);0);1)
EDIT : Dans mon tableau Liste_transport_2008, j'ai en colonne A (N° OM), en colonne B (type de presta) et en colonne C (montant presta)
mais j't'avoue qu'après le SI="Train" je suis un largué...
Marsh Posté le 07-08-2008 à 14:40:44
Si on considère le tableau ci-dessous :
A B C
1 OM AV/TR/VL Montant
2 1 AV résultat1
3 1 TR résultat2
4 2 AV résultat3
5 2 TR résultat4
6 2 VL résultat5
Et que le tableau de résultat correspond à ca :
A B C D E
1 OM AV TR VL
2 1 résultat1 résultat2
3 2 résultat3 résultat4 résultat5
Alors la formule de résultat de la case C2 est :
Code :
|
En décomposant du plus bas vers le plus haut :
Code :
|
=> Donne la liste des ligne correspondant au bon AV/TR/VL (ici AV). Renvoie un tableau indiquant l'OM de la ligne ({1;FAUX;2;FAUX;FAUX})
Code :
|
=> Donne la liste (à partir de la précédente) des OM correspondants. Renvoie un tableau indiquant le résultat. {"résultat1";0;0;0;0}
Code :
|
=> Donne le résultat qui est différent de 0. Renvoie une valeur => résultat1
Marsh Posté le 07-08-2008 à 14:42:10
Mets ton fichier (en truquant les modifiant les OM et les montants et avec trois ou quatres lignes si nécessaire)
Marsh Posté le 07-08-2008 à 14:44:23
J'analyse ton explication et si je n'y arrive toujours pas, je te fourni un fichier d'exemple
Marsh Posté le 07-08-2008 à 14:51:16
=> http://cjoint.com/data/ihoYSLAKzW.htm
Marsh Posté le 07-08-2008 à 15:17:44
Décidément...non
ca me renvoie #NA..
cela pourrait-il être du au fait que dans mon tableau Liste_transport_2008, les OM sont issus d'une recherchev ?
Marsh Posté le 07-08-2008 à 15:29:53
=> http://cjoint.com/?ihpDHyq7Iq
Marsh Posté le 07-08-2008 à 15:30:53
Non.
Attention : Pour faire une validation matricielle, il faut valider en faisant CTRL + SHIFT + ENTER et non ENTER tout seul.
Marsh Posté le 07-08-2008 à 15:33:42
Ca m'a bien rajouté les { } mais ça n'a rien changé au résultat final...qui affiche toujours #NA
Marsh Posté le 07-08-2008 à 15:41:38
Dans ta colonne "Moyen de transport", tes libellés comportent plein d'espace, il faut rajouter un SUPPRESPACE dans la formule.
A mettre en N2 et à faire glisser :
Code :
|
Par contre sur 65000 lignes, c'est pas vraiment une bonne idée (il faudrait limiter la zone sinon Excel plante...)
Marsh Posté le 07-08-2008 à 15:47:15
La solution annexe présentée plus haut est bien plus rapide en fait :
Citation : Après si tu ne veux pas utiliser de validation matricielle, il y a une autre solution : si on part du principe que tu as trois colonnes ("indice 1", "indice 2" et "résultat" à afficher respectivement en A,B et C), il faut que tu en crées une 4° à gauche de "résultat" avec la formule : =CONCATENER(A1;B1) |
Marsh Posté le 07-08-2008 à 16:06:34
Bon bah, désolé mais je n'arrive à rien
Ne t'embêtes pas plus, j'vais aller apprendre à utiliser ces fonctions INDEX et EQUIV comme un grand...
Marsh Posté le 07-08-2008 à 16:53:41
Pour résumer le post : les deux solutions dans un seul fichier excel
=> http://cjoint.com/?ihq0Q827HL
Marsh Posté le 07-08-2008 à 17:44:06
Je ne peux être que reconnaissant pour ton aide!!
J'ai vraiment du mal avec cette fonction...
Marsh Posté le 07-08-2008 à 18:50:56
J'ai compris pourquoi cela ne fonctionne pas, suite à ce que tu as dit plus haut.....concernant les espaces et la fonction supprespace
la fonction ne s'applique pas, ce ne sont pas des espaces mais des caractères
à part retraiter ma colonne avec une fonction gauche(), je vois pas...
Marsh Posté le 07-08-2008 à 18:54:26
La fonction SUPPRESPACE.
Mais vu la rapidité sur un grand nombre de ligne, je pense qu'il faudrait que tu regardes du coté de la solution 2 du dernier fichier joint (qui est en plus plus facile)
Marsh Posté le 07-08-2008 à 22:25:02
La fonction ne fonctionne même pas étant donné qu'elle ne considère pas ces blancs comme des espaces :x elle est donc totalement inutile pour l'extraction que j'obtiens
Concernant la seconde solution, je préfère finalement faire une si, toute simple, et reclasser ma Bdd puis faire remonter le tout par une recherchev
Au départ je cherchais à minimiser les manips sur ce tableau pour en permettre une MàJ mensuelle, voire bi-hebdo mais bon, cela étant impossible, je ferais une macro qui fera ces manips à ma place
Merci de ton aide, j'aurais appris pas mal de chose sur un seul post
Marsh Posté le 07-08-2008 à 23:47:31
J'galère ouinnnnn!
Regarde ce que j'ai fais s'il te plait parce que j'comprend vraiment plus où j'pourrais m'être trompé :x
J'ai créé à l'intérieur de mon onglet Liste_transport_2008 une colonne dont la formule est : =CONCATENER(A2;I2) ce qui donne 9Avion avec comme colonne suivante le prix du bon de commande.
A partir de mon tableau de bord, je fais remonter mon information par l'intermède d'une =RECHERCHEV((CONCATENER($A2;N$1));Liste_transport_2008!$J$2:$K$5631;2;FAUX)
étant assuré que le (CONCATENER($A2;N$1) me donne un résultat du type 9Avion, je n'obtiens jamais le bon résultat qui remonte.
De plus, si j'ajoute le dernier paramètre de notre fonction j'obtiens pour unique résultat #NA, sans, c'est chiffré mais faux.
Que faire please ?
Marsh Posté le 08-08-2008 à 00:00:21
Mettre
Code :
|
au lieu de
Code :
|
NB : Et dans l'onglet tableau_bord, il faut mettre "Avion" et non "AV" pour correspondre à l'autre onglet
Marsh Posté le 08-08-2008 à 02:15:02
J'avais pensé à changer le nom de mes colonnes
J'essayerais demain voir
Merci
Marsh Posté le 08-08-2008 à 13:34:38
Citation : =(INDEX(Liste!$D$2:$D$12;EQUIV(FAUX;SI(SI(SI(Liste!$B$2:$B$12=B$2;Liste!$A$2:$A$12)=$A3;Liste!$D$2:$D$12;0)=0;0);0);1)) |
J'ai vraiment du mal à lire ta première formule...
notamment tes fonctions SI, et ce malgré les explications que tu as pu donner précédemment
par exemple : si(Liste!B2:B12=B12;liste!A2:A12)=A3;..... le coup d'une place également à une cellule, je m'y perds :x
comment lirais-tu l'intégralité de ta fonction, en bon français s'il te plait ?
Marsh Posté le 08-08-2008 à 14:01:10
En partant de cet exemple :
Citation : Si on considère le tableau ci-dessous : Et que le tableau de résultat correspond à ca : Alors la formule de résultat de la case C2 est :
|
Code :
|
Si dans la plage B2:B6, une cellule est égal à B9 ("AV" ), alors il affiche la donnée de la colonne A (pour la même ligne), sinon il affiche 0 => (1;0;2;0;0)
Code :
|
Si dans le résultat précédent, une cellule est égal à A10 ("1" ), alors il affiche la donnée de la colonne C (pour la même ligne, sinon il affiche 0) => (résultat1;0;0;0;0)
Code :
|
Si dans le résultat précédent, une cellule est égal à 0, alors il affiche 0, sinon il affiche "FAUX" => (FAUX;0;0;0;0)
Code :
|
Recherche dans le résultat précédent, en quelle position, le mot "FAUX" est affiché => en 1° position
Code :
|
Affiche dans la plage C2:C6 le résultat qui est en 1° position (position trouvé juste au dessus) => "résultat1"
Marsh Posté le 08-08-2008 à 17:57:36
Merci babass, je regarderai cela ce week-end
J'ai finalement appliqué la méthode numéro 2 et cela fonctionne parfaitement. J'y ai rajouté la fonction SI(ESTNA(recherchev... pour nettoyer mon résultat et tout est impecc
Encore merci pour ton aide, j'vais maintenant bosser ttes les fonctions dont tu m'as parlé dans ce post, pour en faire de l'acquis
Marsh Posté le 09-08-2008 à 07:56:08
Bonjour,
pour faire un acquis supplémentaire, peux-tu essayer cette formule à caser en N2 et à étendre:
=SI($A2>0;SOMMEPROD(((Liste_transport_2008!$A$2:$A$10000)=tableau_bord!$A2)*(GAUCHE((Liste_transport_2008!$C$2:$C$10000))=GAUCHE(tableau_bord!N$1))*(Liste_transport_2008!$D$2:$D$10000));"" )
nota: le 10000 est à adapter au nombre de lignes max de liste_transport et le "SI(...)" permet d'étendre tout de suite la formule au nbre de lignes max prévues dans tableau de bord
cordialement
Marsh Posté le 10-08-2008 à 13:59:59
J'ai pas mal modifié mon tableau durant le we, la formule ne correspond plus du tout.
Je viens d'essayer et ca me donne 0 pour résultat :x
Je n'arrive pas encore à la lire, donc à l'adapter ..
Somme.prod ^^ pas encore fait ça une somme.si hier soir, j'avance j'avance
Marsh Posté le 10-08-2008 à 17:35:00
Bon je viens de me pencher à tête reposée sur la première méthode proposée par babasss et je n'y arrive décidément pas.
Quelques points obscurs persistent et font que peut être je ne sais pas l'adapter correctement à la structure de mon tableau..
Dans les explications que tu me donnes :
- 1° code : tu demandes à excel de repérer dans la colonne où se trouvent les moyens de transports, un type particulier, ici l''Avion'
mais pourquoi =B9 ? alors que ds le tableau que tu fournis en exemple, b9 n'apparait même pas ?
si oui, il renvoit le numéro d'om, jusque là je te suis
2° code : encore une fois A10 ? il te vient d'où ?
Puis la fonction renvoie le montant de la prestation.
Je dois bloquer, dsl, mais même avec les explications, je t'avoue que ce n'est pas clair du tout. J'aimerai comprendre mais j'en resterai là si ta patience y trouve ses limites
Seniorpapou, je vois votre proposition et je re
Merci à vous deux!
Marsh Posté le 10-08-2008 à 17:43:10
seniorpapou ? pourrais-tu, s'il te plait, désigner tes colonnes A, C et N ?
Edit : j'ai fais ainsi, mais cela ne fonctionne pas
Code :
|
C @ TdB = n° OM
A @ LT = n° OM
I @ Ldt = Liste moyen transport
N1 @ TdB = Avion
K @LT = Montants prestations
Résultat = 0
edit2 :
Code :
|
Non...je ne sais pas où je me trompe ?!?!
edit3 :
Code :
|
naaaa...
edit4 :
Code :
|
même en ayant viré la fonction SI, je n'arrive pas à faire remonter correctement l'information avec cette fonction somme.Prod.
Marsh Posté le 05-08-2008 à 23:55:10
Bonjour à tous et d'avance je m'excuse si je poste dans la mauvaise catégorie,
j'imagine certainement que vous serez plus à même de répondre que l'utilisateur excel lambda alors je me lance
(Je préfère apprendre par moi-même mais là j'vous avoue que je sèche...toute piste sera donc exploitée et la bienvenue)
J'ai un fichier composé de plusieurs onglets, dont deux qu'il me faut croiser pour faire remonter certaines informations.
Dans le détails, ça donne :
- Onglet Tableau de bord dans lequel remonte l'info
- Onglet Liste transport 2008 dans lequel sont stockées les données à récupérer
Il me faut aller chercher par le numéro d'ordre de mission les prestations qui ont été utilisées (Avion, Train, VL).
Dans mon tableau de bord j'ai une colonne N° OM bien entendu, pareil dans Liste Transport (récupéré dans un onglet export_OM par recherchev).
La où ça se complique, c'est que pour un même n° d' OM dans mon premier tableau, je peux avoir autant de lignes que de prestations dans mon second tableau.
Le but étant de faire remonter dans 3 colonnes distinctes, AV, TR, VL
Alors dans la ptite tête, j'ai pensé à la recherchev, la rechercheh, et la fonction si, mais j'ignore comment combiner cela pour obtenir mon résultat, ou alors peut être fais-je complètement erreur ?
Merci à tous ceux qui m'éclaireront,
Message édité par Movez LanG le 11-08-2008 à 20:09:31
---------------
<3 lili - http://realkoala.labrute.fr Venez me défier !!