VBA Compter le nombre de recurrences

Bonjour,

Je vous prie de m'aider à comprendre comment je pourrai mettre en place un contrôle spécifique.

J'ai un planning avec les différents créneaux.

Pour chaque personne, je dois compter le Nombre de créneaux

20forum.xlsm (45.43 Ko)

qui se terminent à 17h:

-> combien de fois par semaine?

-> combien de vendredis par mois?

Ci-joint, dans l'onglet Résultat vous vous pouvez voir le format attendu. Dans l'onglet "Planning" vous avez un exemple du planning.

Merci par avance pour votre aide.

Cordialement,

Bonjour,

essayez ceci

Sub Compter_17heures()
    Dim f1 As Worksheet, f2 As Worksheet
    Dim DerLig_f1 As Long, DerLig_f2 As Long, DerCol_f1 As Long, DerCol_f2 As Long, n As Long
    Dim i As Long, j As Long, k As Long
    Dim Cpt1 As Long, Cpt2 As Long
    Dim Nom As String, Semaine As String

    Application.ScreenUpdating = False
    Set f1 = Sheets("Planning")
    Set f2 = Sheets("Résultat")
    DerLig_f1 = f1.Range("B" & Rows.Count).End(xlUp).Row
    DerCol_f1 = f1.Range("XFD1").End(xlToLeft).Column
    DerLig_f2 = f2.Range("B" & Rows.Count).End(xlUp).Row
    DerCol_f2 = 9 'f1.Range("XFD1").End(xlToLeft).Column
    Cpt1 = 0
    For i = 2 To DerLig_f2
        Nom = f2.Cells(i, "B")

        'tous les jours de la semaine
        For j = 3 To DerCol_f2 - 1
            Semaine = Left(f2.Cells(1, j), 10)
            For k = 5 To DerCol_f1
                For n = 3 To DerLig_f1
                    If Left(f1.Cells(1, k), 10) = Semaine And f1.Cells(n, "B") = Nom Then
                        If InStr(1, f1.Cells(n, k), "17", 1) > 0 Then Cpt1 = Cpt1 + 1
                    End If
                Next n
            Next k
            f2.Cells(i, j) = Cpt1
            Cpt1 = 0
        Next j

        'tous les vendredis du mois
        Cpt2 = 0
        For k = 5 To DerCol_f1
            For n = 3 To DerLig_f1
                If Application.WorksheetFunction.Weekday(f1.Cells(2, k), 2) = 5 And f1.Cells(n, "B") = Nom Then
                    If InStr(1, f1.Cells(n, k), "17", 1) > 0 Then Cpt2 = Cpt2 + 1
                End If
            Next n
        Next k
        f2.Cells(i, 9) = Cpt2
        Cpt2 = 0
    Next i

    f2.Select
    Set f1 = Nothing
    Set f2 = Nothing
End Sub

Cdlt

Bonjour Arturo83:),

C'est super! ça marche parfaitement. Merci beaucoup. Deux petites questions:

1) d'un mois à l'autre, le vendredi n'est pas affiché dans la même case, son emplacement change...est-ce que c'est possible de détecter l'emplacement du vendredi en amont de l'exécution du macro?

2) c'est possible de copier-coller les deux premiers colonnes depuis le fichier planning en supprimant les doublons ?

Merci par avance...

Bonjour,

Excusez-moi, j'ai zappé votre post.

1) d'un mois à l'autre, le vendredi n'est pas affiché dans la même case, son emplacement change...est-ce que c'est possible de détecter l'emplacement du vendredi en amont de l'exécution du macro?, ça n'a pas d'importance puisque la macro lit la date sur les cellules de la ligne 2 et non ce qui est écrit manuellement(le jour) sur la ligne 1. Donc, même si les jours notés sur la ligne 1 sont faux, l'extraction sera toujours juste.

2) c'est possible de copier-coller les deux premiers colonnes depuis le fichier planning en supprimant les doublons ? Ok, c'est fait

Evitez de mette le jour ou la semaine en dur, il existe des formules qui se chargent de les calculer par rapport à la date, ça vous évitera de les changer manuellement à chaque changement de date.

Cdlt

Bonjour Arturo,

J'espère que tu vas bien.

Je reviens vers toi au sujet de ta macro qui marche super bien et qui me facilite vachement la vie.

Je tenais à te poser une question si tu peux m'aider à rajouter un bouton complémentaire qui ferait une opération suivante:

Si le résultat de calcul est supérieure à 1, alors, dans la feuille "Planning" effacer les cases qui font dépasser le compteur, en mettant par défaut 14h-16h.

L'objectif est qu'au final en cliquant sur le bouton "Calculer" chaque personne dans chaque case ait le chiffre 0 ou 1 maximum.

Merci par avance pour ton aide.

Cordialement,

Bonjour,

Essayez ceci:

Sub Compter_17heures()
    Dim f1 As Worksheet, f2 As Worksheet
    Dim DerLig_f1 As Long, DerLig_f2 As Long, DerCol_f1 As Long, DerCol_f2 As Long, n As Long
    Dim i As Long, j As Long, k As Long, Col As Long
    Dim Cpt1 As Long, Cpt2 As Long
    Dim Nom As String, Semaine As String

    Application.ScreenUpdating = False
    Set f1 = Sheets("Planning")
    Set f2 = Sheets("Résultat")
    DerLig_f1 = f1.Range("B" & Rows.Count).End(xlUp).Row
    DerCol_f1 = f1.Range("XFD1").End(xlToLeft).Column
    DerLig_f2 = f2.Range("B" & Rows.Count).End(xlUp).Row
    DerCol_f2 = 9 'f1.Range("XFD1").End(xlToLeft).Column
    Cpt1 = 0
    For i = 2 To DerLig_f2
        Nom = f2.Cells(i, "B")

        'tous les jours de la semaine
        For j = 3 To DerCol_f2 - 1
            Semaine = Left(f2.Cells(1, j), 10)
            For k = 5 To DerCol_f1
                For n = 3 To DerLig_f1
                    If Left(f1.Cells(1, k), 10) = Semaine And f1.Cells(n, "B") = Nom Then
                        If InStr(1, f1.Cells(n, k), "17", 1) > 0 Then Cpt1 = Cpt1 + 1
                    End If
                Next n
            Next k
            f2.Cells(i, j) = Cpt1
            Cpt1 = 0
        Next j

        'tous les vendredis du mois
        Cpt2 = 0
        For k = 5 To DerCol_f1
            For n = 3 To DerLig_f1
                If Application.WorksheetFunction.Weekday(f1.Cells(2, k), 2) = 5 And f1.Cells(n, "B") = Nom Then
                    If InStr(1, f1.Cells(n, k), "17", 1) > 0 Then Cpt2 = Cpt2 + 1
                End If
            Next n
        Next k
        f2.Cells(i, 9) = Cpt2
        Cpt2 = 0
    Next i

    'Remplacer par 14h-16h les plages d'horaires tant que le compteur est supérieur à 1
    For i = 2 To DerLig_f2
        Nom = f2.Cells(i, "B")
        'tous les jours de la semaine
        For j = 3 To DerCol_f2
            Semaine = Left(f2.Cells(1, j), 10)
            cpt = f2.Cells(i, j)
            With f1.Rows(1)
                Set x = .Find(Semaine & "*", lookat:=xlPart)
                If Not x Is Nothing Then
                    Col = x.Column
                    Do While Left(f1.Cells(1, Col), 10) = Left(x, 10) And cpt > 1
                        If InStr(1, f1.Cells(i + 1, Col), "17", 1) > 0 Then
                                f1.Cells(i + 1, Col) = "14h-16h"
                                cpt = cpt - 1
                                f2.Cells(i, j) = cpt
                        End If
                        Col = Col + 1
                    Loop
                End If
            End With
        Next j
    Next i

    f2.Select
    Set f1 = Nothing
    Set f2 = Nothing
End Sub

Cdlt

Merci beaucoup Arturo!

Rechercher des sujets similaires à "vba compter nombre recurrences"