Nb occurrences sur 2 critères vba excel
Fredo08
-
cajou08 Messages postés 7 Date d'inscription Statut Membre Dernière intervention -
cajou08 Messages postés 7 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- Nb occurrences sur 2 critères vba excel
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Comment trier par ordre alphabétique sur excel - Guide
- Comment calculer la moyenne sur excel - Guide
- Déplacer colonne excel - Guide
4 réponses
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
--
Bonjour,
Voici un code, merci de me dire si ce n'est pas exactement ce que vous voulez :
Cordialement.
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.
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 :
Merci par avance de votre aide :)
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 :)
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)
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
Cela 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
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
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:
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...
pour la 2= question, voir 1° encadré :o)
Michel
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