Macro Somme à condition
Bonjour,
J'ai un léger problème avec la macro ci-dessous. Je débute vraiment en VBA et il est possible que j'ai fait une erreur grotesque! Comme indiqué par les notes, ce que je cherche à faire c'est faire la somme (variable EmRT) des cases dans la colonne Emotion.RT , cases pour lesquels la valeurs est égale à "Surprise" dans la colonne Emotion_Contexte. Il n'y a pas de bug qd je lance a macro mais le résultat est toujours 0.... (ce qui m'a mis la puce à l'oreille!!!).
Est-ce que quelqu'un aurait une idée d'où ça coince?
Par ailleurs, qu'est ce que je devrais écrire pour EmRT si jamais je souhaitais obtenir la moyenne de ces valeurs? Ou encore, si je veux savoir combien de ces valeurs sont différentes de zéro ou non nul?
Merci beaucoup à ceux qui prendront le temps de me lire et de m'aider.
Alexbej
Sub ExtractionDonnees2()
i = 1
'Chercher colonne Emotion_Contexte
While (Sheets(1).Cells(1, i) <> "")
If (Sheets(1).Cells(1, i) = "Emotion_Contexte") Then
j = 1
EmRT = 0
'Chercher dans cette colonne les cases Surpises
If (Sheets(1).Cells(j, i) = "Surprise") Then
k = 1
'Prendre les valeurs dans Emotion.RT associé aux Surprises
While (Sheets(1).Cells(1, k) = "Emotion.RT")
'En faire la somme
EmRT = EmRT + Sheets(1).Cells(j, k)
Wend
k = k + 1
End If
j = j + 1
End If
i = i + 1
Wend
Sheets(2).Cells(1, 1) = EmRT
End SubBonjour
Si j'ai bien compris ton problème
Une autre manière
Option Explicit
Sub ExtractionDonnees2()
Dim Cel As Range
Dim Colonne As Integer
With Sheets(1)
Set Cel = .Rows(1).Find(what:="Emotion_Contexte", LookIn:=xlValues, lookat:=xlWhole)
If Not Cel Is Nothing Then
Colonne = Cel.Column
Set Cel = .Rows(1).Find(what:="Emotion.RT", LookIn:=xlValues, lookat:=xlWhole)
If Not Cel Is Nothing Then
Sheets(2).Cells(1, 1) = Application.SumIf(.Columns(Colonne), "Surprise", .Columns(Cel.Column))
Else
MsgBox "Colonne ""Emotion.RT"" introuvable"
End If
Else
MsgBox "Colonne ""Emotion_Contexte"" introuvable"
End If
End With
End SubBonjour Banzai64
Merci de ta réponse et de ton aide. C'est effectivement cela que je souhaitais! Alors, juste quelques questions à propos de ta macro:
- si je veux faire la moyenne, il me suffit de mettre: Application.AverageIf à la place de Application.SumIf, c'est bien ça?
- que dois je faire si je souhaite dénombrer le nombre de valeurs non-nuls (l'équivalent du NB.SI) ?
- Enfin, est il possible d'introduire d'autres conditions? Ici je souhaitais que la colonne Emotion_Contexte contienne le mot "Surprise". Serait-il par exemple possible d'établir en plus que la colonne "Facilité" soit égale à 1 ou 3 (ou encore différentes de 5)?
Merci beaucoup pour ton aide.
Bien cordialement,
Alex
bonjour
alexbej a écrit :- que dois je faire si je souhaite dénombrer le nombre de valeurs non-nuls (l'équivalent du NB.SI) ?
Équivalent c'est COUNTA(Plage)
Pour le reste je pense que ce sont des fonctions spécifiques aux versions supérieures à XL 2003 donc je ne pourrai pas t'aider
Désolé
Merci de ta réponse et de ton aide. Après de longues tentatives, j'ai réussi à mettre plusieurs conditions. En voici la macro:
Option Explicit
Sub ExtractionDonnees2()
Dim Cel As Range
Dim Cel_1 As Range
Dim Colonne As Integer
Dim Colonne_1 As Integer
With Sheets(1)
Set Cel = .Rows(1).Find(what:="Emotion_Contexte", LookIn:=xlValues, lookat:=xlWhole)
If Not Cel Is Nothing Then
Set Cel_1 = .Rows(1).Find(what:="Emotion.ACC", LookIn:=xlValues, lookat:=xlWhole)
If Not Cel_1 Is Nothing Then
Colonne = Cel.Column
Colonne_1 = Cel_1.Column
Set Cel = .Rows(1).Find(what:="Emotion.RT", LookIn:=xlValues, lookat:=xlWhole)
If Not Cel Is Nothing Then
Sheets(3).Cells(4, 3) = Application.AverageIfs(.Columns(Cel.Column), .Columns(Colonne), "Colère", .Columns(Colonne_1), "1")
'Sheets(3).Cells(4, 3) = Application.SumIf(.Columns(Colonne), "Surprise", .Columns(Cel.Column))
Else
MsgBox "Colonne ""Emotion.RT"" introuvable"
End If
Else
MsgBox "Colonne ""Emotion.ACC"" introuvable"
End If
Else
MsgBox "Colonne ""Emotion_Contexte"" introuvable"
End If
End With
End Sub