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 SubBonjour,
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
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
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
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