IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

Recherche dans une matrice avec doublons (formule ou VBA) [XL-2010]


Sujet :

Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2010
    Messages : 120
    Points : 175
    Points
    175
    Par défaut Recherche dans une matrice avec doublons (formule ou VBA)
    Bonjour les développeurs,

    En gros : ça fait plusieurs heures que je me casse les dents pour trouver une formule qui me ramène la valeur juste endessous d'une valeur donnée dans liste qui contient des doublons.

    Maintenant je vais détailler le problème pour que vous soyez mieux en mesure de comprendre le problème :
    Je bosse sur une table de données qui contient notamment un champ "Date". Plusieurs enregistrements de cette table peuvent avoir la même date (dans les faits je dois avoir environ 150 enregistrements par date). Pour permettre la comparaison entre une date (le jour J) et la date précédente (J-1) je cherche à récupérer la date du J-1 par formule (qui n'est pas forcément la date du jour précédent => si le jour J est un lundi, le J-1 sera le vendredi précédent).

    Voici quelques éléments d'environnement (pour ajouter un peu de complexité) :
    - La liste de données n'est pas triée (la formule doit fonctionner sans tri car l'utilisateur peut accéder aux données et modifier les tris, donc foutre en l'air une formule basée sur un tri)
    - Je ne peux pas ajouter de champs supplémentaire dans la table (sinon je foire mon export d'access)
    - Le jour J n'est pas forcément la date la plus récente de la liste (l'utilisateur sélectionne la date qu'il souhaite interroger depuis un userform)


    J'ai testé plein de choses pour trouver ce %#$! de J-1 mais je commence à désespérer. Voici un échantillon de ce que j'ai testé :
    - INDEX + EQUIV
    - RECHERCHEV (avec tous les types de recherches possibles)
    - Plusieurs combinaisons avec GRANDE.VALEUR

    Je ne suis pas contre développer une fonction en VBA (et j'en suis même capable) mais je reste persuadé que ce n'est pas nécessaire. Au cas où je me trompe je suis quand même preneur de conseils pour d'éventuels développements VBA.

    J'espère que le problème est clairement exposé, je reste disponible pour compléter ou détailler au besoin.

    Je vous remercie de m'aider et de prendre un peu de votre temps pour réfléchir sur le sujet.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Il est toujours intéressant de préciser sa version d'Excel dans le libellé. Pour avoir la veille ouvrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SERIE.JOUR.OUVRE(AUJOURDHUI();-1)
    Tu peux aussi ajouter une liste de jours fériés; regarde l'aide. Si tu utilise une version antérieure à XL2007, tu dois cocher la macro complémentaire "Utilitaire d'analyse. Je suppose que j'ai mis cette formule en J1, que les dates sont en colonne A et les valeurs à récupérer en colonne B. Les formules sont matricielles (à valider avec Ctrl+Maj+Entrée); la première est valable pour toutes les versions, la seconde seulement pour XL2007 ou postérieures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(ESTERR(PETITE.VALEUR(SI($A$1:$A$30=$J$1;LIGNE($A$1:$A$30));LIGNE(A1)));"";INDEX($B$1:B30;PETITE.VALEUR(SI($A$1:$A$30=$J$1;LIGNE($A$1:$A$30));LIGNE(A1));1))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SIERREUR(INDEX($B$1:B30;PETITE.VALEUR(SI($A$1:$A$30=$J$1;LIGNE($A$1:$A$30));LIGNE(A1));1);"")
    à recopier vers le bas.

  3. #3
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Ci dessous une méthode
    La date choisi se trouvant en B3, la formule retourne le jour précédent hors samedi Dimanche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =DATE(ANNEE(B3);MOIS(B3);JOUR(B3)-(INDEX({3;1;1;1;1;1;2};JOURSEM(B3;2))))

  4. #4
    Membre habitué
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2010
    Messages : 120
    Points : 175
    Points
    175
    Par défaut
    Tout d'abord merci de votre participation et de vos propositions.

    Ensuite je vais tenter de préciser un peu le problème :
    Je cherche à récupérer à partir d'une date sélectionnée par un utilisateur la date directement inférieure présente dans la liste (qui ne correspond pas forcément au jour ouvré précédent la date sélectionnée, il arrive régulièrement que pour une date donnée il n'y ait aucun enregistrement dans la table).

    Voici un exemple pour illustrer :
    colonne A (Dates)
    30/04/2012
    03/05/2012
    04/05/2012
    07/05/2012
    10/05/2012

    >> l'utilisateur sélectionne le 03/05/2012 => je souhaite retourner le 30/04/2012
    >> l'utilisateur sélectionne le 10/05/2012 => je souhaite retourner le 07/05/2012

    Ainsi :
    >> Daniel C. : Je ne cherche pas à ramener des données associées à une date mais une date relative à la date saisie par l'utilisateur. Tes solutions ne correspondent pas directement à mon problème (à mois d'ajouter un champ date précédente dans ma table mais qui risque de compliquer sérieusement le fonctionnement de mon appli Access/Excel).
    >> jfontaine : comme je l'ai réexpliqué un peu plus haut, la date que je cherche à ramener n'est pas forcément le jour ouvré précédent la date saisie.

    En tout cas je vois que du monde se mobilise, je continue à chercher de mon côté aussi => le bout du tunnel n'est pas très loin !

    PS : j'utilise Excel 2010 comme indiqué dans le titre du post

  5. #5
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    peut être avec la formule matricielle suivante

    A valider avec CTRL + MAJ + ENTREE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =MAX(SI((A1:A5<DATE(2012;5;5))*1;A1:A5;0))

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    En fait, ton exemple ne correspond pas à ce que tu as écrit :
    - dates non triées
    -plusieurs enregistrements ayant la même date.
    A tout hasard avec la date choisie en J1, matricielle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =MAX(($A$1:$A$100<J1)*$A$1:$A$100)

  7. #7
    Membre habitué
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2010
    Messages : 120
    Points : 175
    Points
    175
    Par défaut
    Bien vu et merci jfontaine,

    Après avoir adapté à la structure de mon fichier ça semble fonctionner nickel.
    Je fais quelques tests complémentaires et je passe le topic en résolu si c'est OK.

    Merci également à toi Daniel C.

    EDIT : je vois que tu étais sur une piste similaire Daniel C. mais jfontaine aura été plus rapide !!!
    Juste une dernière question sur ta formule jfontaine : en quoi est-ce utile de multiplier par 1 dans le test logique de la fonction SI ?

  8. #8
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    le *1 ne sert a rien ici, tu peux l'enlever

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bouton rechercher dans une bd avec sql server 2005
    Par beco800 dans le forum ADO.NET
    Réponses: 1
    Dernier message: 10/05/2010, 10h53
  2. recherche dans une séquence avec plusieurs prédicats
    Par Alain Defrance dans le forum JavaFX
    Réponses: 5
    Dernier message: 27/09/2009, 09h54
  3. Recherche dans une matrice
    Par clodius dans le forum Excel
    Réponses: 3
    Dernier message: 05/08/2008, 08h33
  4. Réponses: 2
    Dernier message: 19/05/2008, 21h48
  5. Réponses: 2
    Dernier message: 19/11/2007, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo