Problème sur une boucle
Bonjour à tous,
J'étais venue demander de l'aide sur le forum pour optimiser plusieurs If statement que j'avais à faire. On m'avait donnée un super solution qui fonctionnait parfaitement, mais en la testant, j'ai une erreur que je ne comprends pas qui remonte.
A l'origine, les multiples If statement étaient ainsi :
If ThisWorkbook.Worksheets("compta").Cells(1, 1) = 30 Then
m30 = m30 + Range("H1").Value
End If
If ThisWorkbook.Worksheets("compta").Cells(2, 1) = 30 Then
m30 = m30 + Range("H2").Value
End If
If ThisWorkbook.Worksheets("compta").Cells(3, 1) = 30 Then
m30 = m30 + Range("H3").Value
End If
If ThisWorkbook.Worksheets("compta").Cells(4, 1) = 30 Then
m30 = m30 + Range("H4").Value
End If
If ThisWorkbook.Worksheets("compta").Cells(5, 1) = 30 Then
m30 = m30 + Range("H5").Value
End If
If ThisWorkbook.Worksheets("compta").Cells(6, 1) = 30 Then
m30 = m30 + Range("H6").Value
End If
If ThisWorkbook.Worksheets("compta").Cells(7, 1) = 30 Then
m30 = m30 + Range("H7").Value
End If
If ThisWorkbook.Worksheets("compta").Cells(8, 1) = 30 Then
m30 = m30 + Range("H8").Value
End IfLa solution qui m'avait gentiment été proposé est celle-ci :
Derligne = Range("A" & rows.count).End(xlup).row
For i = 1 to Derligne
If ThisWorkbook.Worksheets("compta").Cells(i, 1) = 30 Then
m30 = m30 + Range("H" & i).Value
End If
Next iElle fonctionne nickel, mais de temps à autre, la valeur retournée est totalment incorrect. Par exemple, lorsque la valeur devrait être 5, j'obtiens un 13341.
J'ai essayé de trifouiller la déclaration de mes variables pour voir si ca aide, mais sans succès. Elles sont ainsi :
Dim m30 As Long
Dim w30 As Long
Dim Derligne As Double
Dim i As DoubleJe suis un peu perdu sur ce qui pourrait clocher, si vous avez des idées ?
Bien cordialement,
Christophe
Bonjour
Et en ajoutant m30=0 avant For i ?
Mais quel est l'intérêt de parcourir toute la colonne juste pour incrémenter m30 ?
Un simple COUTIF suffirait
Bonjour Chris,
J'ai ajouté m30=0 avant For i ici :
Derligne = Range("A" & rows.count).End(xlup).row
m30 = 0
For i = 1 to Derligne
If ThisWorkbook.Worksheets("compta").Cells(i, 1) = 30 Then
m30 = m30 + Range("H" & i).Value
End If
Next iJ'ai laissé tourner quelques heures, et ca ne fonctionne toujours pas :/
L'intéret de parcourir la colonne est qu'il y a plusieurs valeurs à tester dans le code d'origine, selon le nombre de ligne. Donc la solution était de :
1. Parcourir les lignes pour connaitre le nombre de test à faire (nombre de ligne)
2. Additionner les valeurs en colonne H si la valeur en colonne 1 est égale à 30
Par exemple :
| Colonne 1 | Colonne 2 | Colonne 3 | Colonne 4 | Colonne 5 | Colonne 6 | Colonne 7 |
| 30 | 1 | |||||
| 20 | 0 | |||||
| 30 | -1 | |||||
| 30 | 2 | |||||
| 50 | -3 |
La macro est censée verifier si dans la colonne 1 la valeur est 30, si oui, prendre la valeur correspondant en colonne 7. Puis l'additionner à la valeur suivante (ici elle "sauterait" la valeur 20 car différent de 30) donc ajouter -1 (correspondant au 30 suivant) (- 1 + 1 =0).
Puis l'additionner à la suivante correspondant à 30 (ici 2); donc -1+1+2 = 2
Et ne pas prendre la valeur 50 car différent de 30.
Dites moi si c'est assez clair ou si vous souhaitez plus d'explication :)
Merci infiniment
RE
SUMIFS suffirait et un tableau structuré au lien d'une plage serait souhaitable
Le problème vient d'un référencement insuffisant des objets : Derligne est calculé on ne sait sur quelle feuille et on ne sait à quelle feuille appartient la colonne H
3 exemples de codes ci-joint
Bonjour
Pourquoi créer un autre fil alors que vous en avez un d'ouvert sur le même sujet ?
Suite de ce fil ?? --> https://forum.excel-pratique.com/excel/macro-ne-fonctionne-pas-lorsque-la-fenetre-est-reduite-175077
Vous n'avez pas fait les corrections et 78chris vous fait d'ailleurs les mêmes remarques
Hello,
@78Chris, merci pour votre aide, j'ai bien fait les modifications que vous m'avez conseillé, et je laisse tourner un peu voir si ca fonctionne :)
@Dan, je pensais que les problèmes étaient différents, je vais marquer le sujet précédent comme résolu.
Bien à vous,
Christophe