Nombre d'évènements "A" compris entre deux évènements "B"

loutre -  
-NoeGo- Messages postés 55 Statut Membre -
Bonjour,

je réalise une étude comportementale. Parmi une liste de comportements (mettons A jusqu'à E) répertoriés au cours de X observations, je cherche à calculer une moyenne du nombre d'évènements "A" compris entre deux évènements "B" pour chaque observation x.

J'ai pensé à utiliser la fonction SOMMEPROD mais je me débat depuis plusieurs jours avec Excel sans parvenir à trouver une solution.

auriez-vous une idée de formule ?

Merci d'avance !


4 réponses

-NoeGo- Messages postés 55 Statut Membre 11
 
Bonjour,

Est-il possible d'avoir le fichier ? Parce que je n'arrive pas trop à voir ce que vous souhaitez.

Vous pouvez, le partager avec ce site : https://www.cjoint.com/

Bonne journée,
-NoeGo-
0
loutre
 
bonjour NoeGoe,

voici un document simplifié : j'ai juste extrait les colonnes qui m 'intéressent pour ce pb en particulier (le document de base est tres volumineux et comprend plus de 1400000 lignes)

http://www.cjoint.com/c/GBhjPMrRmvY
0
-NoeGo- Messages postés 55 Statut Membre 11
 
Voici une solution.

J'ai créer une macro pour le calcul parce que je ne vois pas comment faire avec des formules classiques...
N'hésites pas si tu as des questions sur la macro, j'ai essayer de la commenter au maximum.

Voici le lien vers le fichier :
https://www.cjoint.com/c/GBhlRJpOCwP

Et le code :
Option Explicit

Function MoyenneXEntreDeuxY(CelluleX As Range, CelluleY As Range, Plage As Range) As Double
'Moyenne du nombre de X entre deux Y

Application.Volatile 'Recalcule à chaque modification du fichier la valeur de la fonction

Dim Cellule As Range
Dim CptX As Long
Dim NbX As Long
Dim NbY As Long
Dim i As Integer
Dim Colonne As Integer

NbX = 0 'Initialisation du nombre de X à 0
NbY = 0 'Initiatisation du nombre de Y à 0

If Plage.Columns.Count <> 1 Then 'Verification que la plage de recherche ne contient qu'une colonne
    MsgBox "Erreur : la plage ne peut contenir qu'une colonne"
    MoyenneXEntreDeuxY = 0
Else
    Colonne = Plage.Column 'Recupération de la colonne de la sélection
    For Each Cellule In Plage
        If Cellule.Value = CelluleY.Value Then 'Si on a une cellule Y, alors on compte le nombre de X qu il y a avant le prochain Y
            i = 1
            If Cellule.Row + i > Plage.Row + Plage.Rows.Count - 1 Then 'Verification que lon ne depasse pas la selection
            
            Else
                CptX = 0 'Initialisation du compteur de X
                While Cells(Cellule.Row + i, Colonne).Value <> CelluleY.Value And Cellule.Row + i <= Plage.Row + Plage.Rows.Count - 1 'tant quon ne trouve pas un autre Y et quon est toujours dans la plage de recherche
                    If Cells(Cellule.Row + i, Colonne).Value = CelluleX.Value Then 'Si cest un X alors on le compte
                        CptX = CptX + 1
                    End If
                    i = i + 1 'ajout de 1 dans i pour parcourir les cellules apres le Y
                Wend
                NbX = NbX + CptX 'On ajoute le nombre de X compté dans le total
                NbY = NbY + 1 'On indique quon a encore un Y
            End If
        End If
    Next Cellule
    
    MoyenneXEntreDeuxY = NbX / NbY 'Calcul de la moyenne
End If

End Function
0
loutre
 
Merci beaucoup d'avoir pris le temps de réaliser cette macro !
Je t'avoue que je ne sais pas les utiliser... je suppose qu'il me suffit juste de copier ce code dans la section appropriée dans Excel et de juste compléter les plages concernées ?
En tous cas si j'arrive à la faire fonctionner c'est génial merci beaucoup ! :)
0
-NoeGo- Messages postés 55 Statut Membre 11 > loutre
 
Bonsoir,

Désolé je n'ai pas eu le temps de revenir ici avant.
Pour utiliser la macro, le plus simple est de prendre le fichier que j'ai envoyé dans mon précédent message et de copier tes données dans ce fichier pour utiliser la macro. Après, tu as juste à utiliser la fonction MoyenneXEntreDeuxY et indiquer les paramètres que j'ai indiqué dans le fichier.
Si tu ne peux pas copier tes données dans mon fichier, alors il faudrait en effet copier le code de la macro. Pour cela, il faut passer par l'onglet developpeur (a rendre visible dans les options Excel si tu ne l'a pas dans le rubal), choisir l'option visual basic (la première la plus a gauche) puis créer un module et copier le texte dans le module créé.
N'hésite pas a rechercher des tutos, c'est assez simple, mais mon explication est succincte et sans illustrations...

Bonne soirée,
-NoeGo-
0
gbinforme Messages postés 15481 Date d'inscription   Statut Contributeur Dernière intervention   4 727
 
Bonjour,

J'ai pensé à utiliser la fonction SOMMEPROD

Avec tes codes 'OBSNR' à partir de F2 et cette formule, cela ne te donne pas ce que tu cherches ?
=SOMMEPROD((C:C=F2)*(D:D="A"))/SOMMEPROD((C:C=F2)*(D:D="B"))

En tout cas les résultats sont assez similaires à la macro parfaite de -NoeGo- (salut à toi)
 Toujours zen
La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.  Antoine de Saint-Exupéry
0
loutre
 
Merci pour cette fomule ! Néanmoins elle ne fonctionne pas dans mon document...
0
gbinforme Messages postés 15481 Date d'inscription   Statut Contributeur Dernière intervention   4 727 > loutre
 
Ton document ne doit pas être conforme à ton exemple : il faut toujours être précis lorsque l'on donne un exemple.
0