Retraitement des lignes

Bonjour,

Je dois faire un état des absences pour motif maladie par tranche de d'arrêt et par collaborateur : soit inférieur ou égal à 3 jours, supérieur de 4 à 30 jours et de + de 30 jours.

Le problème c'est que j'ai autant de ligne par collaborateur que de période d'arrêt .... cependant j'aimerais trouver un moyen pour arriver à avoir par collaborateur le nb de jours d'arrêt.

En espérant avoir été claire

Bonjour,

un essai par macro, à adapter :

Sub AbsMaladie()
Dim Dico, TT, i As Long, T, Diff As Integer, Ind As Byte
Set Dico = CreateObject("Scripting.Dictionary")
With Worksheets("Absences")
T = .Range("A2:C" & .Range("A" & Rows.Count).End(xlUp).Row)

For i = LBound(T) To UBound(T)
    If Not Dico.Exists(T(i, 1)) Then
        TT = Array(0, 0, 0)
        Dico(T(i, 1)) = TT
    End If
    Diff = T(i, 3) - T(i, 2) + 1
    Select Case Diff
     Case 1 To 3
        Ind = 0
     Case 4 To 30
        Ind = 1
     Case Is > 30
        Ind = 2
    End Select
    TT = Dico(T(i, 1))
    TT(Ind) = TT(Ind) + 1
    Dico(T(i, 1)) = TT
Next
.Range("F2").Resize(Dico.Count, 1) = Application.Transpose(Dico.keys)
.Range("G2").Resize(Dico.Count, 3) = Application.Transpose(Application.Transpose(Dico.items))

End With
End Sub

Mais quelle est donc cette entreprise avec près de 1 000 000 employés ??

A+

Bonjour

Bonjour à tous

Une variante à tester.

Bye !

bonjour gmb,

a priori on n'a pas compris le besoin de la même façon !

a priori on n'a pas compris le besoin de la même façon !

En effet ! Mais je crois que c'est toi qui a raison !

Non, j'en suis sûr !

Bravo à toi !

Bye !

Pas sûr,

attendons le verdict .

Bonsoir, Algoplus, GMB et Rosa14,

pas sûr d'avoir bien tout compris mais avec des TCD n'arrivons nous pas à obtenir les bons chiffres ?

J'ai été obligé de supprimer les 2 TCD et des lignes de données car trop lourd pour envoi.

Mais le principe et là.

Pour le 3ème TCD mets le filtre sur Supérieur à : 30

Cordia5

Merci à vous 3 je regarde demain matin et vous fait un retour me, le seul petit ik est que je ne maîtrise pas les macros....

je vais toutefois essayer ....

bonne soirée à vous à demain !

Bonjour à tous !

J'ai en effet pas été assez clair dans ma demande ....

Je vous ai mis les compléments d'information dans le fichier.

La problématique dans le traitement des absences sous ce format est que je dois identifier les arrêts qui sont continus et qui sont sur plusieurs ligne. Pour cela, je suis obligé de retraiter toutes les dates de fin pour avoir une seule ligne d'arrêt lorsque quil y a plusieurs ligne pour le même.

Je ne suis pas certaine qu'il y ai une solution à mon problème toutefois j'espère après ce complément d'explication avoir une solution car le retraitement est juste horible et source d'erreur....

Au plaisir de vous lire

je n'étais pas sûr d'avoir compris la demande, maintenant c'est sûr, je n'avais rien compris.

Et comme le classeur n'est pas passé, pas de meilleurs compréhension

J'espère qu'il y aura un exemple dans le classeur !

Bonjour à tous,

Bonjour rosa14,

Dans cet exemple (employé 2629), on distingue 7 périodes d'arrêt maladie (visualisées par les couleurs).

Pour chaque période, j'ai dénombré le nombre de jours consécutifs d'arrêt, et dans quelle tranche elle se situait.

A partir de cet exemple, peux-tu nous dire quel est le résultat à obtenir

capture

Ici, je n'ai pas tenu compte du code motif en 4ème colonne, visiblement il y en a 2.

Depuis le début, je ne comprends pas ce que tu souhaites ressortir.

klin89

Bonjour,

Pour compter un élément de façon unique, passe par un TCD en cochant : Ajouter aux modèles de données.

Dans le champ N°ID, le champ de rapport, choisir ?Total distinct.

Regarde dans les fichiers déjà transmis.

Cordia5

Bonjour

Bonjour à tous

Un nouvel essai à tester.

Bye !

Bonsoir le forum,

vu que le fichier est trop après 1 TCD, voici une vue de ce qui possible avec TCD et qui correspond à ce que tu cherches, enfin je crois.

capture

Sur cette vue, tu vois que l'agent

  • 24, a 1 seul arrêt pour un total de 2 jours.
  • 69, a 2 arrêts pour un total de 12 jours.

et ainsi de suite.

Cordia5

Bonsoir à tous!!!*

Merci encore pour votre investissement dans la recherche d'une solution qui me serait juste magique à ce stade!!!!

Je ne suis pas assez et je m'en excuse ....

Pour le moment celui qui se rapproche de ce que je souhaite est Klin89

L'idée étant à la fin d'avoir une vue telle que ci dessous (prenons l'exemple de l'employé 2629 et prenons son 1er arrêt):

- N°employé / date de début 09/02/2019 / date de fin 29/03/2019/ Nb de jours total entre les deux dates d'arrêt 49jours /tranche concerné <30 jours

L'idée étant de ne pas à avoir à copier coller "29/03/2019" à la place de la cellule "17/03/2019" et devoir supprimer les deux autres lignes pour en avoir qu'une et faire le calcul du nb de jours entre le 09/02/2019 et le 29/03/2019.

L'idée étant de faire un bilan du nombre d'arrêt maladie par tranche.

Re rosa14,

Pour faire avancé le schmilblick

A partir de mon exemple précédent, souhaites-tu adopter cette disposition

Sinon fournis une image de ce que tu souhaites obtenir

capture 1

Je n'ai pas vérifié, mais des dates peuvent-elles se chevaucher dans le tableau source ?

klin89

Bonjour Klin89,

C'est vraiment pas mal ce que t'as fait !

J'ai terminé le retraitement complet à la main du fichier final avec dans le second onglet le TCD me permettant d'avoir le nombre d'arrêts par tranche de durée.

Non logiquement il ne devrait pas en avoir.

Klin89 la disposition de ton fichier est différence de la mienne cependant si j'arrive à obtenir mon info via un TCD c'est ok !!!!!!!!!!!!

j'ai hâte !!!

Re rosa14,

Tu t'es coltiné la fusion des périodes à la main

Pour résumer ton problème est donc de fusionner toutes les périodes à l'aide d'une macro comme illustré ci-dessous.

Ensuite tu peux te débrouiller à l'aide de formules, d'un TCD ou de Powerquery (je ne maitrise pas du tout)

capture 2

Pour revenir à la fusion manuelle, tu ne te serais pas planté avec le n° 101035

La fusion des périodes repose t'elle bien sur le n° employé et le code motif

Dans ton exemple, tu ne tiens pas compte du code motif visiblement.

klin89

Bonjour Klin89,

En effet j'ai passé une journée et demi pour avoir ce résultat .... c'est vraiment navrant ....

En effet je ne tiens pas compte du code motif puisque le motif patho est considéré comme maladie dans mon analyse.

Je souhaite sois avoir un résultat comme dans le fichier excel que j'ai joint hier ou avoir comme le tiens le but final étant de pouvoir ressortir le nombre d'arrêt par tranche de jours.

As tu pu trouver construire une macro qui puisse faire ce travail ?

A bientôt!!!!

re rosa14

A tester avec le fichier de ton premier post.

On est d'accord, pas de chevauchement de dates et les données sont triées par ordre chronologique

Option Explicit
Sub test()
    Dim a, e, w(), i As Long, ii As Long, n As Long, nbreJ As Long, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    a = Sheets("Absences").Cells(1).CurrentRegion.Value2
    For i = 2 To UBound(a, 1)
        If Not dico.exists(a(i, 1)) Then
            ReDim w(1 To 6, 1 To 1)
            For ii = 1 To UBound(a, 2) - 1
                w(ii, 1) = a(i, ii)
            Next
        Else
            w = dico(a(i, 1))
            If a(i, 2) = w(UBound(w, 1) - 3, UBound(w, 2)) + 1 Then
                w(UBound(w, 1) - 3, UBound(w, 2)) = a(i, 3)
            Else
                ReDim Preserve w(1 To UBound(w, 1), 1 To UBound(w, 2) + 1)
                For ii = 1 To UBound(a, 2) - 1
                    w(ii, UBound(w, 2)) = a(i, ii)
                Next
            End If
        End If
        dico(a(i, 1)) = w
    Next
    For Each e In dico.keys
        w = dico.Item(e)
        For i = 1 To UBound(w, 2)
            nbreJ = w(3, i) - w(2, i) + 1
            Select Case nbreJ
            Case Is > 30: w(6, i) = nbreJ
            Case Is > 3: w(5, i) = nbreJ
            Case Else: w(4, i) = nbreJ
            End Select
        Next
        dico.Item(e) = w
    Next
    Application.ScreenUpdating = False
    With Sheets.Add
        .Cells(1).Resize(, 6).Value = _
        Array("N° Employé", "Date de début Paye", "Date de fin Paye", _
              "jours " & ChrW(8804) & " 3", "3 < jours " & ChrW(8804) & " 30", "jours > 30")
        n = 2
        For Each e In dico.keys
            With .Cells(n, 1).Resize(UBound(dico.Item(e), 2), UBound(dico.Item(e), 1))
                .Value = Application.Transpose(dico.Item(e))
                .BorderAround Weight:=xlThin
            End With
            n = n + UBound(dico.Item(e), 2)
        Next
        With .Cells(1).CurrentRegion
            .Font.Name = "calibri"
            .Font.Size = 10
            .VerticalAlignment = xlCenter
            .BorderAround Weight:=xlThin
            .Borders(xlInsideVertical).Weight = xlThin
            With .Rows(1)
                .Font.Size = 11
                .Interior.Color = 9359529
                .BorderAround Weight:=xlThin
                .HorizontalAlignment = xlCenter
            End With
            .Columns(2).NumberFormat = "m/d/yyyy"
            .Columns(3).NumberFormat = "m/d/yyyy"
            .Columns.ColumnWidth = 18
        End With
    End With
    Set dico = Nothing
    Application.ScreenUpdating = True
End Sub

klin89

Rechercher des sujets similaires à "retraitement lignes"