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
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
A voir également:
- Nb occurrences sur 2 critères vba excel
- Liste déroulante excel - Guide
- Comment calculer la moyenne sur excel - Guide
- Si et excel - Guide
- Trier sur excel - Guide
- Comment aller à la ligne sur excel - Guide
4 réponses
thev
Messages postés
1961
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
16 février 2025
706
Modifié par thev le 9/10/2015 à 10:25
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
--
Kuartz
Messages postés
852
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
9 oct. 2015 à 09:15
9 oct. 2015 à 09:15
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.
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
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 :
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 :)
thev
Messages postés
1961
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
16 février 2025
706
Modifié par thev le 9/10/2015 à 16:00
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)
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
cajou08
Messages postés
7
Date d'inscription
jeudi 8 octobre 2015
Statut
Membre
Dernière intervention
11 octobre 2015
>
thev
Messages postés
1961
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
16 février 2025
9 oct. 2015 à 16:42
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
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
thev
Messages postés
1961
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
16 février 2025
706
>
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
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".
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".
cajou08
Messages postés
7
Date d'inscription
jeudi 8 octobre 2015
Statut
Membre
Dernière intervention
11 octobre 2015
>
thev
Messages postés
1961
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
16 février 2025
9 oct. 2015 à 21:19
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 :
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)
thev
Messages postés
1961
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
16 février 2025
706
>
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
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
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
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 312
Modifié par michel_m le 9/10/2015 à 14:57
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:
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
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 312
9 oct. 2015 à 17:16
9 oct. 2015 à 17:16
Excuse moi de t' avoir déranger mais cajou, ne t'inquiète pas, je ne le ferais plus.