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

eltigre85 Messages postés 35 Date d'inscription mercredi 4 janvier 2012 Statut Membre Dernière intervention 12 septembre 2013 - 12 sept. 2013 à 13:42
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 - 13 sept. 2013 à 02:08
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

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 sept. 2013 à 14:01
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

!!
0
eltigre85 Messages postés 35 Date d'inscription mercredi 4 janvier 2012 Statut Membre Dernière intervention 12 septembre 2013
12 sept. 2013 à 14:06
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 sept. 2013 à 14:10
tu n'as pas répondu à ma remarque concernant une ligne de code. Elle est incohérente !
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
12 sept. 2013 à 14:10
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eltigre85 Messages postés 35 Date d'inscription mercredi 4 janvier 2012 Statut Membre Dernière intervention 12 septembre 2013
12 sept. 2013 à 14:15
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)
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020
12 sept. 2013 à 18:07
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,
0
eltigre85 Messages postés 35 Date d'inscription mercredi 4 janvier 2012 Statut Membre Dernière intervention 12 septembre 2013
12 sept. 2013 à 18:24
Je viens d'essayer dslé ça renvoie tjrs la même chose
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
Modifié par jordane45 le 12/09/2013 à 18:58
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 sept. 2013 à 19:07
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é !
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
12 sept. 2013 à 19:22
Dix minutes Trop tard Ucfou ^^ je lui ai déjà expliqué lol
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 sept. 2013 à 21:03
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.
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
Modifié par jordane45 le 13/09/2013 à 01:28
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"
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
13 sept. 2013 à 02:08
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

0
Rejoignez-nous