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

  1. -NoeGo- Messages postés 55 Statut Membre 12
     
    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
  2. 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
  3. -NoeGo- Messages postés 55 Statut Membre 12
     
    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
    1. 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
      1. -NoeGo- Messages postés 55 Statut Membre 12 > 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
  4. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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
    1. loutre
       
      Merci pour cette fomule ! Néanmoins elle ne fonctionne pas dans mon document...
      0
      1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744 > loutre
         
        Ton document ne doit pas être conforme à ton exemple : il faut toujours être précis lorsque l'on donne un exemple.
        0