Probleme d'incrémentation

Résolu
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008 - 13 mai 2008 à 15:58
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 - 14 mai 2008 à 09:55
Bonjour,

j'ai un problème avec une boucle. Quand je l'active elle ne s'arrête plus.

Je pense avoir un problème d'incrémentation mais je ne sais meme pas ce que cela veut dire.

Voici la boucle

Merci pour votre aide.

 Sub Corridor()


Dim i, k As Integer


For i = 1657 To 2963


    For k = 1 To 47


        While Cells(i - (30 * k), 2).Value > 0.5 * Cells((i - (4 * 360)), 2).Value And Cells(i - (30 * k), 2).Value < 1.5 * Cells((i -       (4 * 360)), 2).Value
       
        Cells(i, 3).Value = 19999
   
        Wend
       
        Cells(i, 3).Value = 8
   
    Next k
   
Next i
   
End Sub

18 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
14 mai 2008 à 09:41
Salut,
Non je pense que les cases vide sont justement lieés à ce que je te disais
Et pourquoi tu ne mets rien si la condition  If Cells(x).Value > 0.5 * Cells(y).Value Then se vérifie?

Donc que souhaite tu mettre si cette condition est vérifiée?
cela reprends mes intérrogations! nécessites tu un OR ou un AND dans ta condidtion IFEst ce aux moins une condition(<gras>OR)  ou les deux  (AND)</gras>

@+: Ju£i?n
Pensez: Réponse acceptée
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
13 mai 2008 à 16:04
Salut,
Pour la definition d'incrémentation, suffit de prendre un dictionnaire....

Ensuite le problème vient du fait que les valeurs de i  (Variant) et k (Integer) ne sont JAMAIS modifier dans ta boucle

Essaie de comprendre ce que fait exactement cette boucle

       While Cells(i - (30 * k), 2).Value > 0.5 * Cells((i - (4 * 360)), 2).Value And Cells(i - (30 * k), 2).Value < 1.5 * Cells((i - (4 * 360)), 2).Value
           Cells(i, 3).Value = 19999
       Wend , ----
[code.aspx?ID=41455 By Renfield]
Et tu comprendras RAPIDEMENT pourquoi elle ne se termine JAMAIS

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008
13 mai 2008 à 16:56
Ce que je comprends:
avant cette boucle il y a une boucle For i 1657 To 2963 puis For k 1 To 47

donc ça bloque i à 1657 et ça fait tourner ma boucle pour tous les k de 1 à 47 et ça passe à i=1658 etc...

AIDEZ MOI SVP...

Je veux bien réfléchir après coup mais le je suis en stage et j'ai une deadline d'ici quelques heures

merci
0
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008
13 mai 2008 à 16:59
je pense qu'i doit y avoir un k=k+1 et un i=i+1 à caler quelque part...

mais je pensais que la boucle For se chargeait de faire bouger mon i et mon k !
0

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

Posez votre question
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008
13 mai 2008 à 17:21
PLEASE HELP ME....
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
13 mai 2008 à 17:25
Re,
Oui bah c'est bon t'as deux minutes... j'ai un travail moi aussi.

QUE SOUHAITES TU FAIRE DANS CETTE BOUCLE EXACTEMENT

QUAND souhaites que la valeur de la cellule soit 19999 et quand souhaite tu qu'elle soit 8???

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008
13 mai 2008 à 17:34
loooolll

alors en gros il faut que pour chaque ligne i (de 1657 à 2963) le programme aille observer les 47 valeur avant ce i (espacées de 30 jours à chaque fois) qu'il me renvoie 19999 si mes deux conditions sont vérifiées pour ces 47 valeurs et 8 sinon.

Ensuite il faut qu'il prenne le i qui suit et qu'il refasse la meme chose et cela pour tous les i de 1657 à 2963.

Si tu souhaites d'autres infos n'hésites pas j'ai vraiment envi de comprendre ce qui j'ai oublié

MEEEEEEERRRCIIIIIIIII
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
13 mai 2008 à 18:16
Re,
Ok donc ce qu'il te faut c'est un IF pas un WHILE (qui est un autre TYPE de boucle!!!)

Essaie peu etre alors:
Sub Corridor()
Dim i As integer
Dim k As Integer

For i = 1657 To 2963
    For k = 1 To 47
        If Cells(i - (30 * k), 2).Value > 0.5 * Cells((i - (4 * 360)), _
          2).Value And Cells(i - (30 * k), 2).Value < 1.5 * Cells((i -(4 * _
          360)), 2).Value Then
            Cells(i, 3).Value = 19999
        Else
            Cells(i, 3).Value = 8
        End If
    Next k
   
Next i
   
End Sub, ----
(Coloration syntaxique automatique par Kenji)

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008
13 mai 2008 à 18:20
Merci pour ton aide

j'y avais deja pensé mais comment, à l'intérieur de la boucle k lui mettre... si ça remplit pas les conditions UNE SEULE FOIS alors mettre 8 et s'arrêter pour ce i

puis passer au i suivant etc...

Car la j'ai peur qu'avec ce code, pour chque i, cela ne prenne en compte que le dernier k tester...

moi il faut que si ça ne remplit pas les conditions une seule fois ça me mette 8

MERCI
0
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008
13 mai 2008 à 18:24
c comme un canal... si tu tapes les bornes ou que tu en sors ne serait ce qu'une fois  ça affiche 8 et ça s'arrete puis on passe au i d'après
0
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008
13 mai 2008 à 19:18
J'ai un petit peu changer le code, je pense qu'il est bon mais je n'est que des 19999 donc je me demande si je ne me suis pas trompé qqpart

Sub Corridor()
Dim i As Integer
Dim k As Integer


For i = 1657 To 2963
    For k = 1 To 47
   
        If Cells(i - (30 * k), 2).Value > 0.5 * Cells((i - (4 * 360)), 2).Value Then
         
        ElseIf Cells(i - (30 * k), 2).Value < 1.5 * Cells((i - (4 * 360)), 2).Value Then
         
        ElseIf Cells(i - (30 * k), 2).Value <> 8 Then
         
           
            Cells(i, 3).Value = 19999
       
        Else
           
            Cells(i, 3).Value = 8
           
        End If
    Next k
  
Next i
  
End Sub
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
13 mai 2008 à 21:54
Re,
Non vraiment, excuses moi mais j'ai du mal à cerner ce que tu souhaites faire.
Alors on va essayer de reprendre... QUE souhaitestu faire exactement?

Sois CLAIR s'il te plait, je ne voudrais passer X temps à te sortir les vers du nez (ne le prends pas mal).

Penses que le plus tu seras clair et précis dans l'énoncé de ton problème, le plus rapidement tu auras une réponse adéquate à ce souci

POURQUOI as tu eu besoin de modifier le code de départ?

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008
14 mai 2008 à 09:01
une base de données colonne A des dates, colonne B des valeurs

à partir de la 1657ème ligne il doit:

prendre la valeur en colonne B la retenir et aller la comparer à la valeur 30 lignes au dessus  et ce 47 fois...

  If Cells(i - (30 * k), 2).Value > 0.5 * Cells((i - (4 * 360)), 2).Value Then
          
  ElseIf Cells(i - (30 * k), 2).Value < 1.5 * Cells((i - (4 * 360)), 2).Value Then

> IL ME RETOURNE 19999

SI UNE DES DEUX CONDITIONS N'EST PAS RESPECTEE NE SERAIT-CE QU'UNE FOIS SUR LES 47 VALEURS ALORS CELA M'AFFICHE 8...

ENSUITE CELA DOIT DESCENDRE D'UNE LIGNE ET REPRODUIRE CELA JUSQUA LA LIGNE 2963.

PROBLEME: avec une simple boucle IF cela va marcher mais cela va faire les 47 tests et ne retenir que le dernier (sans s'arrêter et m'afficher 8 si une des conditions n'est pas respectée ne serait-ce qu'une fois... Il me faut une boucle IF du genre

IF.....

ELSEIF...

affiche 19999

ELSE

affiche 8 et s'arrête
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
14 mai 2008 à 09:14
Salut,
Et pourquoi tu ne mets rien si la condition  If Cells(x).Value > 0.5 * Cells(y).Value Then se vérifie?

Je vais faire un essaie pour voir si j'ai compris.

1-Tu souhaites mettre 19999 dans une cellule SI AU MOINS l'une des condidtions est BONNE? (remplacer AND par OR dans le premier code que je t'ai proposé)
2-Tu souhaites mettre 19999 dans la cellule si la valeur est comprise entre 0.5 * et 1.5* la cellule plus haut? (dans ce cas le code que je t'ai proposé devrait fonctionner)

En revanche si tu veux passer au i suivant dès que la cellule prends la valeur 8 utilise Exit For

3 - Essai peu etre
Sub Corridor()
Dim i As Integer
Dim k As Integer

   For i = 1657 To 2963
       For k = 1 To 47
           If Cells(i - (30 * k), 2).Value > 0.5 * Cells((i - (4 * 360)), 2).Value And Cells(i - (30 * k), 2).Value < 1.5 * Cells((i - (4 * 360)), 2).Value Then
               Cells(i, 3).Value = 19999
           Else
               Cells(i, 3).Value = 8
               Exit For
           End If
       Next k
     
   Next i
 
End Sub<hr />, ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008
14 mai 2008 à 09:23
YYEESS c'est EXITFOR qui me manquait

Je pense avoir le bon code mais j'ai un denrier problème: je n'ai que des 19999 qui s'affiche avec des trous de case vide. Dois je considérer que ce sont des 8??

Sub Corridor()
Dim i As Integer
Dim k As Integer


For i = 1657 To 2963

    For k = 1 To 47
   
        If Cells(i - (30 * k), 2).Value > 0.5 * Cells((i - (4 * 360)), 2).Value Then
         
        ElseIf Cells(i - (30 * k), 2).Value < 1.5 * Cells((i - (4 * 360)), 2).Value Then
         
         
            Cells(i, 3).Value = 19999
       
        Else
           
            Cells(i, 3).Value = 8
            Exit For
           
        End If
       
    Next k
  
Next i
  
End Sub
0
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008
14 mai 2008 à 09:45
OK en fait je croyais que ELSEIF était équivalent à AND...  (cf VBA pour les nuls...j'ai du mal comprendre)

je teste et te reviens

vraiment merci
0
cs_front33 Messages postés 30 Date d'inscription mercredi 7 mai 2008 Statut Membre Dernière intervention 22 août 2008
14 mai 2008 à 09:48
OK tout marche désormais

Merci pour ta patience

c'était mes réels premiers pas sur VBA

++
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
14 mai 2008 à 09:55
Re,
Pas de quoi l'important est d'être clair.
Content que tu y sois arriver et que cela fonctionne comme tu le voulais.
@+ Sur le forum

@+: Ju£i?n
Pensez: Réponse acceptée
0
Rejoignez-nous