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

Conception Discussion :

Trouver un staut à une date donnée sans VBA ?


Sujet :

Conception

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut Trouver un staut à une date donnée sans VBA ?
    Bonjour à tous et toutes et merci de votre temps et de votre aide.

    J'ai une feuille de calcul où je présente une liste dossier, date de dossier, personne et statut de la personne.
    Actuellement j'ai une feuille de référence avec un identifiant de personne et le statut.
    Un simple RECHERCHEV retrouve le statut en se basant sur l'identifiant.

    Maintenant il arrive que mes personnes changent de statut.
    Donc j'aurai besoin de trouver le statut à la date du dossier.

    Par exemple la personne P01 a le statut
    1. S01 de 2019-01-01 au 2019-01-15
    2. S02 de 2019-01-16 au 2019-02-28
    3. S01 de 2019-03-01 au 9999-12-31


    Et je cherche à avoir :

    D01 2019-01-04 P01 S01
    D02 2019-01-05 P01 S01
    D03 2019-02-01 P01 S02
    D04 2019-01-04 P01 S01

    Je sais écrire une fonction VBA pour faire cela mais je me demandais si il y avait une option avec une formule.

    J'ai mis un exemple avec 1 personne et 4 dossiers mais dans la réalité, j'ai environ 10000 dossiers avec un ajout 10 dossiers en moyenne par jour répartis sur à peu près 50 personnes.
    Et je ne peux pas "geler" le statut et la personne car j'ai des transferts de dossiers entre personne.

    A+

  2. #2
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 513
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 513
    Points : 16 441
    Points
    16 441
    Par défaut
    Bonjour

    Avec les données sous forme de tableaux structurés (sinon adapter) et sous réserve que les statuts soient triés par Personne et date début

    Nom : Statuts.jpg
Affichages : 128
Taille : 113,9 Ko

    Faisable aussi par PowerQuery plus simplement

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Merci Chris,

    Pourrais-tu poster la formule comme du texte et non une image.

    J'ai essayé de la refaire à partir de l'image et j'ai une erreur de syntaxe mais vu la longueur et la complexité je n'arrive pas à repérer où.

    A+

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Re-Bonjour.

    Merci Chris, grâce à ton exemple j'ai pu faire une formule qui donne le résultat attendu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    =DECALER(tbxStatut[#Tout]; 'Pointe sur la zone de données
                     EQUIV([@Matricule]; tbxStatut[Matricule]; 0) '1ère ligne dans tbxStatut qui contient le matricule cherché.
                          +NB.SI.ENS(tbxStatut[Matricule]; [@Matricule]; tbxStatut[Debut]; "<=" & [@Date]) -1;  '1ère date qui correspond dans les statuts du matricule cherché.
                     COLONNE(tbxStatut[Statut])-COLONNE(tbxStatut[Matricule]); 'Nombre de colonne de décalage pour trouver la colonne du statut par à la 1ère colonne de la zone.
                     1; 1)
    Donc en résumé je trouve sur quelle ligne commence les statuts de la personne, et j'y ajoute le nombre de dates jusqu'à la date courante et j'enlève 1 pour compenser le double comptage de la ligne.
    Il ne me reste plus qu'à récupérer la cellule concernée dans la colonne Statut.

    A+

  5. #5
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 513
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 513
    Points : 16 441
    Points
    16 441
    Par défaut
    Re

    Sorry pas vu le message précédent

    Belle simplification !

    Il y a des jours où je fais Paris Rome via Tombouctou !

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour.

    Belle simplification !
    Pour être honnête j'ai simplifié car je ne comprends pas ta méthode pour trouver la date.

    Si tu as le temps peut-être pourrais-tu détailler les morceaux.

    A+

  7. #7
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 513
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 513
    Points : 16 441
    Points
    16 441
    Par défaut
    RE

    Recherche du point Y (ligne) d'une matrice correspondant au matricule obtenue ainsi
    On part de l'en-tête Statut du tableau Statuts et on se décale sur la ligne du matricule recherché
    En comptant le nombre de ce matricule on a la hauteur de la matrice
    Pour la ligne à l'intérieur de cette matrice on cherche la date en cours dans la colonne Debut
    EQUIV avec le 3ème argument à 1 prend la date <= à celle cherchée

    Ton idée d'utiliser NB.SI ajouté à EQUIV permet de trouver directement la ligne dans le tableau sans besoin de passer par le sous-ensemble "matrice du matricule"

    Et dire que j'expliquais hier sur un autre fil, que NB.SI permet de simplifier une recherche !

    Bonne soirée

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Merci de l'explication.

    C'est paramètre de EQUIV qui spécifie le <= que j'avais raté.

    A+

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 242
    Points : 484
    Points
    484
    Par défaut
    Bonsoir,

    La discussion est résolue, mais si besoin, voici une proposition différente qui fonctionne même si le tableau des statuts n'est pas trié, et prend en compte les éventuelles discontinuités de périodes (et si doublon, on prend la première occurrence)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SIERREUR(DECALER(tbxStatut[Statut];PETITE.VALEUR(SIERREUR(LIGNE(tbxStatut[Matricule])/((tbxStatut[Matricule]=[@Matricule])*(tbxStatut[Debut]<=[@Date])*(tbxStatut[Fin]>=[@Date]));FAUX);1)-1-LIGNE(tbxStatut[[#En-têtes];[Statut]]);0;1;1);"Aucun statut pour cette date")
    L'idée est de trouver la plus petite valeur de ligne satisfaisant les conditions et de récupérer le statut renseigné sur cette ligne.

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

Discussions similaires

  1. Trouver le dernier jeudi et mardi avant une date saisie en VBA
    Par sabrine1311 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/07/2014, 12h14
  2. Réponses: 2
    Dernier message: 29/07/2014, 16h32
  3. Réponses: 2
    Dernier message: 12/05/2014, 11h53
  4. [OL-2010] VBA : Affichage du calendrier à une date donnée
    Par Le Sage dans le forum Outlook
    Réponses: 2
    Dernier message: 22/08/2013, 10h33
  5. Réponses: 3
    Dernier message: 28/08/2007, 09h52

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