VBA: compteur conditionnel
RésoluUtilisateur anonyme -
Bonjour à tous !
Ci dessous une formule qui marche très bien . Elle permet d'additionner des résultats dans la cellule cells(56,3) tant que cells (56,2) est < à 0 et tout ça pour un maximum de i = i to 40.
Mon souhait est le suivant : dans une cellule voisine (exemple cells(56,4)), je souhaite connaitre à quelle "i" la boucle s'est arrêtée mais je ne parviens pas à paramétrer le compteur.
Merci pour votre aide !
sub test()
For i = 1 To 40
a = WorksheetFunction.Small(Sheets("G.F. DE BREVES").Range("k10:k49"), i)
If Cells(56, 3) < Cells(56, 2) Then Cells(56, 3) = a + Cells(56, 3)
If Cells(56, 2) <= 0 Then Cells(56, 3) = 0
Next i
End Sub
Matthieu
- VBA: compteur conditionnel
- Excel compter cellule couleur sans vba - Guide
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
- Mkdir vba ✓ - Forum VB / VBA
- Dépassement de capacité vba ✓ - Forum Excel
7 réponses
Bonjour whismeril,
Non justement la boucle s'est arrétée des que la somme des opérations décrites sur la cells(53,3) a dépassé le montant de cellule (53,2) .
La boucle s'est arrétée des que la condition a été remplie et je voudrais savoir à quel 'i"particulier.
Merci
Matthieu
Le code ne fair pas s'arrêter la boucle, juste faire le calcul ou pas.
Donc i atteint 41.
Si tu veux que ça s'arrête, tu peux faire un truc comme ça (tapé de tête et vba n'est pas mon fort, il peut y avoir des boulettes)
sub test() For i = 1 To 40 a = WorksheetFunction.Small(Sheets("G.F. DE BREVES").Range("k10:k49"), i) If Cells(56, 2) <= 0 Then Cells(56, 3) = 0 Cells(56, 3) = a + Cells(56, 3) If Cells(56, 3) < Cells(56, 2) Then Exit for 'ici on sort de la boucle End if Next i Cells(56, 4) = i 'Affiche i qu'il vaille 41 ou moins End Sub
PS, pour yes prochains posts, merci d'utiliser la coloration syntaxique comme décrit là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code en choisissant basic
Merci ! Si j'ai bien compris ton raisonnement , le calcul s'arrete quand la condition est remplie mais la boucle elle, va continuer à tourner jusqu'à la fin meme si le resultat ne change pas .
J'essaye ta proposition demain
Merci d'avoir regardé !
Matthieu
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questioncalcul s'arrete quand la condition est remplie mais la boucle elle, va continuer à tourner jusqu'à la fin meme si le resultat ne change pas .
Avec ton code oui
Bonjour
j'ai écrit une boulette, à la ligne 11, c'est un > qu'il faut mettre (ou un >= ).
Enfin tel que j'ai compris ton code, à savoir dés que la somme dépasse Cells(56, 2), on s'arrête.
Par contre, je ne suis pas certain d'avoir, fait ce qu'il faut concernant le cas où Cells(56, 2) est inférieur à 0. Actuellement le résultat sera 0 + a.
Bonjour Whismeril,
Je reviens sur ton code de vendredi (que j'ai appliqué à ma macro ci dessous) . Et il y a un cas pour lequel il ne marche pas.
Je m'explique:
effectivement, la macro va me sortir le "i" demandé avec la fonction :
If Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(l, j) > 0 Then Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(l, j + 1) = i
Et le "end for""
SAUF (et je ne l'explique pas) : quand la valeur de la fonction petite valeur va être pour la première fois > 0, et se suffira à elle même pour répondre à la condition souhaitée cad, cells(l,j)> cells(l,j-1) . (pas besoin de sommer 2 "i" pour arriver au résuluat souhaité donc)
Dans le cas ou (et c'était le cas dans mon exemple de vendredi), la formule va devoir additionner au moins 2 petites valeurs >0 pour répondre à la condition cells(l,j)> cells(l,j-1) alors la , cela fonctionnera .
Ce sera peut être plus parlant:
1er c: cells(l,j-1)
2eme c: cells(l,j)
3eme c: cells(l,j+1)
typiquement le résultat de la "3eme c" de la 1er ligne qui est à 0, devrait être à 26 (NB: la 1er c = 1.0% et la 2eme c= 1.02% donc ce n'est pas égal) . En effet je dois attendre la 26eme itération pour que la condition cells(l,j)> cells(l,j-1) soit remplie sans avoir besoin de la sommer avec un autre "i">0
Merci à toi !
Sub stress_test_passif() Application.ScreenUpdating = False Workbooks.Open Filename:= _ "P:\Bureau\Audit Contrôle\Suivi des risques\tableau de bord\Portefeuille FIA sous gestion.xlsx" Windows("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Activate 'gf de breves For k = 1 To 32 For j = 3 To 61 Step 4 For i = 1 To 40 l = k + 52 If Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(l, j) = 0 Then Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(l, j + 1) = 0 a = WorksheetFunction.Small(Workbooks("Portefeuille FIA sous gestion.xlsx").Sheets(k).Range("k10:k49"), i) Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(l, j) = Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(l, j) + a If Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(l, j) >= Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(l, j - 1) Then Exit For End If If Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(l, j) > 0 Then Workbooks("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Sheets("marché secondaire inactif").Cells(l, j + 1) = i + 1 Next i Next j Next k Windows("suivi des augmentations de K + STRESS TEST PASSIF.xlsm").Activate Application.ScreenUpdating = True End Sub
ouais l'enfer d'écrire ça mes "i" qui sont donc compris entre 1 et 40, s'appliquent via la formule petitevaleur, sur une plage de cellules égales à 0 ou > à 0. si je vire mes 0, ta formule marche sans problème quelque soit le cas . par contre si je les laisse, évidemment les premières petites valeurs font ressortir tous mes 0 (c'est normal et ce n'est pas un problème ) mais dès que la 1er valeur > 0 est identifiée et qu'en plus la condition Cells(l,j) > Cells(l,j-1) est remplie, la boucle va évidemment s'arrêter mais elle va me compter i = 0 , alors que j'aurais du avoir toutes les fois ou le résultat de mes i = 0 + la 1er valeur positive. la ou la logique est curieuse c'est que si pour satisfaire cette condition Cells(l,j) > Cells(l,j-1) , il me faut 2 valeurs positives la formule marche sans problème là aussi . J'ai bidouillé un truc qui fonctionne pour corriger cela mais j'aimerai comprendre . Merci Matthieu