Power Query Extraire les dates de début et de fin avec Power Query

Kaka133

XLDnaute Nouveau
Merci de m’aider à trouver la solution de Extraire les dates de début et de fin avec Power Query voir l’exemple suivant :

Example.JPG


Merci d’avance
 

Pièces jointes

  • DATA Résultat.xlsx
    10.6 KB · Affichages: 17

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,
Bonjour @chris :)

J'avais fait çà ce matin, puis avait pensé que vous aviez trouvé la solution dans l'autre post alors je ne l'ai pas posté.

La requête, plutôt que de faire un test sur le matricule, le type d'absence et la date, regroupe les données sur matricule et type d'absence puis traite chacun des groupes résultants.

Cordialement
 

Pièces jointes

  • DATA Résultat.xlsx
    28.6 KB · Affichages: 16

job75

XLDnaute Barbatruc
Bonsoir Kaka133, chris, Roblochon, Amilo,

En VBA ce n'est pas bien difficile :
VB:
Sub Regrouper()
Dim tablo, resu(), i&, n&, j%
With Feuil1 'CodeName
    With .[A1].CurrentRegion.Resize(, 5)
        .Sort .Cells(1), xlAscending, .Cells(1, 3), , xlAscending, .Cells(1, 4), xlAscending, Header:=xlYes
        tablo = .Value2
    End With
    ReDim resu(1 To UBound(tablo), 1 To 6)
    For i = 2 To UBound(tablo)
        If tablo(i, 1) & tablo(i, 3) <> tablo(i - 1, 1) & tablo(i - 1, 3) Or tablo(i, 4) <> Val(tablo(i - 1, 4)) + 1 Then
            n = n + 1
            For j = 1 To 4: resu(n, j) = tablo(i, j): Next
        End If
        resu(n, 5) = tablo(i, 4)
        resu(n, 6) = Val(resu(n, 5)) - Val(resu(n, 4)) + 1
    Next
    '---restitution---
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    With .[G2] '1ère cellule de destination, à adapter
        If n Then .Resize(n, 6) = resu
        .Offset(n).Resize(Rows.Count - n - .Row + 1, 6).ClearContents 'RAZ en dessous
    End With
End With
End Sub
A+
 

Pièces jointes

  • Regrouper(1).xlsm
    18.9 KB · Affichages: 4

chris

XLDnaute Barbatruc
RE à tous

Seules les solutions de Roblochon et de job75 fonctionnent dans tous les cas

Contrairement à ce que je fais habituellement et qui est mentionné dans le lien donné, dans ma solution de l'autre fil, je n'ai comparé, que les dates de la ligne suivante
Idem dans le solution Amilo.
Cela n'est pas bon dès que des congès de personnes différentes se suivent.
De plus Amilo ne fait pas de tri avant indexation ce qui ajoute au PB

@kaka 133 : il faudrait préciser quelle version d'Excel tu utilises et sur quelle étape de la requête tu rencontres le problème. Je suppose que ta version est inférieure à 365 et que c'est l'indexation qui pose problème mais précise bien ces 2 infos.
 
Dernière édition:

Kaka133

XLDnaute Nouveau
RE à tous

Seules les solutions de Roblochon et de job75 fonctionnent dans tous les cas

Contrairement à ce que je fais habituellement et qui est mentionné dans le lien donné, dans ma solution de l'autre fil, je n'ai comparé, que les dates de la ligne suivante
Idem dans le solution Amilo.
Cela n'est pas bon dès que des congès de personnes différentes se suivent.
De plus Amilo ne fait pas de tri avant indexation ce qui ajoute au PB

@kaka 133 : il faudrait préciser quelle version d'Excel tu utilises et sur quelle étape de la requête tu rencontres le problème. Je suppose que ta version est inférieure à 365 et que c'est l'indexation qui pose problème mais précise bien ces 2 infos.
office 2016
 

Kaka133

XLDnaute Nouveau
Bonsoir Kaka133, chris, Roblochon, Amilo,

En VBA ce n'est pas bien difficile :
VB:
Sub Regrouper()
Dim tablo, resu(), i&, n&, j%
With Feuil1 'CodeName
    With .[A1].CurrentRegion.Resize(, 5)
        .Sort .Cells(1), xlAscending, .Cells(1, 3), , xlAscending, .Cells(1, 4), xlAscending, Header:=xlYes
        tablo = .Value2
    End With
    ReDim resu(1 To UBound(tablo), 1 To 6)
    For i = 2 To UBound(tablo)
        If tablo(i, 1) & tablo(i, 3) <> tablo(i - 1, 1) & tablo(i - 1, 3) Or tablo(i, 4) <> Val(tablo(i - 1, 4)) + 1 Then
            n = n + 1
            For j = 1 To 4: resu(n, j) = tablo(i, j): Next
        End If
        resu(n, 5) = tablo(i, 4)
        resu(n, 6) = Val(resu(n, 5)) - Val(resu(n, 4)) + 1
    Next
    '---restitution---
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    With .[G2] '1ère cellule de destination, à adapter
        If n Then .Resize(n, 6) = resu
        .Offset(n).Resize(Rows.Count - n - .Row + 1, 6).ClearContents 'RAZ en dessous
    End With
End With
End Sub
A+
un grand merci pour votre précieux soutien
 

Discussions similaires

Réponses
7
Affichages
291
Réponses
10
Affichages
222

Statistiques des forums

Discussions
312 213
Messages
2 086 302
Membres
103 174
dernier inscrit
OBUTT