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 :

Fractionner une date selon des périodes saisies [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut Fractionner une date selon des périodes saisies
    Bonjour à tous,

    J'aimerais avoir autant de fractions possibles pour des périodes globale définies par une date de début et une de fin.

    Ce fractionnement repose sur les dates de périodes saisies entre temps dans le tableau.

    Si par exemple, j'ai dans mon tableau les dates suivantes :

    sss R 09/08/2013 19/08/2013
    sss F 17/08/2013 17/08/2013

    Alors, la date globale :

    sss R 09/08/2013 19/08/2013

    sera fractionnée selon la période suivante :

    sss F 17/08/2013 17/08/2013

    Pour avoir :

    sss R 09/08/2013 16/08/2013
    sss F 17/08/2013 17/08/2013
    sss R 18/08/2013 19/08/2013

    Mais voila, certain lignes sont correctes, d'autres ne le sont pas comme ceci :

    sss L 20/08/2013 16/08/2013

    Voila, le code que j'utilise :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Sub FractionDate()
    '
    ' Fractionner une date selon des periodes
    '
     
        Dim LastLg As Integer, FinTraitement As Boolean
        Dim Ligne As Integer, Lg As Integer, L As Integer
     
        Application.ScreenUpdating = False
        With Sheets("Données")
            LastLg = Range("A10000").End(xlUp).Row
            '-- Tri selon les noms + date de début
            .Range(.Range("A2"), .Cells(LastLg, "D")).Sort key1:=.Range("A2"), order1:=xlAscending, _
                                                           key2:=.Range("C2"), order2:=xlAscending, Header:=xlNo, _
                                                           dataoption1:=xlSortNormal, dataoption2:=xlSortNormal
     
            Lg = 1 ' Au moins la ligne des titres
            Do
     
                If Not FinTraitement Then
                    '-- Trouver la dernière ligne
                    LastLg = Range("A10000").End(xlUp).Row
                    L = Lg + 1
                    MsgBox "Boucle de " & L & " à " & LastLg
                    For Lg = L To LastLg    'Ligne
                        '                        MsgBox "Ligne " & Lg & ", Fin : " & .Range("D" & Lg) & ", Début : " & .Range("C" & Lg + 1)
     
                        If .Range("D" & Lg) > .Range("C" & Lg + 1) Then
                            Debug.Print "Fin : " & .Range("D" & Lg) & ", Début : " & .Range("C" & Lg + 1)
     
                            '-- Copier la ligne en cours
                            .Range("A" & Lg & ":D" & Lg).Copy
     
                            '-- La faire coller apres 2 lignes
                            .Range("A" & Lg + 2 & ":D" & Lg + 2).Insert Shift:=xlDown
     
                            '-- La date de début de la nouvelle ligne ajoutée sera égal à la date
                            '-- de fin de la ligne en Lg + 1
                            .Range("C" & Lg + 2) = .Range("D" & Lg + 1) + 1
     
     
                            '-- La date fin de la nouvelle ligne ajoutée sera égal à la date
                            '-- de début de la ligne Lg 'colonne D en cours
                            .Range("D" & Lg + 2) = .Range("D" & Lg)
     
                            '-- La date de fin en cours sera modifiée pour celle
                            '-- de la date de début de la ligne Lg + 1, -1
                            .Range("D" & Lg) = .Range("C" & Lg + 1) - 1
     
                            With .Range("A" & Lg & ":D" & Lg)
                                If .Interior.Pattern = xlNone Then
                                    '-- Couleur jaune pour une ligne modifiée
                                    .Interior.Color = RGB(255, 255, 0)    '6
                                End If
                            End With
     
                            '-- Couleur bleu pour une ligne ajoutée
                            .Range("A" & Lg + 2 & ":D" & Lg + 2).Interior.Color = RGB(219, 229, 241)    '34
                        End If
                    Next Lg
                End If
                Ligne = Lg - 1
                LastLg = .Range("A10000").End(xlUp).Row
                '            MsgBox "Ligne For s'est arreté à : " & Lg & vbCrLf & _
                             "Ligne tableau en cours : " & LastLg
                If Lg >= LastLg - 1 Then FinTraitement = True
            Loop Until FinTraitement    'Ligne
            Application.CutCopyMode = False
     
            '-- Tri selon les noms + date de début
            .Range(.Range("A2"), .Cells(LastLg, "D")).Sort key1:=.Range("A2"), order1:=xlAscending, _
                                                           key2:=.Range("C2"), order2:=xlAscending, Header:=xlNo, _
                                                           dataoption1:=xlSortNormal, dataoption2:=xlSortNormal
     
        End With
    End Sub
    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut fractionner une date selon des periodes saisies
    Bonjour,

    Pour corriger fin < debut faire en début de procédure cela:

    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
     
     Dim LastLg As Integer, FinTraitement As Boolean
     Dim Ligne As Integer, Lg As Integer, L As Integer
     
     Application.ScreenUpdating = True  'False
     
     With Sheets("Données")
            LastLg = Range("A10000").End(xlUp).Row
     
            For Lg = 2 To LastLg
               If Cells(L, 3) > Cells(L, 4) Then
                  Change = Cells(L, 3)
                  Cells(L, 3) = Cells(L, 4)
                  Cells(L, 4) = Change
               End If
            Next Lg
    Par alleurs, il est surement préférable de faire ensuite le trie prioritairement sur la date début et non pas sur le nom.

    L ne sert à rien, faire directement dans la suite du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for Lg = 2 to lastlg
    Je n'ai pas regarder la suite du code. Bon courage.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Je ne me suis pas penché sur ton code mais je pense qu'il serait mieux de faire une fonction de fractionnement, ça serait plus clair. Je te poste un petit exemple que tu pourra adapter si le coeur t'en dit :
    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
     
    Sub Test()
     
        Dim Tbl() As String
        Dim Resultat As String
        Dim I As Integer
     
        'appel de la fonction avec passage des arguments String
        '(ça peut être des valeurs de cellules)
        'comme par exemple : Tbl = Fraction(Range("A1"), Range("B1"))
        Tbl = Fraction("sss R 09/08/2013 19/08/2013", "sss F 17/08/2013 17/08/2013")
     
        'ici le résultat du fractionnement est récupéré par concaténation dans une variable
        'mais il peut être dispatché dans des cellules
        For I = 1 To UBound(Tbl)
     
            Resultat = Resultat & Tbl(I) & vbCrLf
     
        Next I
     
        MsgBox Resultat
        'ou :
        Debug.Print Resultat
     
    End Sub
     
    Function Fraction(Globale As String, Periode As String) As String()
     
        Dim TblDate(1 To 3) As String
        Dim DateFinGlob As String
        Dim DateDebutPer As String
        Dim DateFinPer As String
     
        DateFinGlob = Split(Globale, " ")(3)
        DateDebutPer = Split(Periode, " ")(2)
        DateFinPer = Split(Periode, " ")(3)
     
        TblDate(1) = Left(Globale, InStr(Globale, DateFinGlob) - 1) & CDate(DateDebutPer) - 1
        TblDate(2) = Periode
        TblDate(3) = Left(Globale, 6) & CDate(DateFinPer) + 1 & " " & DateFinGlob
     
        Fraction = TblDate
     
    End Function
    Hervé.

  4. #4
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Bonjour nibledispo, Theze,

    > nibledispo :: Au lieu de faire inverser les anomalies dans les dates, ne peut-on pas faire la bonne insertion dés le début du traitement ?

    > Theze :: Les propositions sont les bienvenues

    Mais, dans ce cas, il faut au préalable définir les plages qui seront fractionner, non ?

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    Un exemple. Les périodes globales sont en colonne "A", les périodes à intégrées sont en colonne "B" et elles sont sensées être logiques, c'est à dire qu'elles sont bien entre les bornes de la période globale. Le résultat est inscrit en colonne "C", "D" et "E". Fait un test sur un classeur vierge en entrant les périodes globales en colonne "A" et les périodes à intégrer correspondantes en colonne "B" puis lance la proc "Test" :
    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
     
    Sub Test()
     
        Dim Plage As Range
        Dim Cel As Range
        Dim Tbl() As String
     
        'défini la plage sur la colonne "A" de la feuille "Feuil1"
        With Worksheets("Feuil1")
     
            Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        'boucle sur toutes les cellules de la plage
        For Each Cel In Plage
     
            'passe en argument la cellule de la colonne "A" qui est la période globale
            'et la cellule d'à coté (colonne "B") qui est la période à intégrée dans la période globale
            Tbl = Fraction(Cel.Value, Cel.Offset(, 1).Value)
     
            'le résultat du fractionnement est inscrit en colonne "C", "D" et "E"
            Cel.Offset(0, 2).Value = Tbl(1)
            Cel.Offset(0, 3).Value = Tbl(2)
            Cel.Offset(0, 4).Value = Tbl(3)
     
        Next Cel
     
    End Sub
     
    Function Fraction(Globale As String, Periode As String) As String()
     
        Dim TblDate(1 To 3) As String
        Dim DateFinGlob As String
        Dim DateDebutPer As String
        Dim DateFinPer As String
     
        DateFinGlob = Split(Globale, " ")(3)
        DateDebutPer = Split(Periode, " ")(2)
        DateFinPer = Split(Periode, " ")(3)
     
        TblDate(1) = Left(Globale, InStr(Globale, DateFinGlob) - 1) & CDate(DateDebutPer) - 1
        TblDate(2) = Periode
        TblDate(3) = Left(Globale, 6) & CDate(DateFinPer) + 1 & " " & DateFinGlob
     
        Fraction = TblDate
     
    End Function
    Hervé.

  6. #6
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Bonsoir Theze,

    La fonction fait bien son travail pour le moment.

    Mais comme les dates sont saisies au fur et à mesure qu'on aura besoin, et parfois des dates se croisent pour le mois précédent ou le mois suivant, on ne peut déterminer au début du mois quelles dates seront fractionnées.

    Par exemple :

    La période du 09/08/2013 au 19/08/2013 fractionnera la période globale du 01/08/2013 au 31/08/2013.

    D’autre coté, cette même période deviendra à son tour une période globale, quand elle sera fractionnée par la période :

    Du 17/08/2013 au 17/08/2013

    Alors, en PJ, une conception de données, à traiter !
    Fichiers attachés Fichiers attachés

  7. #7
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut fractionner une date selon des periodes saisies
    Bonjour,

    Je ne comprends pas.

    - sss R 09/08/2013 19/08/2013 est tout dans la colonne A,

    ou :
    - col A = sss R, col B = 09/08/2013, col C = 19/08/2013 (c'est ainsi que je l'avais compris)

    ou
    - col A = sss R, col B = 09/08/2013 19/08/2013 (comme le laisse à penser le code de theze).

    Cordialement.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Paul, je te rassure, j'y comprends de moins en moins depuis que j'ai ouvert le classeur. Comme dans le 1er post il n'est pas précisé que "sss R 09/08/2013 19/08/2013" sont dans des colonnes séparées, je suis parti du principe que tout était dans une seule et même cellule, d'où mon code de fractionnement mais il est faux. D'autres parts, les explications données dans le classeur sont bien insuffisantes pour moi en tout cas !
    Tu dis :
    La période du 09/08/2013 au 19/08/2013 fractionnera la période globale du 01/08/2013 au 31/08/2013.

    D’autre coté, cette même période deviendra à son tour une période globale, quand elle sera fractionnée par la période :

    Du 17/08/2013 au 17/08/201
    C'est le 1er jour et dernier jour du mois qui sont les bornes de la période la plus globale ?
    Il faudra peut être voir du coté d'une fonction récursive si on ne connais pas le niveau d'imbrication.
    En l'attente de plus de précisions (qu'est ce qui identifie la période la plus globale, ou se trouve avec précision les périodes qui fractionneront cette dernière, etc...)

    Hervé.

  9. #9
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Bonjour nibledispo, Theze,

    Il y a quatre colonnes :

    En colonne A, les noms d'agents
    En colonne B, le système de travail suivi
    En colonne C, date du début de la période
    En colonne D, date de fin de la période

    Par l'exemple :

    col A = sss, col B = R, col C = 09/08/2013, col D = 19/08/2013

    Pour la période globale, ce n'est pas forcement le 1er et la fin du mois;
    Cette définition reste valable pour la majorité des agents

    Parfois, il y a des cas ou on peut trouver une période allant du mois précédent jusqu'au mois en cours et une période allant du mis en cours jusqu'au mois prochain.

    Par exemple ceci :

    FFF - B - 13/07/2013 - 12/08/2013
    FFF - P - 08/08/2013 - 10/08/2013
    FFF - R - 13/08/2013 - 05/09/2013
    FFF - B - 23/08/2013 - 25/08/2013

    Là; la première période globale à fractionner est le 13/07/2013 - 12/08/2013 selon la période du 08/08/2013 - 10/08/2013

    La deuxième période fractionnée sera du 13/08/2013 - 05/09/2013 selon la période 23/08/2013 - 25/08/2013

    En retour on aura ce résultat :

    FFF - B - 13/07/2013 - 07/08/2013
    FFF - P - 08/08/2013 - 10/08/2013
    FFF - B - 11/08/2013 - 12/08/2013
    FFF - R - 13/08/2013 - 22/08/2013
    FFF - B - 23/08/2013 - 25/08/2013
    FFF - R - 26/08/2013 - 05/09/2013


  10. #10
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut
    Bonjour,

    En résumé, le traitement est fait par agent.
    Donc ton essai de codification qui triait prioritairement sur les agents puis sur les dates de début est correcte.
    Pour répondre à une question que tu m'as posée :Je pense qu'il est préférable de corriger les saisies inversées avant tout traitement de fonds.

    Partant de là, au vu de ton fichier remis, il n'y a pas à se soucier de savoir ce qui est globale ou ne l'est pas.

    Pour un agent donné, les dates de début étant ordonnées, il faut:
    - boucler sur agent A
    - comparer la date début (n) avec la date fin(n-1).
    -si date début(n) < date fin (n-1) alors traitement sinon passage à la ligne suivante.
    - fin agent agent A, traitement agent B et ainsi de suite.

    Est-ce bien cela ou y a t-il d'autres contraintes ?

    Pour la codification VBA These sera certainement plus qualifié que moi qui débute en programmation. mais j’essaierai malgré tout.

    Cordialement.

    Bonjour,

    Les périodes de congés sont elles mentionnées comme "secteur de travail suivi" ?
    Si ce n'est le cas : un secteur se verra crédité de jours qui ne le concernent pas.

    Cordialement.

  11. #11
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Bonjour nibledispo,

    Merci pour l'analyse.

    Est-ce bien cela ou y a t-il d'autres contraintes ?
    En plus, il faut que le traitement ne soit limité que sur le mois en cours (Ici 8 = Août)

    Les lignes fractionnées seront de couleur jaune, celles ajoutées seront de couleur bleu.

    Voila pour les grandes lignes

    EDIT :

    Nos réponses se sont croisées !

    Merci pour cette nouvelle question

    Les périodes de congés sont elles mentionnées comme "secteur de travail suivi" ?
    Dans mon tableau de données, chaque système de travail ou arrêt de travail suivi devra être mentionné.

    Un point ou je n'ai pas encore trouvé de solution, est dans le cas ou pendant un arrêt de travail, si l'agent est rappelé pour nécessité de service, les jours travaillés seront additionnés à la fin de la première date de l'arrêt de travail.

    Exemple :

    En début, cette période du congé annuel est saisie :

    FFF - CA - 04/08/2013 - 18/08/2013

    Si l'agent est rappelé pour suivre une formation par exemple dans la période :

    FFF - FO - 11/08/2013 - 13/08/2013

    Alors, l'agent se vois déduire 4 jours de son congé, normalement qui le seront ajoutés la fin de la période primaire de son congé, après avoir terminé sa formation.

    Alors en retour on aura (je pense à deux solutions):

    1) Soit ajouter ces 4 jours à la fin de la première période :

    FFF - CA - 04/08/2013 - 10/08/2013
    FFF - FO - 11/08/2013 - 13/08/2013
    FFF - CA - 14/08/2013 - 22/08/2013


    2) Soit ajouter ces 4 jours dans une nouvelle ligne pour ne pas perturber le calcul des fractionnements des dates :

    FFF - CA - 04/08/2013 - 10/08/2013
    FFF - FO - 11/08/2013 - 13/08/2013
    FFF - CA - 14/08/2013 - 18/08/2013
    FFF - CA - 19/08/2013 - 22/08/2013


  12. #12
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut fractionner une date selon des periodes saisies
    RE...,

    Relativement aux congés et pour reprendre ton exemple, les données inscrites à traiter seront nécessairement :

    FFF - CA - 04/08/2013 - 18/08/2013 période de congée initiale
    FFF - FO - 11/08/2013 - 13/08/2013 coupure des congés
    FFF - CA - 19/08/2013 - 22/08/2013 prolongation congés égales à la coupure

    Selon la règle enoncée le traitement sera obligatoirement ta seconde solution :

    FFF - CA - 04/08/2013 - 10/08/2013
    FFF - FO - 11/08/2013 - 13/08/2013
    FFF - CA - 14/08/2013 - 18/08/2013
    FFF - CA - 19/08/2013 - 22/08/2013

    On peut bien sur effectuer un traitement complémentaire pour regrouper deux secteurs (CA ou autre) identiques qui se suivent "(date fin (n-1) +1 = date fin(n)" mais cette complication apporte-t-elle un plus à l'utilisateur du fichier ?

    Cordialement.

  13. #13
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Salut nibledispo,

    mais cette complication apporte-t-elle un plus à l'utilisateur du fichier ?
    Ce tableau de données me sert pour remplir un planning de présence.

    Si ce traitement de regroupement n'est pas complexe, qu'il soit le bienvenu, sinon on laisse les périodes telles qu'elles ressortent du traitement, parce qu'en fin de compte le planning à besoin qu'il trouve des périodes successives pour chaque agent, du mois en cours, pour pouvoir renseigner ses cases

  14. #14
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    voici un code à partir de l'exemple de l'agent du message initial et de l'autre agent du post #9 pour le mois d'Août.

    Prérequis :

    • les cellules des colonnes C et D de la feuille active doivent obligatoirement être au format Date,
    • la première ligne est dédée aux titres des colonnes …

    Si dans une ligne la date de début est supérieure à celle de fin, elles apparaîtront en rouge.
    Si elles sont en rouge foncé, il y a alors chevauchement avec la date de fin de la ligne précédente …
    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
    Sub Demo()
        Dim CR As Date, DEB As Date, DP As Date, DR As Date, FIN As Date
     
         L& = 8  ' Month(Date)
         R& = Year(Date)
        DEB = DateSerial(R, L, 1)
        FIN = DateSerial(R - (L = 12), 1 - (L < 12) * L, 1)
        Application.ScreenUpdating = False
     
        With [A1].CurrentRegion
            .Font.ColorIndex = 0
            .Sort [A1], xlAscending, [C1], , xlAscending, , , xlYes
            L = .Rows.Count
        End With
     
        For R = L To 3 Step -1
            CR = Cells(R, 3).Value
     
            If CR >= DEB And CR < FIN Then
                DR = Cells(R, 4).Value
                DP = Cells(R - 1, 4).Value
     
                If CR > DR Then
                    Cells(R, 3).Resize(, 2).Font.ColorIndex = 3
     
                ElseIf Cells(R, 1).Value = Cells(R - 1, 1).Value And _
                       CR <= DP And DR < DP And Cells(R - 1, 3).Value <= DP Then
                    L = L + 1
                    Cells(L, 1).Resize(, 2).Value = Cells(R - 1, 1).Resize(, 2).Value
                            Cells(R - 1, 4).Value = CR - 1
                                Cells(L, 3).Value = DR + 1
                                Cells(L, 4).Value = DP
                End If
            End If
        Next
     
        [A1].CurrentRegion.Sort [A1], xlAscending, [C1], , xlAscending, , , xlYes
     
        For R = 3 To L
            If Cells(R, 1).Value = Cells(R - 1, 1).Value And _
               Cells(R, 3).Value <= Cells(R - 1, 4).Value And _
               Cells(R, 3).Font.ColorIndex = 0 Then Cells(R, 3).Resize(, 2).Font.ColorIndex = 9
        Next
     
        Application.ScreenUpdating = True
    End Sub
    Facile à adapter si besoin pour les congés …


    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  15. #15
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Bonjour Marc,

    Merci pour ton exemple.

    Mais pour le résultat voulu voila la déférence :

    - Cette période devra être fractionnée

    SSS- L - 06/08/2013 - 31/08/2013

    Normalement on aura ces dates :

    SSS - L - 06/08/2013 - 08/08/2013

    - Ces périodes manquent du tableau résultant :

    SSS - L - 20/08/2013 - 20/08/2013
    SSS - L - 22/08/2013 - 31/08/2013

  16. #16
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Je suis parti du message initial avec

    sss R 09/08/2013 19/08/2013
    sss F 17/08/2013 17/08/2013 …


    S'il faut inclure une période globale du début à la fin du mois, je ne pourrais le faire sur la feuille en cours
    contenant plusieurs mois mais dans une autre servant à l'extraction et au traitement d'un mois …

    Sinon mieux expliquer pour ceux ne pouvant (ou ne voulant) pas télécharger de fichier …

  17. #17
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Bonjour,

    Je souhaite ajouter un détail à propos de la compensation des jours crédités d'une période donnée :

    Si une période est fractionnée et dans laquelle un agent marque un arrêt de travail tel que CA (congé annuel), R (repos), alors les jours qui ont été déduis de la période initiale et repris par une autre, devront être récupérés dans une nouvelle période.

    Les dates de cette nouvelle période, en cas d’un R, ne devront pas être des jours de week-end ou fériés !!!

    Pour les autres systèmes, ils ne seront pas compensés, tels que le travail en système L, B …

    Exemple (Cas de R) :

    L’agent SSS à bénéficié d’un repos dans la période :

    SSS – R - 09/08/2013 - 16/08/2013

    Le 15/08/2013 à suivi une formation d’une journée :

    SSS – FO – 15/08/2013 – 15/08/2013

    Normalement, cet agent doit récupérer la journée passée en formation, le 17/08/2013 (Samedi).

    Mais comme cette date est un week-end, alors la date sera reportée au 19/08/2013 au lieu du 17/08/2013 si cette date du 19 ne marque/croise pas une période (Autre que le système L) déjà existante !!

    Dans de tel cas, cette journée sera comptabilisée comme reliquat pour une date ultérieure.

    1) Le traitement donnera ce résultat dans le cas ou le 19/08/2013 est contenu dans une période en système L (Système par défaut) :

    Date saisies :

    SSS – L – 01/08/2013 – 31/08/2013
    SSS – R – 09/08/2013 – 16/08/2013
    SSS – FO – 15/08/2013 – 15/08/2013

    **** Résultat ****

    SSS – L – 01/08/2013 – 08/08/2013
    SSS – R – 09/08/2013 –14/08/2013
    SSS – FO – 15/08/2013 – 15/08/2013
    SSS – R – 16/08/2013 – 16/08/2013
    SSS – L – 17/08/2013 – 18/08/2013 (Week-end)
    SSS – R – 19/08/2013 – 19/08/2013 (Date de récupération => Un Lundi)
    SSS – L – 20/08/2013 – 31/08/2013

    2) Le traitement donnera ce résultat dans le cas ou le 19/08/2013 est contenu dans une période outre que le système L :

    Date saisies:

    SSS – L – 01/08/2013 – 31/08/2013
    SSS – R – 09/08/2013 – 16/08/2013
    SSS – FO – 15/08/2013 – 15/08/2013
    SSS – B – 19/08/2013 – 23/08/2013

    **** Résultat****

    SSS – L – 01/08/2013 – 08/08/2013
    SSS – R – 09/08/2013 –14/08/2013
    SSS – FO – 15/08/2013 – 15/08/2013
    SSS – R – 16/08/2013 –16/08/2013
    SSS – L – 17/08/2013 –18/08/2013 (Week-end)
    SSS – B – 19/08/2013 – 23/08/2013
    SSS – L – 24/08/2013 – 25/08/2013 (Week-end)
    SSS – R – 26/08/2013 – 26/08/2013 (Date de récupération => Un Lundi)
    SSS – L – 27/08/2013 – 31/08/2013

    3) Le traitement donnera ce résultat dans le cas ou la journée en dette ne peut être récupéré dans le mois en cours (Sera comptabilise comme reliquat) :

    Date saisies :

    SSS – L – 01/08/2013 – 16/08/2013
    SSS – R – 09/08/2013 – 16/08/2013
    SSS – FO – 15/08/2013 – 15/08/2013
    SSS – B – 17/08/2013 – 31/08/2013

    **** Résultat ****

    SSS – L – 01/08/2013 – 08/08/2013
    SSS – R – 09/08/2013 –14/08/2013
    SSS – FO – 15/08/2013 – 15/08/2013
    SSS – R – 16/08/2013 – 16/08/2013
    SSS – B – 17/08/2013 – 31/08/2013

    Voila !

  18. #18
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut fractionner une date selon des periodes saisies
    Bonjour apt,

    J'ai tenté de trouver une solution à ton problème mais en vain.

    J'espère qu'un autre parviendra à le solutionner car pour l'heure les codes proposés ne règlent pas le problème.

    Le passage par les tableaux - code qui se trouve sur ton fichier et proposé par je ne sais qui en dehors du site- me semble un bonne approche.

    Je me demande si le tri sur les dates de départ ne pose pas problème.

    je persévère mais sans trop d'illusion.

    Peut-être un membre automaticien pourra-t-il résoudre ton problème au contraintes multiples.

    bon courage.

  19. #19
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468

  20. #20
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut fractionner une date selon des periodes saisies
    Bonsoir MARC,

    Peut-être me suis-je créé des contraintes non demandées.

    APT voulant extraire un résultat sur un mois donné j'ai pensé qu'une donnée du genre :

    SSS R 10/02/2013 25/03/2013
    SSS Rf 02/03/2013 20/03/2013

    devait restituer ceci pour un mois 3 complet
    R 10/02/2013 28/02/2013 ...... mois 2
    R 01/03/2013 01/03/2013 ...... mois 3
    Rf 02/03/2013 20/03/2013
    R 21/03/2013 25/03/2013

    en tout cas ton code que j'ai étudié m'a permis de constater qu faux en VBA valait "-1" alors que sur le tableur il vaut "0". chose confirmée par un document trouvé sur le net après bien du temps passé.

    je ne comprend pas l'Anglais mais il m'a bien semblé que le code est à quelques nuances près le même que celui remis sur DVP.

    cordialement.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 12
    Dernier message: 30/04/2018, 09h57
  2. Réponses: 4
    Dernier message: 09/02/2009, 16h33
  3. Calcul entre 2 dates selon des paramètres
    Par jibileg dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 10/05/2007, 12h48
  4. Addition d'une date avec des secondes
    Par V_R46 dans le forum C++
    Réponses: 3
    Dernier message: 13/12/2006, 17h23
  5. [VB.net] Générer une date selon condition
    Par WriteLN dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/10/2005, 16h12

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