XL 2010 heures négatives

mouradrif

XLDnaute Nouveau
Bonjour à tous
Je souhaite calculer mes heures et celles de mes collègues .
Je n'arrive pas à mettre des heures négatives de l'année précédente (ligne 366 ),ça m’affiche #####.
Pareil pour les lignes du 367 à 371
Pouvez vous m'aider
Merci de votre aide
Bonne journée
 

Pièces jointes

  • RTT 2021 a.xlsx
    38.6 KB · Affichages: 22

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour mouradrif, le forum

il faut travailler sur un calendrier mac 1904
options/options avancées/lors du calcul de ce classeur cocher "utiliser le calendrier depuis 1904"
attention, lors de cette activation, si tu as des dates dans ton classeur, elles seront décalées de 4 ans au moment de l'activation.

Bien cordialement
 

mouradrif

XLDnaute Nouveau
Bonjour mouradrif, le forum

il faut travailler sur un calendrier mac 1904
options/options avancées/lors du calcul de ce classeur cocher "utiliser le calendrier depuis 1904"
attention, lors de cette activation, si tu as des dates dans ton classeur, elles seront décalées de 4 ans au moment de l'activation.

Bien cordialement
Merci
C'est ce que j'ai fait mais ça ne fonctionne pas
Merci beaucoup
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
tu parles en saisie ? parce qu'en formule, cela fonctionne si tu mets tes cellules au format horaire.
si c'est pour la saisie, la solution basique est de saisir dans une autre cellule avec une formule du genre A367=-A366 ou de saisir en mode texte mais alors pas d'opérations possibles.
sinon on peut le gérer avec une événementielle VBA si un code ne te rebute pas. J'avais codé il y a une quinzaine d'année une solution passe partout pour gérer cela et d'autres problèmes de saisie horaire (saisir des heures sans les deux points, saisie d'une heure négative, saisie d'une heure supérieure à 9999, saisie et affichage d'heures négatives sous un calendrier 1900, etc), je peux chercher dans mes archives.
 
Dernière édition:

mouradrif

XLDnaute Nouveau
tu parles en saisie ? parce qu'en formule, cela fonctionne si tu mets tes cellules au format horaire.
si c'est pour la saisie, la solution basique est de saisir dans une autre cellule avec une formule du genre A367=-A366 ou de saisir en mode texte mais alors pas d'opérations possibles.
sinon on peut le gérer avec une événementielle VBA si un code ne te rebute pas. J'avais codé il y a une quinzaine d'année une solution passe partout pour gérer cela et d'autres problèmes de saisie horaire (saisir des heures sans les deux points, saisie d'une heure négative, saisie d'une heure supérieure à 9999, etc), je peux chercher dans mes archives.
J'ai pas fait exprès ,merci de ton aide
Je vais voir ce que je peux faire avec les cellules
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Re mouradrif, le forum

voila, je l'ai retrouvé, 21/07/2005 quand même, toujours fonctionnel même si ça a vieilli !
mon oeil, un peu plus expert qu'il y a déjà presque seize ans, ayant vu des améliorations et des bugs possibles (mais qui ne devraient pas gêner dans ton classeur), je vais la remettre au gout du jour.
Je reposterai le nouveau code une fois fini !
cela fonctionne quelque soit le calendrier, les heures négatives étant affichées en mode texte sur le calendrier 1900 (plus gênant pour les utiliser pour le calcul mais pas impossible).
en pièce jointe ton classeur modifié, pour saisir des heures négatives, il faut:
1-que la cellule soit en format horaire classique ou personnalisé, pas de format standard
2-saisir ton heure négative en format -HHMM (ou -HHMMSS si ton format de cellule comporte les secondes, il faut en fait dans tous les cas entrer une valeur selon le format horaire de ta cellule pour que tu aies le résultat voulu), surtout une saisie horaire sans deux points pour les saisies négatives (pas un problème avec les saisies horaires positives) sinon Excel bloquera la saisie d'une heure négative.
j'ai modifié tes formules et tes formats pour gérer correctement heures et jours
le code n'agit que sur des entrées en cellule formatée au format horaire et gère aussi bien la saisie avec ou sans les deux points, très pratique pour les saisies d'heures au kilomètre.
voici le code,
pour ceux que cela intéresse, l'idée avait germé là : germe
et j'avais fait une démo ici : Démo 2005

Bien cordialement, @+
VB:
'Yeahou - la saisie horaire simplifiée - 21/07/2005
Option Explicit
'Variable module
Dim Traitement_en_Cours As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
'Sortie si traitement en cours
If Traitement_en_Cours = True Then Exit Sub
'Déclaration des variables
Dim Compteur As Integer, Compteur2 As Integer, Compteur3 As Integer, Compteur4 As Integer
Dim Test_Depasse As Boolean, Test_Negatif As Boolean, Test_Secondes As Boolean, Test_Minutes As Boolean, Test_Heures As Boolean
Dim Target_en_Cours As Range, Target_Temp As Variant, Cellule_NumberFormat As String
'réinitialisation si erreur
On Error GoTo Fin
'Traitement si saisie d'une cellule
If Target.Count = 1 Then
    'Traitement si non vide et non résultat formule
    If Not (Target.Value = "") And Not (Left(Target.Formula, 1) = "=") Then
        'Réduction de NumberFormat aux types traités pour analyse
        Cellule_NumberFormat = Target.NumberFormat
        Do
            Compteur = InStr(1, Cellule_NumberFormat, Chr(34), 1)
            If Compteur > 0 Then Compteur2 = InStr(Compteur + 1, Cellule_NumberFormat, Chr(34), 1) _
            Else Compteur2 = 0
            If Compteur2 = 0 Then Compteur = 0
            If Compteur > 0 Then Cellule_NumberFormat = Left(Cellule_NumberFormat, Compteur - 1) & _
            Right(Cellule_NumberFormat, Len(Cellule_NumberFormat) - Compteur2)
        Loop Until Compteur = 0
        'Test secondes, minutes, heures
        If InStr(1, Cellule_NumberFormat, "s", 0) > 0 Then Test_Secondes = True
        If InStr(1, Cellule_NumberFormat, "m", 0) > 0 Then Test_Minutes = True
        If InStr(1, Cellule_NumberFormat, "h", 0) > 0 Then Test_Heures = True
        'Traitement si format horaire
        If Test_Secondes Or Test_Minutes Or Test_Heures Then
            'Initialisation Target_Temp
            Target_Temp = Target.Value
            'Test de la valeur jour présent et transformation en long pour traitement
            Compteur2 = 0
            Compteur3 = 0
            For Compteur = 1 To Len(Target_Temp)
            If Mid(Target_Temp, Compteur, 1) = ":" Then Compteur2 = Compteur2 + 1
            If Mid(Target_Temp, Compteur, 1) = ":" And Compteur3 > 0 And Compteur4 = 0 Then Compteur4 = Compteur
            If Mid(Target_Temp, Compteur, 1) = ":" And Compteur3 = 0 Then Compteur3 = Compteur
            Next Compteur
            If Compteur2 = 3 Then
            Target.Value = (Left(Target_Temp, Compteur3 - 1) * 24) + Mid(Target_Temp, Compteur3 + 1, (Compteur4 - Compteur3) - 1) & Right(Target_Temp, Len(Target_Temp) + 1 - Compteur4)
            Target_Temp = Target.Value
            Compteur2 = 0
            End If
            'Test de la valeur > "9999:00" et transformation en long pour traitement
            Test_Depasse = False
            If InStr(1, Target_Temp, ":", 0) > 0 And Not (IsNumeric(Target_Temp)) Then
                Test_Depasse = True
                If Test_Heures And Test_Minutes And Test_Secondes Then
                    Target_Temp = (Left(Target_Temp, InStr(1, Target_Temp, ":", 0) - 1)) & (Mid(Target_Temp, InStr(1, Target_Temp, ":", 0) + 1, 2)) & (Right(Target_Temp, 2))
                Else
                    Target_Temp = (Left(Target_Temp, InStr(1, Target_Temp, ":", 0) - 1)) & (Right(Target_Temp, 2))
                End If
            End If
            'Test de la valeur numérique et abandon traitement cellule si faux
            If IsNumeric(Target_Temp) Then
                'Abandon traitement cellule <1
                If Abs(Target_Temp) >= 1 Then
                    'Test des valeurs numériques
                    If Target_Temp < 0 Then Test_Negatif = True: Target_Temp = -Target_Temp
                    'Test de target en entier long et traitement si positif
                    If Target_Temp = (Target_Temp \ 1) Or Test_Depasse = True Then
                        'Traitement avec secondes ou non
                        If Test_Secondes Then
                            If Test_Minutes Or Test_Heures Then
                                Select Case Len(Target_Temp)
                                    Case Is < 3
                                        Target_Temp = Target_Temp / 86400
                                    Case Is < 5
                                        Target_Temp = (Left(Target_Temp, Len(Target_Temp) - 2) / 1440) + _
                                        (Right(Target_Temp, 2) / 86400)
                                    Case Else
                                        Target_Temp = (Left(Target_Temp, Len(Target_Temp) - 4) / 24) + _
                                        (Left(Right(Target_Temp, 4), 2) / 1440) + (Right(Target_Temp, 2) / 86400)
                                End Select
                            Else
                                Target_Temp = Target_Temp / 86400
                            End If
                        Else
                            If Test_Minutes Then
                                If Test_Heures Then
                                    Select Case Len(Target_Temp)
                                        Case Is < 3
                                            Target_Temp = Target_Temp / 1440
                                        Case Else
                                            Target_Temp = (Left(Target_Temp, Len(Target_Temp) - 2) / 24) + _
                                            (Right(Target_Temp, 2) / 1440)
                                    End Select
                                Else
                                    Target_Temp = Target_Temp / 1440
                                End If
                            Else
                                Target_Temp = Target_Temp / 24
                            End If
                        End If
                        'Annulation Worksheet_Change pendant traitement
                        Traitement_en_Cours = True
                        'Traitement de Target_Temp selon signe et type calendrier
                        If Test_Negatif = True Then
                            If ThisWorkbook.Date1904 = True Then
                                Target.Value = -Target_Temp
                            Else
                                Target.Value = Target_Temp
                                Target.Value = "'-" & Target.Text
                            End If
                        Else
                            Target.Value = Target_Temp
                        End If
                    End If
                End If
            End If
        End If
    End If
End If
Fin:
Traitement_en_Cours = False
End Sub
 

Pièces jointes

  • RTT 2021 a - Copie.xlsm
    49.6 KB · Affichages: 5
Dernière édition:

Discussions similaires

Réponses
5
Affichages
711

Statistiques des forums

Discussions
312 229
Messages
2 086 423
Membres
103 206
dernier inscrit
diambote