Message d'erreur6 dépassement de capacité pendant calcul moyenne

Signaler
Messages postés
35
Date d'inscription
mercredi 4 janvier 2012
Statut
Membre
Dernière intervention
12 septembre 2013
-
Messages postés
30286
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2020
-
Salut à toute la communauté.
J'ai essayé de faire tourner le code ci-dessous mais ça me renvoie erreur 6 dépassement de capactié. J'ai remmené les variable en type long mais rien à faire. J'ai même essayé de déclarer une variable range qui stock les cellules répondant à la condition et ensuite calculer la moyenne ça ne marche pas. Votre aide me sera précieuse merci d'avance.

 i = 0
j = 0
k = 0
For i = 2 To Feuil2.Range("A" & Rows.Count).End(xlUp).Row
If Feuil2.Range("G" & i).Value = 1 Then
j = j + 1 And k = Feuil2.Range("M" & i).Value + k
End If
Next
Feuil5.Range("B5").Value = Round((k / j), 2)

12 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour,
où et comment as-tu déclaré çi, j et k ?
Je ne comprends pas cette ligne :
j = j + 1 And k = Feuil2.Range("M" & i).Value + k

!!
Messages postés
35
Date d'inscription
mercredi 4 janvier 2012
Statut
Membre
Dernière intervention
12 septembre 2013

voici les déclaration que j'ai fait en début de programme que j'avais omise.
Private Sub CommandButton1_Click()
Dim i As Long
Dim j As Long
Dim k As Long
Dim l As Long
Dim m As Long
Dim n As Long
Dim c As Long
Dim d As Long
Dim p As Long
Dim q As Long
Dim r As Long
Dim rangetmp As Range
Dim z As Chart
Comme vous pouvez le voir ils ont été déclaré en long.
En fait l'idée du programme est de calculer une moyenne conditionnelle. Je m'explique à chaque fois que la cellule rempli la condition je la stocke dans k et j c'est pour connaitre le combien ième cellule qui correspond à la condition et par la suite diviser pour avoir la moyenne.
Merci
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
tu n'as pas répondu à ma remarque concernant une ligne de code. Elle est incohérente !
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
Bonjour,

Je bloque sur la ligne :
j = j + 1 And k = Feuil2.Range("M" & i).Value + k


je ne vois pas ce que ton expression conditionnelle fait dans une expression mathématique.

Il y a conflit de type, je pense ici déjà.

Peux-tu détailler ce que fais cette ligne selon toi ?
Messages postés
35
Date d'inscription
mercredi 4 janvier 2012
Statut
Membre
Dernière intervention
12 septembre 2013

la condition la voici si la cellule est à 1 on incrémente j et on stocke la somme des cellules pour lesquelles on veut calculer la moyenne dans k.
If Feuil2.Range("G" & i).Value = 1 Then

j = j + 1 And k = Feuil2.Range("M" & i).Value + k

End If
et on divise k par j pour avoir la moyenne comme suit:
Feuil5.Range("B5").Value = Round((k / j), 2)
Messages postés
1823
Date d'inscription
vendredi 5 septembre 2008
Statut
Contributeur
Dernière intervention
24 avril 2020

Bonjour,

Comme le dit NHenry cette ligne n'a pas de sens :
j = j + 1 And k = Feuil2.Range("M" & i).Value + k


Donc j est toujours à 0 et cette instruction :
Feuil5.Range("B5").Value = Round((k / j), 2)

provoque une division par zéro d'où l'erreur 6.

Il suffit d'enlever le And et d'ecrire sur deux lignes :
j = j + 1 
k = Feuil2.Range("M" & i).Value + k


Cordialement,
Messages postés
35
Date d'inscription
mercredi 4 janvier 2012
Statut
Membre
Dernière intervention
12 septembre 2013

Je viens d'essayer dslé ça renvoie tjrs la même chose
Messages postés
30286
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2020
338
Bonsoir,

Lorsque ton programme "plante", que valent
k et j à ce moment là ?

Je pense que ton souci est au niveau de ROUND

debug.print "k = " & k 
debug.print "j = " & j 
Feuil5.Range("B5").Value = Round((k / j), 2)
 


Sachant que ton programme commence avec j=0
(d'où risque de division par Zéro comme te l'ont dit mes collègues..)
Qu'avant de faire j=j+1, tu testes avant si
Feuil2.Range("G" & i).Value = 1 Then

.. Donc si dès le départ, cette condition n'est pas vérifiée..ton J est toujours égal à 0.

Au pire.. ajoute une condition pour ne pas lancer le ROUND si J=0
if j>0 then
Feuil5.Range("B5").Value = Round((k / j), 2)
else
Debug.print "J = 0 "
End if


Cordialement,
Jordane
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
le code montré, corrigé comme dit, ne peut que marcher.
Encore faut-il que les données lues soient telles que j soit augmenté de 1
Tout donne à penser que tel n'est pas le cas. Et si j = 0, ma foi ===>> dépassement de capacité !
Messages postés
30286
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2020
338
Dix minutes Trop tard Ucfou ^^ je lui ai déjà expliqué lol
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bon...
toutes ces petites mésaventures disparaîtraient en utilisant tout bêtement WorkSheetFunction.Average, à appliquer à une plage (appelons-là toto) constituée des cellules à retenir pour le calcul de cette moyenne.
On la constitue tout bêtement à l'aide de ton expression conditionnelle et de la méthode Union.
Suffit alors de vérifier si toto n'est pas Nothing et d'en calculer la moyenne titi ainsi :
if not toto is nothing, then titi = WorkSheetFunction.Average(toto)

Au boulot.
Messages postés
30286
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2020
338
Bonsoir,
En fait, il existe même un Moyenne.si )> AverageIf

Sub MoyenneSI()
On Error Resume Next
MoySi = WorksheetFunction.AverageIf(Columns(7), 1, Columns(13))
If Err <> 0 Then
        MsgBox "Erreur"
    Else
        MsgBox MoySi
    End If
End Sub



PS:même si je sais que certains n'aiment pas utiliser : "On Error Resume Next"
Messages postés
30286
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2020
338
Allez, une petite dernière méthode...

En utilisant du SommeProd (de façon légèrement détournée)
car dans le cas où vous seriez en Excel 2000 / XP / 2003 , la fonction AverageIf n'existe pas il me semble..

Sub MoyenneSiViaSommeprod()
 Plage1 = "G1:G10"
 Plage2 = "M1:M10"
Mosi = Application.Evaluate("SUMPRODUCT((" & Plage1 & " = 1)*(" & Plage2 & "))/SUMPRODUCT((" & Plage1 & " = 1)*(1))")
Debug.Print Mosi
End Sub