XL 2010 VBA recherche de données

lamailloche

XLDnaute Junior
Bonjour le Forum,
Dans un fichier, j'ai un onglet extract (col A à E) avec plusieurs Login/Logout par personne (ident) et je dois rapatrier dans l'onglet Restit les pauses repas qui peuvent être prises entre 11h et 13h15 et dont la durée minimum est de 45 mn.
J'avoue ne pas savoir comment faire pour rapatrier les données qui m'intéressent.
Je joins un fichier pour une meilleure compréhension. Les col H à J de l'onglet extract sont des commentaires pour expliciter ma demande.
Si vous pouvez m'apporter votre aide ce serait super.
Merci le forum
 

Pièces jointes

  • Help.xlsm
    38 KB · Affichages: 30

vgendron

XLDnaute Barbatruc
Hello

voici un début de code (qui ne fait rien pour l'instant)
mais qui te donne déjà une idée du "comment" je pense travailler sur ton sujet

en fait. j'essaie de suivre le diagramme que tu as dessiné
et je suis arrivé à la transition: Durée>7h ----> Recherche Pause repas

et c'est la que je bloque.
on est dans une situation ou il y a plus de 2 log et d'une durée totale >7h
COMMENT détectes tu la pause?

pour l'ident A--> il y a 4 log -- durée de 09:12:48
la pause est (je suppose) située entre le 1er LogOut et le second Log In

mais pour l'ident D ??

un début de pause doit il etre défini comme:
LogOut en colonne D ET heure entre 11h et 13h15 ?

VB:
Sub pause()

Dim tablo() As Variant
'ActiveSheet.Range("A1").CurrentRegion.Offset(1).Select
tablo = Range("A1").CurrentRegion.Offset(1).Value 'on récupère toutes les données colonnes A à E de la feuille Extract
For i = LBound(tablo, 1) To UBound(tablo, 1) 'sur chaque ligne du tablo
    If tablo(i, 1) = "" Then tablo(i, 1) = tablo(i - 1, 1) 'permet de recopier le NOM sur TOUTES les lignes concernées par le nom
Next i

'on parcourt toutes les lignes du tablo sur la colonne "Nom"
For i = LBound(tablo, 1) + 1 To UBound(tablo, 1)
    j = i
    NbLog = 0
    While tablo(j, 4) <> "" 'on cherche le nombre de log (in et out) pour le nom en cours
        NbLog = NbLog + 1
        j = j + 1
    Wend
    If NbLog > 2 Then 'si on a plus de 2 log
        If tablo(i, 5) < "11:30:00" Then 'si l'heure de prise de service est <11:30
            'MsgBox "test durée"
            Durée = tablo(i + NbLog - 1, 5) - tablo(i, 5) 'on calcule la durée
            'MsgBox Format(Durée, "hh:mm:ss")
            If (Format(Durée, "hh:mm:ss") >= "06:55:00") Then 'si la durée >7h -5'
                MsgBox "Recherche Pause"
               
               
            End If
        End If
       
    End If
       
    i = i + NbLog
Next i

End Sub
 

vgendron

XLDnaute Barbatruc
Voir ce code qui
place le temps de pause calculé en colonne C en face du nom
et place le LogOut en colonne D

VB:
Sub pause()

Dim tablo() As Variant
'ActiveSheet.Range("A1").CurrentRegion.Offset(1).Select
tablo = Range("A1").CurrentRegion.Offset(1).Value 'on récupère toutes les données colonnes A à E de la feuille Extract
For i = LBound(tablo, 1) To UBound(tablo, 1) 'sur chaque ligne du tablo
    If tablo(i, 1) = "" Then tablo(i, 1) = tablo(i - 1, 1) 'permet de recopier le NOM sur TOUTES les lignes concernées par le nom
Next i

'on parcourt toutes les lignes du tablo sur la colonne "Nom"
For i = LBound(tablo, 1) + 1 To UBound(tablo, 1)
    j = i
    NbLog = 0
    While tablo(j, 4) <> "" 'on cherche le nombre de log (in et out) pour le nom en cours
        NbLog = NbLog + 1
        j = j + 1
    Wend
    If NbLog > 2 Then 'si on a plus de 2 log
        If tablo(i, 5) < "11:30:00" Then 'si l'heure de prise de service est <11:30
            'MsgBox "test durée"
            Durée = tablo(i + NbLog - 1, 5) - tablo(i, 5) 'on calcule la durée
            'MsgBox Format(Durée, "hh:mm:ss")
            If (Format(Durée, "hh:mm:ss") >= "06:55:00") Then 'si la durée >7h -5'
                'MsgBox "Recherche Pause"
                k = i
                While tablo(k, 4) <> "LogOut" Or (Format(tablo(k, 5), "hh:mm:ss") < "11:00:00" And Format(tablo(k, 5), "hh:mm;ss") > "13:15:00")
                    k = k + 1
                Wend
                TempsPause = tablo(k + 1, 5) - tablo(k, 5)
                With Sheets("Restit").Range("B:B")
                    Set ici = .Find(tablo(i, 1), LookIn:=xlValues, lookat:=xlWhole)
                    If Not ici Is Nothing Then
                        ici.Offset(0, 1) = TempsPause
                        ici.Offset(0, 2) = tablo(k + 1, 5)
                    End If
                End With
                'MsgBox Format(TempsPause, "hh:mm:ss")
               
            End If
        End If
       
    End If
       
    i = i + NbLog
Next i

End Sub
 

Statistiques des forums

Discussions
312 095
Messages
2 085 250
Membres
102 836
dernier inscrit
Ali Belaachet