Microsoft 365 Countifs et dates

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

youguybass

XLDnaute Junior
Bonjour
Voudrais compter le nombre de ligne dans une plage donnée avec "Count if"
Et le critère est de récupérer l'année choisie par ma variable "Annee" et la je bloc je n'arrive a ce que l'année soit choisie.
Je voudrais ensuite continuer avec les mois

D'avance merci

VB:
Private Sub CommandButton172_Click()
 
Dim NbreLigne As Integer, Jo, Ja, Jm As Integer
Dim myRange1 As Range, myRange2 As Range
Dim Annee, DernLig, PremLig, mois

PremLig = Feuil10.[a1].End(xlDown).Row + 2
DernLig = Feuil10.[a65000].End(3).Row + 1
Annee = Year(Date)
mois = 1

Jo = 6 'Colonne Origine intervention (OA / OE / OR)

With Feuil10
    Set myRange1 = .Range(.Cells(PremLig, Jo), .Cells(DernLig, Jo))
Ja = 5 ' Colonne des Dates
 Set myRange2 = .Range(.Cells(PremLig, Ja), .Cells(DernLig, Ja))
 
For mois = 1 To 12
    NbreLigne = Application.WorksheetFunction.CountIfs(myRange1, "OE", myRange2, Year(Date), myRange2, Month(mois))
   MsgBox NbreLigne
Next
End With
'MsgBox NbreLigne
End Sub
 
Moi j'ai ça : il trouve les 3 "12"

Regarde la pièce jointe 1224493
Capture d'écran 2025-11-04 210914.png


Bonjour Hecatonchire
J'ai essayé avec le mois de novembre, mais cela ne me renvoi rien ????
 
Je pense que tu n'as pas compris le problème de la ligne (c'est peut être moi car j'ai lu les messages en diagonale)

Application.WorksheetFunction.CountIfs(myRange1, "OE", myRange2, Year(Date), myRange2, Month(mois))

Pour moi, tu compares des choux et des carottes donc ça ne va pas !
La plage myRange2, c'est des données de type Date donc si la plage est de type Date il faut utiliser comme critère une donnée de type Date !
Le critère Year(Date) n'est pas de type Date mais de type Numérique/Nombre !

C'est pareil pour les mois, par exemple on pourrait penser modifier

Application.CountIfs(Range("A1:A6"), Month(Date))

ainsi

Application.CountIfs(Month(Range("A1:A6")), Month(Date))

pour avoir les bon types et bonne valeurs mais ça NE FONCTIONNE PAS (il attend une plage et non un tableau de valeurs) !

Soit faire un encadrement entre le 1er et dernier jour du mois ou faire une fonction dédiée

VB:
Sub test()
    Debug.Print CompterMoisDansPlage(Range("A1:A6"), Month(Date))
End Sub

Function CompterMoisDansPlage(MaPlage As Variant, intMois As Integer) As Long
    Dim vDates      As Variant
    Dim i           As Long
    Dim LgCpt       As Long

    vDates = MaPlage.Value ' Charger la plage dans un tableau
    LgCpt = 0
    For i = 1 To UBound(vDates, 1)
        If IsDate(vDates(i, 1)) Then ' Vérifie que la cellule contient une vraie date
            If Month(vDates(i, 1)) = intMois Then LgCpt = LgCpt + 1
        End If
    Next
    CompterMoisDansPlage = LgCpt
End Function
 
Je pense que tu n'as pas compris le problème de la ligne (c'est peut être moi car j'ai lu les messages en diagonale)

Application.WorksheetFunction.CountIfs(myRange1, "OE", myRange2, Year(Date), myRange2, Month(mois))

Pour moi, tu compares des choux et des carottes donc ça ne va pas !
La plage myRange2, c'est des données de type Date donc si la plage est de type Date il faut utiliser comme critère une donnée de type Date !
Le critère Year(Date) n'est pas de type Date mais de type Numérique/Nombre !

C'est pareil pour les mois, par exemple on pourrait penser modifier

Application.CountIfs(Range("A1:A6"), Month(Date))

ainsi

Application.CountIfs(Month(Range("A1:A6")), Month(Date))

pour avoir les bon types et bonne valeurs mais ça NE FONCTIONNE PAS (il attend une plage et non un tableau de valeurs) !

Soit faire un encadrement entre le 1er et dernier jour du mois ou faire une fonction dédiée

VB:
Sub test()
    Debug.Print CompterMoisDansPlage(Range("A1:A6"), Month(Date))
End Sub

Function CompterMoisDansPlage(MaPlage As Variant, intMois As Integer) As Long
    Dim vDates      As Variant
    Dim i           As Long
    Dim LgCpt       As Long

    vDates = MaPlage.Value ' Charger la plage dans un tableau
    LgCpt = 0
    For i = 1 To UBound(vDates, 1)
        If IsDate(vDates(i, 1)) Then ' Vérifie que la cellule contient une vraie date
            If Month(vDates(i, 1)) = intMois Then LgCpt = LgCpt + 1
        End If
    Next
    CompterMoisDansPlage = LgCpt
End Function
Bonjour
J'ai intégrer votre code Hecatonchire
J'ai un tableau qui se balade de 2012 → aujourd'hui ayant presque 4000 lignes, le code que vous m'avez envoyé me renvoyait toutes les fiches 2012 à 2025 enregistrées en novembre j'ai donc pris en compte les années sous la variable "An"
avec la boucle ci dessous cela me sortait le bon nombre d'intervention par année au mois de novembre.
mais je n'arrive pas à mettre une variable "Mois" sur les mois de 1 →12 pour faire une boucle for sans que cela ne plante!

Auriez vous une solution?

VB:
Sub test()
Dim An

For An = 2012 To 2025   'Debug.Print CompterMoisDansPlage(Range("E9:E3784"), Month(Date))
 MsgBox CompterMoisDansPlage(Range("E9:E3784"), An, Month(Date))
Next
End Sub

Function CompterMoisDansPlage(MaPlage As Variant, intAn, intMois As Integer) As Long
    Dim vDates      As Variant
    Dim i           As Long
    Dim LgCpt       As Long

    vDates = MaPlage.Value ' Charger la plage dans un tableau
    LgCpt = 0
    For i = 1 To UBound(vDates, 1)
        If IsDate(vDates(i, 1)) Then ' Vérifie que la cellule contient une vraie date
            'If Year(vDates(i, 1)) = Year(Date) Then
            If Year(vDates(i, 1)) = intAn Then
                If Month(vDates(i, 1)) = intMois Then LgCpt = LgCpt + 1
            End If
        End If
    Next
    CompterMoisDansPlage = LgCpt
End Function
 
C'est peut être ce que tu veux

VB:
intAnnee = 2025
intMois = 5
Debug.Print Application.WorksheetFunction.CountIfs( _
Range("A1:A6"), ">=" & DateSerial(intAnnee, intMois, 1) * 1, _
Range("A1:A6"), "<=" & DateSerial(intAnnee, intMois + 1, 0) * 1)
Merci Hecatonchire
C'est cela que je souhaitais, ce matin en arrivant j'ai essayé .... WorksheetFunction.CountIfs(Range("A1:A6"), ">=" & Date(Annee, mois, 1) ...
cela plantait du coup c'est bien ... DateSerial(intAnnee, intMois, 1) * 1 ... qu'il me fallait

Désolé si je n'ai pas été assez claire dans ma présentation du pb.

Grand merci à vous et bonne journée
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
702
Réponses
4
Affichages
578
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
Réponses
10
Affichages
841
Retour