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 :

Formule VB pour heures de nuit ayant une faille


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2003
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Formule VB pour heures de nuit ayant une faille
    Bonjour.

    Alors que je pensais mon fichier terminé, j'ai trouvé une erreur dans le code VB pour les heures de nuit. En fait, totalement par hasard.
    Erreur, pas vraiment... On pourrait dire que le code "coince" dans un cas de figure. En partant sur l'idée où les heures de nuit doivent s'afficher dans la colonne Q voici le code actuel (extrait du fichier joint, je vous ai mis le nécessaire, mot de passe pour déverrouiller si nécessaire mais normalement vous n'en aurez pas besoin étant donné que ce n'est que du VB ; IMPOSSIBLE) :
    -------------------------------
    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
    Sub HeureNuitProg()
        hd = Range("nuithdeb")
        hf = Range("nuithfin")
        Dim reponse
        ActiveSheet.Range("Q4:Q10,Q12:Q18,Q20:Q26,Q28:Q34,Q36:Q42").ClearContents
     
    For ligne = 0 To 39 'pour les ligne de 1 à 40
        tothnuit = 0: vacation = 0
    If ActiveSheet.Range("A4").Offset(ligne, 0) <> "" Then 'si c'est une date et non une ligne vide
        For vacation = 0 To 8 Step 4 'de 0 à 8 avec saut de 4 pour le decalage de 4 cols entre 2 vacations
            deb = ActiveSheet.Range("c4").Offset(ligne, vacation)
            fin = ActiveSheet.Range("d4").Offset(ligne, vacation)
     
            If (deb <> "" And fin <> "") Then 's'il y a quelque chose dans deb et dans fin
                If (fin > deb) And (fin > hf And fin <= hd) And (deb >= hf And deb < hd) Then 'Si la periode est autre que la periode nuit
                    reponse = 0
                Else
                    If fin > deb Then     'que avant ou apres minuit mais pas à cheval
                        If fin > hd Then  'que avant minuit
                            If deb >= hd Then reponse = fin - deb Else reponse = fin - hd
                        Else              'que apres minuit
                            If fin <= hf Then reponse = fin - deb Else reponse = hf - deb
                        End If
                    Else                  'à cheval sur minuit mais pas que avant ou que apres
                        If deb >= hd Then 'à cheval sur minuit et sup à plage deb
                            If fin <= hf Then reponse = 1 - deb + fin Else reponse = 1 - deb + hf
                        Else              'à cheval sur minuit et inf à plage deb
                            If fin <= hf Then reponse = 1 - hd + fin Else reponse = 1 - hd + hf
                        End If
                    End If
                End If
                tothnuit = tothnuit + reponse
                reponse = 0
            End If
     
        Next vacation
        ActiveSheet.Range("q4").Offset(ligne, 0).Formula = tothnuit
    End If
    Next ligne
     
    End Sub
    Faille trouvée : Les heures de nuit sont spécifiées de 21h à 6h du mat dans la feuille paramètres. Quand une vacation passe sur cette plage horraire, ça marche. Par exemple : 15h à 09h du mat. Il trouve bien les 9h de nuit (21 à 6)

    Mais quand une vacation commence à partir de minuit, ça coince. Déjà, on ne peut pas marquer 0:00... Car ça disparait. On est obligé de marquer 0:01 ... et donc on doit rajouter une minute à l'heure de Fin. Ainsi, si on prévoit une fin à 7h, il faut marquer 7:01... Pas top. Mais là où ça coince essentiellement c'est quand on a besoin d'entrer des vacations de 24h ce qui est courant pour les gars qui sont en astreinte.

    ==> Comme on ne peut pas marquer 00:00 à 24:00, on marque donc 0:01 à 24:01 ... Hors de 0 à 6h du mat il y a bien 6h de nuit et il les trouve. Mais de 21h à 24, il y en a 3 aussi et là il ne les trouve pas. Donc de 0h à 24h il devrait indiquer 9h de nuit et pas 3 comme actuellement.

    Sauriez-vous ce qu'il faut ajouter pour remédier à ça ? D'avance merci.
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    Remarque..
    de 0hr à 0hr il y à 24hrs et une minute
    pour la vacation de 24hrs il faut mettre de 0hrs à 23.59 hrs
    ou de 0.01 à 24

    essaye déjà une de ces solutions et tu dit..
    A+

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2003
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    0h00 à 23h59 : Ca marque 2h59 de nuit au lieu de 9h
    0h00 à 24h00 : Ca marque 3h de nuit au lieu de 9h

    0h00 passe en case blanche (les zéro n'apparaissent pas) mais dans notre cas ça serait bien qu'il apparaisse... Une case blanche comme heure de début ça ne le fait pas trop

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    minuit se saisit 1 et on lui adjoint le format [hh]:mm

    le probléme c'est que 7 heure pour un heure de fin devrait se saisir 1+ (7/24)
    si on veut pouvoir utiliser exel

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    En complément de mon 1er poste..
    Ton problème vient du fait que tu a formater tes cellules en heure et que quand tu passe minuit les valeurs passent au jour suivant, dans la cellule fin de astreinte 1 si tu met 24 la celule affiche 0 mais en réalité la cellule contient 1/1/1900 0:0 ce qui veut dire 1jour.
    Une chose m'étonne quand même, tout en travaillant avec des heures entières (pas de décimale) que tu ai opté pour travaillé avec des heures et non des nombres ce qui te faciliterais grandement les calculs, quitte à formatter les réponses à mettre dans les cellules.
    Exemple: en heure 24 - 0 = 1 ! (jour)
    en nombre 24 - 0 = 24

    A+
    Edit: Pour afficher les 0 ou non c'est dans les paramètres du classeur ou de la feuille. (je sais plus bien)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2003
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Trouvé
    Solution trouvée par Daniel Maeder (Suisse) :

    Code à mettre en lieu et place de celui figurant sur le premier post :

    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
    Sub HeureNuitProg()
        hd = Range("nuithdeb")
        hf = Range("nuithfin")
        Dim reponse
        ActiveSheet.Range("Q3:Q9,Q11:Q17,Q19:Q25,Q27:Q33,Q35:Q41").ClearContents
     
    For Ligne = 0 To 38 'pour les ligne de 1 à 39
        tothnuit = 0: vacation = 0
    If ActiveSheet.Range("A3").Offset(Ligne, 0) <> "" Then 'si c'est une date et non une ligne vide
        For vacation = 0 To 8 Step 4 'de 0 à 8 avec saut de 4 pour le decalage de 4 cols entre 2 vacations
            deb = ActiveSheet.Range("c3").Offset(Ligne, vacation)
            fin = ActiveSheet.Range("d3").Offset(Ligne, vacation)
     
    If (deb <> "" And fin <> "") Then 's'il y a quelque chose dans deb et dans fin
                    reponse = 0                                         ' initialisation de la réponse
                    If fin < deb Then fin = 1 + fin                     ' heures après minuit
                    If deb < hf Then reponse = reponse + (hf - deb)     ' le début est avant la fin des heures de nuit
                    If fin < hf Then reponse = reponse - (hf - fin)     ' la fin est avant la fin des heures de nuit
                    If fin > hd Then reponse = reponse + (fin - hd)     ' la fin est après le début des heures de nuit
                    If deb > hd Then reponse = reponse - (deb - hd)     ' le début est après le début des heures de nuit
                    If fin > hf + 1 Then reponse = reponse - (fin - (hf + 1))   ' la fin est avant la fin des heures de nuit suivante
                    If fin > hd + 1 Then reponse = reponse + (fin - (hd + 1))   ' la fin est après le début des heures de nuit suivante
     
                    'test si on passe minuit
                    'If (fin > deb) And (deb >= hf And fin <= hd) Then 'Si la periode est autre que la periode nuit
                    '    reponse = 0
                    'Else
                    '
                    '    If fin > deb Then     'que avant ou apres minuit mais pas à cheval
                    '        If fin > hd Then  'que avant minuit
                    '            If deb >= hd Then reponse = fin - deb Else reponse = fin - hd
                    '        Else              'que apres minuit
                    '            If fin <= hf Then reponse = fin - deb Else reponse = hf - deb
                    '        End If
                    '    Else                  'à cheval sur minuit mais pas que avant ou que apres
                    '        If deb >= hd Then 'à cheval sur minuit et sup à plage deb
                    '            If fin <= hf Then reponse = 1 - deb + fin Else reponse = 1 - deb + hf
                    '        Else              'à cheval sur minuit et inf à plage deb
                    '            If fin <= hf Then reponse = 1 - hd + fin Else reponse = 1 - hd + hf
                    '        End If
                    '    End If
                    'End If
                    tothnuit = tothnuit + reponse
                    reponse = 0
                End If
     
        Next vacation
        ActiveSheet.Range("q3").Offset(Ligne, 0).Formula = tothnuit
    End If
    Next Ligne
     
    End Sub
    Testé ; ça marche dans tous les cas de figure. Problème réglé donc.

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

Discussions similaires

  1. [XL-2007] Un formule math pour toutes les cellules d'une colone
    Par mentat dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/01/2010, 16h29
  2. Réponses: 3
    Dernier message: 10/10/2008, 21h27
  3. Formules multiples pour une même cellule
    Par nenkira dans le forum Excel
    Réponses: 2
    Dernier message: 05/04/2007, 13h29
  4. Réponses: 3
    Dernier message: 26/02/2007, 10h52
  5. [excel]Valeur d'une case ayant une formule
    Par snooopy007 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 27/07/2006, 17h57

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