VBA: Calcul moyenne d'une plage sous condition

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Provence Vintage

XLDnaute Occasionnel
Bonjour le Forum,

Je cherche à calculer la moyenne de la plage "C4:C65536",
pour toutes les valeurs avec "X" dans le colonne "P4😛65536" et "T4" en colonne "V4:V65536"

Voici le code que j'essaye, mais niet!:

#Dim cel As Range, n As Byte

For Each cel In Sheets("bdd acheteurs").Range("P4😛" & Sheets("bdd acheteurs").Range("P65536").End(xlUp).Row)
If cel = "X" And cel.Offset(, 6) = "T4" Then n = Application.Average(Range("C4:C65536"))
Next
Label6 = n#



Ci joint Fichier
Merci à toutes et tous pour vos idées,
bonne journée!

Cijoint.fr - Service gratuit de dépôt de fichiers
 
Re : VBA: Calcul moyenne d'une plage sous condition

bonjour
If cel = "X" And cel.Offset(, 6) = "T4" Then n = Application.Average(Range("C4:C65536"))
tu dis à excel que chaque fois que cel = "X" et ... = "T4" de faire la moyenne de C4 à C65536
Ce qui ne veut pas dire qu'il va faire la moyenne de ces cellules là. Il va seulement la calculer quand les deux tests sont vrais, mais le résultat sera toujour le même
à mon sens, on peut faire
1. for each cell ...
2. if cel = "X" ...
2.1 faire la somme des valeurs (par ex sommevaleurs et sommevaleurs + cel)
2.2 incrémenter un compteur
3. next cel
4. n = sommevaleurs / compteur
 
Re : VBA: Calcul moyenne d'une plage sous condition

bonjour Mutzig,

en te suivant, je bloque sur la première étape🙁

pour la somme:


#For Each cel In Sheets("bdd vendeurs").Range("P4😛" & Sheets("bdd vendeurs").Range("P65536").End(xlUp).Row)
If cel = "X" And cel.Offset(, 6) = "T4" Then n = Application.Sum(Range("C4:C65536"))
Next

Label6 = n
End With '#

pour le compteur😕

peux tu m'eclairer un peu
merci
 
Re : VBA: Calcul moyenne d'une plage sous condition

re
dim sommeV, cpt, moy
For Each cel In Sheets("bdd vendeurs").Range("P4😛" & Sheets("bdd vendeurs").Range("P65536").End(xlUp).Row)
If cel = "X" And cel.Offset(, 6) = "T4" Then
sommeV = sommeV + cel.offset(,???) 'remplacer ??? par l'offset de ta colonne -en + ou en moins
cpt = cpt+1
end if
Next
moy = sommeV / cpt
msgbox moy
 
Re : VBA: Calcul moyenne d'une plage sous condition

re,

de mon côté, j'essaye avec ce bout de code, en déclarant n, n1, n2 .... en "As Byte"

#With Sheets("bdd acheteurs")
For Each cel In Sheets("bdd acheteurs").Range("P4😛" & Sheets("bdd acheteurs").Range("P65536").End(xlUp).Row)
If cel = "X" And cel.Offset(, 6) = "T4" Then n2 = n2 + 1
Next
If n2 > 0 Then
T4MDVO = Format(CDbl((Application.SumIf(.Range("P4😛65536"), "X", .Range("C4:C65536")) / (n2))) / 1000, "# ##0 K€")
End If
End With#


le hic c que le calcul en colonne C ne prends en compte que les X,
je ne parviens pas à mettre les deux conditions : "If cel = "X" And cel.Offset(, 6) = "T4""
 
Re : VBA: Calcul moyenne d'une plage sous condition

Bonsoir
Code:
[COLOR="DarkSlateGray"][B]Sub toto()
Dim d, c1, c2, i As Long, n As Long, s As Double, m
   With Sheets(1)
      d = .Range("C4:C65536").Value
      c1 = .Range("P4:P65536").Value
      c2 = .Range("V4:V65536").Value
   End With
   For i = 1 To UBound(d, 1)
      If c1(i, 1) = "X" And c2(i, 1) = "T4" And d(i, 1) <> "" Then _
         s = s + d(i, 1): n = n + 1
   Next i
   If n Then m = s / n Else m = ""
   MsgBox m
End Sub[/B][/COLOR]
Ça devrait être assez rapide.​
ROGER2327
#2455
 
Re : VBA: Calcul moyenne d'une plage sous condition

Bonsoir Roger, le Fil,

ça marche nickel pour une valeur,
le hic, c que j'ai du mal à duppliquer le code,
relativement long à ecrire et les résultats sont faussés!

ci joint extrait du fichier que tu puisse voir l'usf et le code que j'ai commencé à dupliquer!

merci beaucoup pour ta patience!
Cijoint.fr - Service gratuit de dépôt de fichiers
 
Re : VBA: Calcul moyenne d'une plage sous condition

Re...
Je m'en suis tenu à ces instructions :
Je cherche à calculer la moyenne de la plage "C4:C65536",
pour toutes les valeurs avec "X" dans le colonne "P4😛65536" et "T4" en colonne "V4:V65536"
pour écrire le code.
Comme il n'y a pas d'indication sur la feuille d'origine des données, j'ai, par défaut, choisi la feuille 1.
Comme il n'y a pas d'indication sur l'endroit où renvoyer le résultat, je l'affiche dans une boîte de message.
Pour le reste, je dois dire que je ne comprends pas grand chose : que s'agit-il de "dupliquer" ? Où ? Et lorsque vous dites :
ça marche nickel pour une valeur
qu'entendez-vous par là ? J'ai l'impression que la procédure traite 65000 valeurs dans la colonne C et des poussières en fonction de deux paramètres dans les colonnes P et V. Pourriez-vous préciser votre problème ?​
ROGER2327
#2459
 
Re : VBA: Calcul moyenne d'une plage sous condition

Re,

En effet,
Je cherche le code qui me permette dans mon USF d'afficher les Moyennes Tarifs pour
MDV, en Fonction de T2, T3, T4, ... T7 (colonne P)
Appart, en Fonction de T2, T3, T4, .... T7; (colonne Q)
and so on!

D'où le fait qu'au travers d'un exemple, je pensais pouvoir écrire le reste!
lorsqu'on test avec votre code pour MDV et T4, la moyenne est juste; lorsque je tente de le faire pour MDV et T2, là ça cale!


Seules, les colonnes Prix, et Type (T2, T3, ...) ne changent pas et sont respectivement colonnes C et Colonne V, avec pour V les Variables T2, T3....
Les colonnes Familles de Bien Varient de P à T

merci
 
Dernière édition:
Re : VBA: Calcul moyenne d'une plage sous condition

Re...
Ne soyez pas trop pressé ! Il faut d'abord analyser votre code puisque vous ne l'avez pas commenté.
Voici donc les commentaires qui s'imposent pour ce tronçon de code :
Code:
[COLOR="DarkSlateGray"][B]With Sheets("bdd acheteurs")
      d = .Range("C4:C65536").Value
      c1 = .Range("P4:P65536").Value
      c2 = .Range("Q4:Q65536").Value
      c3 = .Range("R4:R65536").Value
      c4 = .Range("S4:S65536").Value
      c5 = .Range("T4:T65536").Value
      e = .Range("V4:V65536").Value
   End With
   For i = 1 To UBound(d, 1)
      If c1(i, 1) = "X" And e(i, 1) = "T2" And d(i, 1) <> "" Then _
         s = s + d(i, 1): n = n + 1
   Next i
   If n Then m = s / n Else m = "" [COLOR="SeaGreen"]'m=moyenne des éléments de "C4:C65536" _
   associés à "X" en colonne P et à "T2" en colonne V.[/COLOR]
   T2MDVO = Format(CDbl(m) / 1000, "# ##0 K€")
   For i = 1 To UBound(d, 1)
      If c1(i, 1) = "X" And e(i, 1) = "T3" And d(i, 1) <> "" Then _
         s = s + d(i, 1): n = n + 1
   Next i
   If n Then m = s / n Else m = "" [COLOR="SeaGreen"]'m=moyenne des éléments de "C4:C65536" _
   associés à "X" en colonne P et à "T2" ou à "T3" en colonne V.[/COLOR]
   T3MDVO = Format(CDbl(m) / 1000, "# ##0 K€")
   For i = 1 To UBound(d, 1)
      If c1(i, 1) = "X" And e(i, 1) = "T4" And d(i, 1) <> "" Then _
         s = s + d(i, 1): n = n + 1
   Next i
   If n Then m = s / n Else m = "" [COLOR="SeaGreen"]'m=moyenne des éléments de "C4:C65536" _
   associés à "X" en colonne P et à "T2" ou à "T3" ou à "T4" en colonne V.[/COLOR]
   T4MDVO = Format(CDbl(m) / 1000, "# ##0 K€")
    For i = 1 To UBound(d, 1)
      If c1(i, 1) = "X" And e(i, 1) = "T5" And d(i, 1) <> "" Then _
         s = s + d(i, 1): n = n + 1
   Next i
   If n Then m = s / n Else m = "" [COLOR="SeaGreen"]'m=moyenne des éléments de "C4:C65536" _
   associés à "X" en colonne P et à "T2" ou à "T3" ou à "T4" ou à "T5" en colonne V.[/COLOR]
   T5MDVO = Format(CDbl(m) / 1000, "# ##0 K€")
   For i = 1 To UBound(d, 1)
      If c1(i, 1) = "X" And e(i, 1) = "T6" And d(i, 1) <> "" Then _
         s = s + d(i, 1): n = n + 1
   Next i
   If n Then m = s / n Else m = "" [COLOR="SeaGreen"]'m=moyenne des éléments de "C4:C65536" _
   associés à "X" en colonne P et à "T2" ou à "T3" ou à "T4" ou à "T5" ou à "T6" en colonne V.[/COLOR]
   T6MDVO = Format(CDbl(m) / 1000, "# ##0 K€")
   For i = 1 To UBound(d, 1)
      If c1(i, 1) = "X" And e(i, 1) = "T7" And d(i, 1) <> "" Then _
         s = s + d(i, 1): n = n + 1
   Next i
   If n Then m = s / n Else m = "" [COLOR="SeaGreen"]'m=moyenne des éléments de "C4:C65536" _
   associés à "X" en colonne P et à "T2" ou à "T3" ou à "T4" ou à "T5" ou à "T6" ou à "T7" en colonne V.[/COLOR]
   T7MDVO = Format(CDbl(m) / 1000, "# ##0 K€")[/B][/COLOR]
Etes-vous d'accord avec les commentaires en vert ?
La suite du code fait la même chose avec les colonnes C, Q et V.
Sinon que voulez-vous précisément calculer ?​
ROGER2327
#2460
 
Dernière édition:
Re : VBA: Calcul moyenne d'une plage sous condition

Suite...
Il m'est venu une autre interprétation de vos explications.
Pour vérifier sa validité, je joins un classeur de test. Comme votre fichier est de taille excessive pour être déposé ici, je vous propose la manipulation suivante : ouvrez votre énorme classeur de démonstration, puis ouvrez le fichier ci-joint.
Copiez la feuille "Essai" dans votre classeur de test (clic-droit sur l'onglet "Essai", puis "Déplacer ou copier...").
Exécutez le test (clic sur le bouton "TEST") et voyez si les résultats correspondent à votre attente...
Attention : le test porte sur la feuille "bdd acheteurs". Je ne me suis pas occupé de l'autre feuille.
Code:
[COLOR="DarkSlateGray"][B]Sub toto2()
Dim d, c1, c2, r(1 To 6, 1 To 5) As Variant, p(1 To 6, 1 To 5) As Long, z
Dim i As Long, j As Long, k As Long
   With Sheets("bdd acheteurs")
      d = .Range("C4:C65536").Value
      c1 = .Range("P4:T65536").Value
      c2 = .Range("V4:V65536").Value
   End With
   z = Array("", "T2", "T3", "T4", "T5", "T6", "T7")
   For i = 1 To UBound(d, 1)
      If d(i, 1) <> "" Then
         For k = 1 To 6
            If c2(i, 1) = z(k) Then
               For j = 1 To 5
                  If c1(i, j) = "X" Then _
                     r(k, j) = r(k, j) + CDbl(d(i, 1)): p(k, j) = p(k, j) + 1
               Next j
            End If
         Next k
      End If
   Next i
   With Sheets("Essai")
      .Range("C3:G8").Value = r
      For j = 1 To 5
         For k = 1 To 6
            If p(k, j) <> 0 Then r(k, j) = r(k, j) / p(k, j) Else r(k, j) = ""
         Next k
      Next j
      .Range("C11:G16").Value = p
      .Range("C19:G24").Value = r
   End With
End Sub[/B][/COLOR]
ROGER2327
#2461
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour