Problème de format de l'heure

Bonjour,

J'essaie de faire un nouveau programme dont le code apparait ci-dessous. L'objectif est de récupérer les connexions / déconnexions de certaines personnes et de calculer les temps entre deux connexions / déconnexions.

Le programme marche à l'exception du temps entre deux connexions / déconnexions qui s'affiche mal et d'un critère dans mes conditions qui semble ne pas marcher.

En effet je veux sélectionner les temps entre 2 connexions / déconnexions s'ils sont supérieurs à 5min. De plus lorsque le temps entre deux connexions / déconnexions est de 1H, ma macro affichera 00:00:01.

Ce qui est surprenant c'est que si je lance la macro une deuxième fois le temps devient 01:00:00

Quelqu'un aurait-il une idée ?

Merci d'avance

Sub Calculs_des_horaires()
'
' Calculs_des_horaires Macro
'
Dim DerLig As Long
Dim Ws As Worksheet
Application.ScreenUpdating = False
For Each Ws In Worksheets
    With Ws
        If Ws.Name <> "Données" And Ws.Name <> "Bilan" Then
            Ws.Select
            If Range("B3") = "" Then
            Else
                'Création d'un filtre
                    Range("B2").Select
                    Selection.AutoFill Destination:=Range("B2:B" & Range("C" & Rows.Count).End(xlUp).Row)
                'Définition du filtre
                    .AutoFilterMode = False
                    DerLig = .Range("C" & Rows.Count).End(xlUp).Row
                    .Range("A1:C" & DerLig).Select
                    .Sort.SortFields.Clear
                    .Sort.SortFields.Add Key:=Range("B2:B" & DerLig) _
                        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                    With .Sort
                        .SetRange Range("A1:C" & DerLig)
                        .Header = xlYes
                        .MatchCase = False
                        .Orientation = xlTopToBottom
                        .SortMethod = xlPinYin
                        .Apply
                    End With
            End If

                        'Définition dernière ligne du tableau
                        fin = Range("C" & Rows.Count).End(xlUp).Row
                        Dim ConnexionDefinie As Boolean

                        Cells.Replace What:="??/??/???? - ", Replacement:="" 'suppression de la date dans l'affichage
                        'Définition Destaff
                        Range("E7") = "Destaff"
                        'Définition de l'heure de début
                        Range("E1") = "Heure de début"
                        'Définition de l'heure de fin
                        Range("E4") = "Heure de fin"

                        ConnexionDefinie = False
                            For i = 2 To fin

                                If Cells(i, 3) = "Deconnexion" Then
                                Range("E5") = Cells(i, 2)
                                End If

                                If Cells(i, 3) = "Connexion" And ConnexionDefinie = False Then
                                Range("E2") = Cells(i, 2)
                                ConnexionDefinie = True
                                End If

                                If Cells(i, 3) = "Deconnexion" And Cells(i + 1, 3) = "Connexion" And Cells(i + 1, 2) - Cells(i, 2) > "00:05:00" Then
                                Cells(i, 7) = Cells(i + 1, 2) - Cells(i, 2)
                                End If

                            Next i

                            'Formatage destaffs
                            Range("G:G").Select
                            Selection.NumberFormat = "hh:mm:ss"

                            Range("E8").Select
                            ActiveCell.Formula = "=SUM(R[-7]C[2]:R[7]C[2])"
                            Selection.NumberFormat = "[$-F400]h:mm:ss AM/PM"

                            'Formatage heure de fin
                            Range("E5").Select
                            Selection.NumberFormat = "[$-F400]h:mm:ss AM/PM"

                            'Formatage heure de début
                            Range("E2").Select
                            Selection.NumberFormat = "[$-F400]h:mm:ss AM/PM"

                    Ws.Columns("A:Z").AutoFit
        End If
    End With

Next Ws

    Worksheets("Données").Select
'
'
End Sub

Bonjour,

tu n'as pas plutôt un fichier de test avec des données sur qcq lignes (représentant les différents cas) et la macro si tu veux qu'on regarde ?

eric

Bonjour,

Voici en pièce jointe un fichier illustrant les données que j'aimerai traiter.

Le problème visiblement avec mon programme est qu'il change l'heure!!!

Dans l'onglet "Données" les valeurs sont bonnes, quand je les copies dans un nouvel onglet aussi. Par contre quand je lance ma macro de calcul les heures sont toutes modifiées et je ne comprend pas pourquoi.

Bonne journée,

Merci d'avance,

Edouard

9classeur1.xlsx (43.52 Ko)

Bonjour,

En effet je veux sélectionner les temps entre 2 connexions / déconnexions s'ils sont supérieurs à 5min.

Sélectionner... Vraiment ?

Pas plutôt les mettre en couleur ou les copier ailleurs ?

... de certaines personnes

Lesquelles ? Il y a une liste des noms qcq part ?

Ou bien tous les noms qui répondent aux critères ?

Si tu pouvais mettre le résultat voulu et donner des explications complètes et précises. Mets au moins 2 noms.

Et une extraction de base de données c'est une BDD avec des champs en colonnes. Pas Heure de début et Heure de fin mis n'importe où dans la feuille, surtout s'il doit y avoir plusieurs résultats.

Et n'hésites pas à laisser ton code, ça nous fera moins à coller...

eric

Bonjour,

Excusez mon manque de précision. voilà le fichier avec lequel je travaille.

Je veux avoir le temps entre les connexions / déconnexions de toutes les personnes si elles sont espacées de plus de 5min. J'ai donc dis dans mon code que lorsqu'une déconnexion était suivi d'une connexion et que le temps entre les deux était supérieur à 5 min alors il me copie la différence (heure connexion - heure déconnexion) dans une nouvelle colonne ("G").

Une fois qu'il a parcouru le tableau il me fait la somme de la colonne "G".

Toutes les données sont ensuite récapitulées dans un onglet "bilan".

Ne sachant utiliser les bases de données avec excel, c'est la solution que j'ai trouvé.

Je suis ouvert à tout changement dans mon code (pour l'utilisation de BDD par exemple) mais j'aimerai aussi savoir pourquoi lorsque je lance ma deuxième macro les heures de connexions / déconnexions changent... Il semblerait que ce soit lorsque j'effectue le filtre (classement par ordre croissant) qu'il me change les valeurs de la colonne filtrée. Il les classe bien dans l'ordre croissant mais il rajoute 1sec à chaque ligne

J'espère que c'est plus clair,

Edouard

7test.xlsm (158.64 Ko)

Re,

Je n'ai pas trop regardé ton code.

J'ajoute donc la durée en colonne G. Si plusieurs connexions avant déconnexion, je calcule par rapport à la première.

Code dans le module de la feuille.

Regarde si ça va.

eric

11test.xlsm (82.78 Ko)

J'ai réussi à voir l'erreur dans mon code, les heures ne sont plus modifiées.

La macro que tu me proposes est nettement plus propre que la mienne et elle répond à ma demande donc je vais remplacer la mienne.

Par contre tes lignes de code me sont totalement inconnues, je n'avais jamais utilisé les "mots" que tu utilises.

Je vais voir si je peux pas modifier le reste de mon programme en utilisant le même raisonnement.

Merci beaucoup pour ton aide.

Edouard

Le principe est de récupérer les données dans un tableau en mémoire (3 colonnes) avec :

data = [A2].Resize(derlig - 1, 3)

Beaucoup plus rapide que de lire les cellules une par une.

Ensuite utilisation d'un Dictionary pour avoir une liste sans doublon des noms, et stocker l'heure de connexion.

eric

Rechercher des sujets similaires à "probleme format heure"