Nb occurrences sur 2 critères vba excel

Fermé
Fredo08 - 8 oct. 2015 à 19:29
cajou08 Messages postés 7 Date d'inscription jeudi 8 octobre 2015 Statut Membre Dernière intervention 11 octobre 2015 - 11 oct. 2015 à 17:39
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

A voir également:

4 réponses

thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681
Modifié par thev le 9/10/2015 à 10:25
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
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61
9 oct. 2015 à 09:15
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
cajou08 Messages postés 7 Date d'inscription jeudi 8 octobre 2015 Statut Membre Dernière intervention 11 octobre 2015
9 oct. 2015 à 13:45
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
thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681
Modifié par thev le 9/10/2015 à 16:00
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
cajou08 Messages postés 7 Date d'inscription jeudi 8 octobre 2015 Statut Membre Dernière intervention 11 octobre 2015 > thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024
9 oct. 2015 à 16:42
Merci 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
thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681 > cajou08 Messages postés 7 Date d'inscription jeudi 8 octobre 2015 Statut Membre Dernière intervention 11 octobre 2015
Modifié par thev le 9/10/2015 à 19:14
Oui.
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
cajou08 Messages postés 7 Date d'inscription jeudi 8 octobre 2015 Statut Membre Dernière intervention 11 octobre 2015 > thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024
9 oct. 2015 à 21:19
Merci 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
thev Messages postés 1852 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 23 avril 2024 681 > cajou08 Messages postés 7 Date d'inscription jeudi 8 octobre 2015 Statut Membre Dernière intervention 11 octobre 2015
Modifié par thev le 9/10/2015 à 23:27
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

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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 9/10/2015 à 14:57
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
9 oct. 2015 à 17:16
Excuse moi de t' avoir déranger mais cajou, ne t'inquiète pas, je ne le ferais plus.
0