Problème avec une double boucle for..next et deux variables

trolllllus Messages postés 3 Date d'inscription mardi 15 décembre 2009 Statut Membre Dernière intervention 17 décembre 2009 - 15 déc. 2009 à 23:56
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 17 déc. 2009 à 08:06
Bonjour,

Novice en programmation, je rencontre un problème dans le code suivant.
Je cherche a réaliser la boucle sur i pour chaque valeur de j.

Private Sub CommandButton6_Click()
For j = 1 To 8761
For i = 10 To 38
If Sheets("Feuil1").Range("AN" & j).Value = Sheets("Feuil1").Range("B" & i).Value And Sheets("Feuil1").Range("G" & j).Value < Sheets("Feuil1").Range("C" & i).Value Then
Sheets("Feuil1").Range("AO" & i).Value = 0
End If
Next i
Next j
End Sub

Merci.

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
16 déc. 2009 à 00:04
Bonjour,

Je ne vois aucune erreur de syntaxe dans ton code et en conclus donc que tu n'as tout simplement pas le résultat attendu, mais comme on ne le connait pas, comment t'aider (à quoi faire qu'on ne sait pas ?) ?

Autre chose, s'il te plait : pense dorénavant (c'est TRES IMPORTANT) à ouvrir tes discussions VBA dans le thème adéquat, à savoir Langages dérivés / VBA (tu es ici sous le thème VB6 et non VBA). Merci d'y prêter attention dorénavant.


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 déc. 2009 à 00:08
Maintenant : comme tu n'as pas balisé ton code, on ne sait pas si ceci :

If Sheets("Feuil1").Range("AN" & j).Value = Sheets("Feuil1").Range("B" & i).Value And Sheets("Feuil1").Range("G" & j).Value < Sheets("Feuil1").Range("C" & i).Value Then


est sur deux lignes du fait du non balisage ou s'il est également sur deux lignes non séparées par un _ dans ton code ! (ce qui serait alors une erreur)
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
trolllllus Messages postés 3 Date d'inscription mardi 15 décembre 2009 Statut Membre Dernière intervention 17 décembre 2009
16 déc. 2009 à 00:44
Ca semble fonctionner en faite... c'est juste que le calcul est plutôt long (deux bonnes minutes), je pensais que les boucles tournaient en rond sans finir.

Y a pas une astuce qui permettrait d'aller plus vite? C'est vrai que ca fait un paquet de données a traiter quand même.

Merci pour tes réponses.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 déc. 2009 à 07:58
Bon...
Tu peux en accélérer l'exécution en économisant sur le temps d'affichage (assez gourmand).
Ajoute
Application.ScreeUpdationg = False

juste avant ta boucle For
et remets-le à True après le Next J (quand elle est donc terminée)

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 déc. 2009 à 08:09
Je vois par ailleurs que, dans ta boucje for i, tu risques de modifier 28 fois la cellule Sheets("Feuil1").Range("AO" & i), que tu mets= 0 lorsque certaines conditions sont réunies et ne touches pas dans les autres cas.
Il m'apparait dans ces conditions itutile de continuer à mouliner sur j lorsque les conditions sont réunies ...
Je te propose ceci :
Private Sub CommandButton6_Click()
  Application.ScreenUpdating = False 
  For j = 1 To 8761 
    For i = 10 To 38 
      If Sheets("Feuil1").Range("AN" & j).Value = Sheets("Feuil1").Range("B" & i).Value And Sheets("Feuil1").Range("G" & j).Value < Sheets("Feuil1").Range("C" & i).Value Then 
        Sheets("Feuil1").Range("AO" & i).Value = 0
        Exit For 
      End If 
   Next i 
Next j 

 Application.ScreenUpdating = True
End Sub 

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
16 déc. 2009 à 08:22
Bonjour,

La première chose à faire est de mettre un with:

with Sheets("Feuil1")
  For j = 1 To 8761 
    For i = 10 To 38 
      If .Range("AN" & j).Value = .Range("B" & i).Value And .Range("G" & j).Value < .Range("C" & i).Value Then 
        .Range("AO" & i).Value = 0
        Exit For 
      End If 
   Next i
end with 



thip
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 déc. 2009 à 08:36
Dans ta boucle For i, par ailleurs, tu obliges 28 fois à aller lire le contenu de 2 cellules définies par j
Ne le fais qu'une seule fois, ainsi :
Private Sub CommandButton6_Click()
  dim cond1 as string, cond2 as string ' <<<< ==== j'ai mis string car j'ignore le format.  Corrige en fonction 
  Application.ScreenUpdating  = False 
  For j = 1 To 8761 
    cond1 = Sheets("Feuil1").Range("AN" & j).Value 
    cond2 = Sheets("Feuil1").Range("G" & j).Value 
    For i = 10 To 38 
      If cond1 = Sheets("Feuil1").Range("B" & i).Value And cond2 < Sheets("Feuil1").Range("C" & i).Value Then 
        Sheets("Feuil1").Range("AO" & i).Value = 0
        Exit For 
      End If 
   Next i 
 Next j 
 Application.ScreenUpdating = True
End Sub 


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
16 déc. 2009 à 13:37
salut
je ne vois pas pourquoi tu fait "exit for" alors qu'il n'a pas préciser qu'il va y avoir un seule changement.
je te propose de laisser comme sa :
Private Sub CommandButton6_Click()
  dim j as long dim cond1 as string, cond2 as string ' <<<< ==== j'ai mis string car j'ignore le format.  Corrige en fonction 
j  = 1
while j <= 8761
    cond1 = Sheets("Feuil1").Range("AN" & j).Value 
    cond2 = Sheets("Feuil1").Range("G" & j).Value 
    For i = 10 To 38 
      If cond1 Sheets("Feuil1").Range("B" & i).Value And cond2 < Sheets("Feuil1").Range("C" & i).Value Then Sheets("Feuil1").Range("AO" & i).Value 0
doevents
   Next i
j = j +1
doevents 
wend 
End Sub 
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 déc. 2009 à 13:42
je ne vois pas pourquoi tu fait "exit for" alors qu'il n'a pas préciser qu'il va y avoir un seule changement


Tu devrais relire tout avec plus d'attention, Claiyah
Tu t'apercevrais alors qu'il ne modifie nla cellule que si .... et pas dans les autres cas ===>> donc : si modifiée à 0 ===>> pas la peine de continuer puisque pas de modification prévue en sens inverse .
Question d'analyse et de bonne compréhension et (surtout) de ne pas répondre sans cette analyse et sans cette compréhension ....
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
16 déc. 2009 à 13:59
je crois que c'est toi qui a mal compris
0
trolllllus Messages postés 3 Date d'inscription mardi 15 décembre 2009 Statut Membre Dernière intervention 17 décembre 2009
17 déc. 2009 à 01:17
Merci à tous pour vos réponses.
Pour clarifier le débat, en effet ma condition IF ne peut se produire au maximum qu'une seule fois sur les 28i. D'où l'intêret de mettre un END FOR si la condition est vrai (Si j'ai bien compris).
J'ai essayer les diverses solutions que vous me proposez, aussi interessantes soient-elle, mais la durée du calcul est toujours aussi long.

Je mets fortement en doute mon programme dans sa globalité car un simple algorythme tel que le suivant met également qqs minutes à s'executé....

For i = 1 to 8762
Range("A"&i).value = 1
next i

Si j'ouvre un nouveau classeur excel et une nouvelle Userform où je rentre celle-ci, la calcul s'execute en 3 secondes !!
Si vous avez des idées? je suis preneur.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 déc. 2009 à 08:06
Bon...
Dur d'y voir parfaitement clair sans avoir ton fichier xls.
Deux minutes pour si peu, c'est en effet très long...
Je me demande ce qui provoque cette lenteur.
Peut-être bien, dans ce cas, des formules de calculs liés aux cellules dont la valeur est modifiée ...

On va alors le savoir ;
ajoute, juste avant Application.ScreenUpdating = False :

Application.Calculation =  xlCalculationManual

et ajoute, juste après Application.screenUpdating = True :
Application.Calculation  = xlCalculationAutomatic

et fais-nous connaître la durée, après cette manoeuvre.

Si toujours pas satisfaisante, je chercherai alors à ne pas intervenir du tout pendant ta double-boucle, privilégiant in fine une mise à jour globale de tes cellules (via la construction d'une plage tremplin).
Fais-nous savoir d'abord ce que donne l'inhibition du calcul automùatique.

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Rejoignez-nous