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

Macros et VBA Excel Discussion :

Dates qui se suivent sur plusieurs lignes [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    novembre 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : novembre 2020
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Dates qui se suivent sur plusieurs lignes
    Bonjour,

    Je sui novice sur le site et je suis bloqué depuis plusieurs mois sur un tableau qui recense les arrêts de travail par matricule et par durée.
    Le problème est que pour un même matricule, je peux avoir plusieurs arrêts qui se suivent au niveau des dates sur des lignes différentes. Au final ces différentes lignes ne représentent qu'un seul arrêt.
    je cherche donc un moyen de regrouper ces lignes par macro (dates qui se suivent pour un même matricule) afin de n'avoir qu'une seule ligne.

    Exemple ligne 3 à 5 pour le matricule 1683. Je cherche à obtenir sur une seul ligne date de début 14/09/2020 et date de fin 18/10/2020.

    je vous joins le fichier.

    merci pour votre aide, en espérant avoir été clair.

    lulu92
    Fichiers attachés Fichiers attachés

  2. #2
    Membre chevronné Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    février 2018
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : février 2018
    Messages : 744
    Points : 1 925
    Points
    1 925
    Par défaut
    Bonjour Lulu,

    Postez plutôt une copie d'écran de votre tableau ainsi que votre code actuel entre balises #.
    Tres peu de membre ouvrent les pièces jointe, qui plus est au premier post

    Vous trouverez ainsi de l'aide plus rapidement,
    Bav,
    Michaël

    Si mon aide/avis vous a été profitable , n'hésitez pas à cliquer sur , ça fait toujours plaisir...
    _________________________________________________________________________________________________________________

    "Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu'il est stupide..."
    Albert Einstein

  3. #3
    Membre averti Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    juin 2012
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : juin 2012
    Messages : 203
    Points : 336
    Points
    336
    Par défaut
    Bonjour,

    On peut bien sûr faire cela en macro VBA mais aussi en formules (voir PJ).

    Il te suffit de classer les données par matricules puis date de début et enfin d'appliquer les formules jointes.

    Est-ce suffisant ou veux-tu vraiment du code VBA ?
    Fichiers attachés Fichiers attachés
    C'est toujours sympa de savoir si on vous a aidé ou non. Pensez-y

    N'hésitez pas à marquer le sujet comme résolu le cas échéant.

  4. #4
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Auditeur
    Inscrit en
    juillet 2012
    Messages
    8 268
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Auditeur
    Secteur : Conseil

    Informations forums :
    Inscription : juillet 2012
    Messages : 8 268
    Points : 77 229
    Points
    77 229
    Billets dans le blog
    15
    Par défaut
    Salut,

    Comme vous utilisez Excel 2016, vous avez Power Query en natif.

    Voici une proposition via Power Query en passant par un regroupement. Si vous ajouter des données, il vous suffit juste de faire un Clic droit et choisir Actualiser.
    Fichiers attachés Fichiers attachés
    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  5. #5
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : février 2010
    Messages : 7 175
    Points : 13 558
    Points
    13 558
    Par défaut
    Bonjour à tous

    Une autre proposition PowerQuery (intégré à Excel à partir de 2016, en add on à partir de 2010)
    qui tient compte des absences consécutives pour une même nature d'heures

    A noter que le format xls est périmé depuis 13 ans et n'accepte donc aucune des possibilités postérieures à la version 2003
    Fichiers attachés Fichiers attachés
    Chris

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  6. #6
    Membre averti Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    juin 2012
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : juin 2012
    Messages : 203
    Points : 336
    Points
    336
    Par défaut
    J'ai ajouté le cumul des jours.
    Sinon tu as les solutions PQ ou VBA.
    Fichiers attachés Fichiers attachés
    C'est toujours sympa de savoir si on vous a aidé ou non. Pensez-y

    N'hésitez pas à marquer le sujet comme résolu le cas échéant.

  7. #7
    Candidat au Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    novembre 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : novembre 2020
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    je vous remercie pour vos différentes solutions.
    j'ai choisi d'utiliser Power Query qui répond très bien à ce que je souhaite obtenir.

    merci

    Lulu92

  8. #8
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    août 2014
    Messages
    1 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : août 2014
    Messages : 1 336
    Points : 2 520
    Points
    2 520
    Par défaut
    Bonjour le fil, bonjour le forum,

    J'arrive après la bagarre !... Si ça intéresse quelqu'un, une proposition VBA avec le code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Sub Macro1()
    Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
    Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
    Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
    Dim D As Object 'déclare la variable D (Dictionnaire)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim J As Integer 'déclare la variable J (incrément)
    Dim K As Integer 'déclare la variable K (incrément)
    Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
    Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
    Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
     
    Set OS = Worksheets("absences") 'définit l'onglet source OS
    On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
    Set OD = Worksheets("Résultat") 'définit l'onglet OD (génère une erreur si cet onglet n'existe pas)
    If Err > 0 Then 'condition : si une erreur a été générée
        Err.Clear 'supprime l'erreur
        OS.Copy after:=Sheets(Sheets.Count) 'copie l'onglet OS en dernière position
        Set OD = ActiveSheet 'définit l'onglet OD
        OD.Name = "Résultat" 'renome l'onglet OD
    End If 'fin de la condition
    On Error GoTo 0 'annule la gestion des erreurs
    OD.Range("A1").CurrentRegion.Offset(1, 0).ClearContents 'efface d'éventuelles anciennes données dans l'onglet OD
    TV = OS.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
    Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
    For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
        D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 de TV
    Next I 'prochaine ligne de la boucle
    TMP = D.keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
    For J = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments J du tableau temporaire TMP
        K = K + 1 'incrémente K
        ReDim Preserve TL(1 To UBound(TV, 2), 1 To K) 'redimensionne le tableau des lignes TL (autant de lignes que TV a de colonnes, K colonnes)
        TL(1, K) = TMP(J) 'définit la valeur de la donnée ligne 1 colonne K de TL
          For I = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeur TV (en partant de la seconde)
            If TV(I, 1) = TMP(J) Then 'condition : si la donnée Ligne I colonne 1 de TV est égale à l'élément J de TMP
                TL(2, K) = TV(I, 2) 'récupère la valeur de la donnée ligne I colonne 2 de TV dans la ligne 2 colonne K de TL (=> Transposition)
                TL(3, K) = TV(I, 3) 'récupère la valeur de la donnée ligne I colonne 3 de TV dans la ligne 3 colonne K de TL (=> Transposition)
                TL(4, K) = IIf(TL(4, K) = "", TV(I, 4), TL(4, K)) 'si TL(4,K) est vide récupère la valeur de la donnée ligne I colonne 4 de TV sinon garde la valeur existante de TL(4,K) (=> Transposition)
                TL(5, K) = TV(I, 5) 'récupère la valeur de la donnée ligne I colonne 5 de TV dans la ligne 5 colonne K de TL (=> Transposition)
                TL(6, K) = TV(I, 6) 'récupère la valeur de la donnée ligne I colonne 6 de TV dans la ligne 6 colonne K de TL (=> Transposition)
                TL(7, K) = TV(I, 7) 'récupère la valeur de la donnée ligne I colonne 7 de TV dans la ligne 7 colonne K de TL (=> Transposition)
                TL(8, K) = TL(8, K) + TV(I, 8) 'calcule la somme de la valeurs des la données en colonne 8 de TV dans la ligne 8 colonne K de TL (=> Transposition)
            End If 'fin de la condition
        Next I 'prochaine ligne de la boucle 2
    Next J 'prochain élément de la boucle 1
    OD.Range("A2").Resize(K, UBound(TV, 2)).Value = Application.Transpose(TL) 'renvoie le tableau TL transposé dans la cellule A2 de l'onglet OD
    DL = OD.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet OD
    OD.Rows(DL + 1 & ":" & Application.Rows.Count).Delete 'supprime les lignes de DL+1 à la dernière
    OD.Activate 'active l'onglet OD
    End Sub
    À plus,

    Thauthème

    Je suis Charlie

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

Discussions similaires

  1. [EDI] Cherche PHP Indenter qui gère les array sur plusieurs lignes
    Par ilalaina dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 18/03/2010, 14h27
  2. Réponses: 3
    Dernier message: 22/10/2009, 19h45
  3. Réponses: 2
    Dernier message: 21/09/2009, 15h20
  4. Group by sur Produit mais avec date qui se suivent
    Par suantay dans le forum Langage SQL
    Réponses: 9
    Dernier message: 29/02/2008, 13h13
  5. Texte qui s'affiche sur plusieurs lignes
    Par soumou dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 15/02/2007, 14h31

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