Nb occurrences sur 2 critères vba excel

Bonjour à tous,

J'ai découvert le VBA excel aujourd'hui. J'aimerais créer une fonction qui compte les occurrences d'un mot donné pour un mois donné.

La colonne A contient les dates et la colonne B contient des mots.

J'en suis là, j'arrive à compter un mot donné dans une plage donnée mais je ne sais pas comment gérer la condition portant sur la date.

Merci par avance de votre aide

Function CPTR_OCC(plage As Range, champ As String) As Double
CPTR_OCC = Application.CountIf(plage, champ)
End Function

4 réponses

  1. ci-joint fonction

    Function CPTR_OCC(plage_critère As Range, critère As String, plage_comptage As Range) As Double

    CPTR_OCC = 0
    For Each élément In plage_critère
    ligne_relative = élément.Row - plage_critère.Row + 1
    colonne_relative = élément.Column - plage_critère.Column + 1
    If Month(élément.Value) = critère Then
    If plage_comptage.Cells(ligne_relative, colonne_relative).Value <> Empty Then CPTR_OCC = CPTR_OCC + 1
    End If
    Next

    End Function


    --
    1
    1. Bonjour,

      Voici un code, merci de me dire si ce n'est pas exactement ce que vous voulez :

      Sub Code()
      
      Dim DL As Long
      Dim MOT As String
      Dim MA_DATE As Date
      Dim COMPTEUR As Long
      
      DL = Cells(Application.Rows.Count, 1).End(xlUp).Row
      
      MOT = InputBox("Entrez le mot recherché")
      
      Do
      
      Date = InputBox("Entrez la date pour laquelle le mot sera recherché au format jj/mm/aaaa")
      
      Loop While Format(MA_DATE, "jj/mm/aaaa") = True
      
      For i = 2 To DL 'Changer le 2 pour la ligne où commencent les données
      
      If CDate(Range("A" & i).Value) = CDate(Date) Then
          If CStr(Range("B" & i).Value) = MOT Then
                COMPTEUR = COMPTEUR + 1
          End If
      End If
      
      Next i
      
      MsgBox (COMPTEUR)
      
      End Sub
      


      Cordialement.
      0
      1. Merci à vous 2 de vos réponses.

        Comme je cherchais à créer une fonction perso sous excel, je suis partie sur le code de thev. Il fonctionne bien, je ne comprends cependant pas à quoi servent les deux lignes :

        ligne_relative = élément.Row - plage_critère.Row + 1
        colonne_relative = élément.Column - plage_critère.Column + 1

        Maintenant, j'aimerais créer une autre fonction proche de celle-ci. Je voudrais que la fonction ajoute les valeurs d'une colonne respectant deux critères dans deux autres colonnes. Concrètement, je souhaiterais calculer le kilométrage total pour un mois donné et pour un type de sorties donné.

        Colonne A : la date jj//mm/aaaa
        Colonne B : le type de sorties
        Colonne C : le kilométrage de la sortie

        Exemple de feuille excel :

        date type distance
        01/01/2015 vmac 2
        02/01/2015 vs10 1
        03/01/2015 ef 10
        04/02/2015 vmac 2,5
        05/02/2015 vmac 8
        06/02/2015 ef 12
        06/03/2015 vmac 6
        05/04/2013 vmac 2
        05/04/2013 vmac 1

        je veux par exemple calculer le kilométrage de sorties vmac en février, la fonction devrait retourner la valeur 10,5.

        J'ai tenté d'adapter le code de thev mais ça ne marche pas :


        Function cptr_km(plage_date As Range, num_mois As String, plage_comptage As Range, champ As String, plage_km As Range) As Double

        'plage_date : colonne contenant les dates des sorties
        'num_mois : numéro du mois
        'plage_comptage : colonne contenant les types de sorties
        'champ : type de sorties dont on évalue le km mensuel
        'plage_km : colonne contenant le kilométrage pour un type de sorties donné

        cptr_km = 0

        For Each élément In plage_date
        ligne_relative = élément.Row - plage_date.Row + 1
        colonne_relative = élément.Column - plage_date.Column + 1
        If Month(élément.Value) = num_mois Then
        If plage_comptage.Cells(ligne_relative, colonne_relative).Value = champ Then
        cptr_km = cptr_km + plage_km.Cells(ligne_relative, colonne_relative).Value
        End If
        Next
        End Function


        Merci par avance de votre aide :)
        0
        1. bonjour,

          ligne_relative et colonne_relative donnent respectivement les numéros de ligne et de colonne à l'intérieur de la la plage des dates.
          exemple :
          si la plage de dates va de C3 à C20, la cellule C4 a un numéro de ligne relatif = 2 (2ème ligne de la plage) avec un numéro de ligne absolu (4ème ligne de la feuille) et un numéro de colonne relatif = 1 (1ère colonne de la plage) avec un numéro de colonne absolu (3ème colonne de la feuille)

          ci-dessous code modifié (il ne manquait pas grand chose)


          Function cptr_km(plage_date As Range, num_mois As String, plage_comptage As Range, champ As String, plage_km As Range) As Double

          'plage_date : colonne contenant les dates des sorties
          'num_mois : numéro du mois
          'plage_comptage : colonne contenant les types de sorties
          'champ : type de sorties dont on évalue le km mensuel
          'plage_km : colonne contenant le kilométrage pour un type de sorties donné

          cptr_km = 0

          For Each élément In plage_date
          ligne_relative = élément.Row - plage_date.Row + 1
          colonne_relative = élément.Column - plage_date.Column + 1
          If Month(élément.Value) = num_mois _
          And
          plage_comptage.Cells(ligne_relative, colonne_relative).Value = champ Then
          cptr_km = cptr_km + plage_km.Cells(ligne_relative, colonne_relative).Value
          End If
          Next
          End Function

          0
        2. @thevMerci de votre réponse thev.

          Quand je tente d'utiliser la fonction cptr_km dans une feuille excel, j'ai une erreur #VALEUR!.

          Avez-vous une idée du problème ?

          Merci par avance
          0
        3. @cajou08Oui.
          dans champ, comme c'est du caractère et non un nombre, il faut le mettre entre quotes.
          comme ceci : "vmac"

          Pour débugger la fonction, insérer l'instruction "stop" et cliquer sur F8 pour exécution ligne par ligne après l'instruction "stop".
          0
        4. @thevMerci de votre réponse.

          Dans Excel, j'ai l'erreur #VALEUR! alors que j'y tape bien avec des quotes :

          =cptr_km(A1:A10;2;B1:B10;"vmac";C1:C10)
          0
        5. @cajou08Cela doit provenir d'une cellule de la plage C1 à C10 qui n'est pas numérique ou d'une cellule de la plage A1 à A10 qui n'est pas une date.
          ci-dessous nouvelle version de code permettant de gérer ces anomalies

          Function cptr_km(plage_date As Range, num_mois As String, plage_comptage As Range, champ As String, plage_km As Range) As Double

          'plage_date : colonne contenant les dates des sorties
          'num_mois : numéro du mois
          'plage_comptage : colonne contenant les types de sorties
          'champ : type de sorties dont on évalue le km mensuel
          'plage_km : colonne contenant le kilométrage pour un type de sorties donné

          cptr_km = 0

          For Each élément In plage_date
          ligne_relative = élément.Row - plage_date.Row + 1
          colonne_relative = élément.Column - plage_date.Column + 1
          If IsDate(élément.Value) Then
          If Month(élément.Value) = num_mois _
          And plage_comptage.Cells(ligne_relative, colonne_relative).Value = champ Then
          cptr_km = cptr_km + Val(plage_km.Cells(ligne_relative, colonne_relative).Value)
          End If
          End If
          Next
          End Function

          0
      2. Contributeur
        Bonjour,

        petite demande polie au préalable:
        évite tes questions en cascade! l'option de se dire "je vais faire simple et puis après je verrai et je demanderais si je n'y arrive pas..." est très mauvaise et tu risques cette réponse:
        Il faut bien te rendre compte que ce que tu demandes n'est pas forcément facile et que personne ne veut passer parfois plusieurs heures à essayer de résoudre un problème bénévolement pour se voir dire après coup " en fait dans la réalité  il faut en plus que.... "


        si tu débutes en VBA, à moins d'^tre expérimenté dans un autre langage, il vaut mieux que tu commences par des macros classiques (sub) que tu essaies de transformer en fonction

        Ta fonction doit pouvoir servir dans le maximum de cas: sur toute la feuille, colonnes continues ou pas, beaucoup de lignes, etc.... pas la peine de réinventer la science. unr fois essayée avec succès, tu fourgonnes ta trouvaille sur le grenier de ton disque dur pour une prochaine fois

        voici pour ta première question une proposition mais tu aurais pu utiliser la fonction SOMMEPROD sans VBA mais si c'est pour apprendre...

        Option Explicit
        '-----
        Function xyz(Dates As Range, N°_mois As Byte, Mot As String, quoi As Range) As Integer
        'cherche dans la feuille active le nombre d'un mot(mot) dans une colonne(quoi) _
        au cours du mois (N°_mois) inscrit dans une autre colonne(dates)
        Dim col_q As Integer, col_m As Integer, nbre As Long, cptr As Long, Lig As Long
        col_q = quoi.Column
        col_m = Dates.Column
        nbre = Application.CountIf(quoi, Mot)
        If nbre = 0 Then Exit Function
        Lig = 1
        'on ne boucle que sur le nombre de valeur "mot"
        For cptr = 1 To nbre
        Lig = Columns(col_q).Find(Mot, Cells(Lig, col_q)).Row
        If Month(Cells(Lig, col_m)) = N°_mois Then xyz = xyz + 1
        Next
        End Function


        pour la 2= question, voir 1° encadré :o)

        Michel
        0
        1. Contributeur
          Excuse moi de t' avoir déranger mais cajou, ne t'inquiète pas, je ne le ferais plus.
          0