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 If

La 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 i

Elle 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 Double

Je 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 i

J'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 1Colonne 2Colonne 3Colonne 4Colonne 5Colonne 6Colonne 7
301
200
30-1
302
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

7somme-si.xlsm (20.99 Ko)

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

Rechercher des sujets similaires à "probleme boucle"