VBA: compteur conditionnel

Résolu
Matthieu221 Messages postés 10 Date d'inscription vendredi 4 novembre 2022 Statut Membre Dernière intervention 8 août 2023 - 3 août 2023 à 18:15
Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 - 8 août 2023 à 10:29

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 

7 réponses

Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 931
3 août 2023 à 19:01

Bonjour 

en l'état 41


0
Matthieu221 Messages postés 10 Date d'inscription vendredi 4 novembre 2022 Statut Membre Dernière intervention 8 août 2023
3 août 2023 à 19:20

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

0
Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 931
3 août 2023 à 19:29

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


0
Matthieu221 Messages postés 10 Date d'inscription vendredi 4 novembre 2022 Statut Membre Dernière intervention 8 août 2023
3 août 2023 à 19:48

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

0

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

Posez votre question
Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 931
3 août 2023 à 19:58

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 .

Avec ton code oui


0
Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 931
Modifié le 4 août 2023 à 07:26

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.


0
Matthieu221 Messages postés 10 Date d'inscription vendredi 4 novembre 2022 Statut Membre Dernière intervention 8 août 2023
4 août 2023 à 10:39

yes j'avais vu ! merci ta modif  marche parfaitement et est parfaitement logique  . Merci pour ton aide ! 

Bonne journée 

Matthieu

0
Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 931 > Matthieu221 Messages postés 10 Date d'inscription vendredi 4 novembre 2022 Statut Membre Dernière intervention 8 août 2023
4 août 2023 à 10:50

De rien

Pense à marquer le sujet résolu avec les 3 points en bas de ton premier message 

0
Matthieu221 Messages postés 10 Date d'inscription vendredi 4 novembre 2022 Statut Membre Dernière intervention 8 août 2023 > Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024
7 août 2023 à 17:17

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

0
Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 931 > Matthieu221 Messages postés 10 Date d'inscription vendredi 4 novembre 2022 Statut Membre Dernière intervention 8 août 2023
7 août 2023 à 20:15

Heu....

J'ai pas compris...

Peux tu donner les valeurs d'entrée qui amènent à ce résultat incorrect ?

0
Matthieu221 Messages postés 10 Date d'inscription vendredi 4 novembre 2022 Statut Membre Dernière intervention 8 août 2023 > Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024
8 août 2023 à 10:19

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

0
mariam-j Messages postés 1038 Date d'inscription mercredi 9 mars 2022 Statut Membre Dernière intervention 28 avril 2024
4 août 2023 à 09:34

Bonjour,

Un compteur, c'est une variable qu'on initialise à 0 avant la boucle

Et qu'on incrément (+1) à chaque tour de boucle

0
Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 931
4 août 2023 à 10:19

Bonjour 

oui et non.

Un for, comme ici peut très bien faire l'affaire.


PS comme tu aimes bien faire remarquer à d'autres qu'ils ont fait d'horribles fautes, je me permets de te signaler que le nom commun incrément n'est pas un verbe. Il manque un e pour que cela le soit....

0
mariam-j Messages postés 1038 Date d'inscription mercredi 9 mars 2022 Statut Membre Dernière intervention 28 avril 2024 > Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024
4 août 2023 à 12:48

Evidement que c'est une lettre fantôme due à une frappe clavier trop légère .

Va-tu me demander l'accent sur le: "E" ?

0