do...loop

99 utilisateurs inconnus
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : do...loop
 
Plus d'informations

me revoila encore....
 
j'ai un tableau excel.. encore 1.... du style :  
 
A          B   ..    D        E         F  ...      I       J  
43 <> 23-oct <>  3 <> 1440 <> 497 <> 43 <> 32%
43 <> 24-oct <>  3 <> 1440 <> 596        
....
 
la colonne A correspond à la semaine correspondant à la date en colonne B
je voudrais faire une moyenne... sur les semaines.
je voudrais faire une boucle tant que ... faire.... sinon.... fintantque !!
je n'arrive pas bien à finir ma boucle, je n'ai pas bien compris l'aide de VBA et c'est pour cela que je me tourne vers vous !
 

Code :
  1. '============== calcul de la moyenne
  2. Dim stme As Integer      ' somme Tme
  3. Dim sto As Integer       ' somme To
  4. Dim n As Integer         ' numeros de la dernière ligne
  5. Dim p As Integer
  6. Dim week_dern As Integer ' numeros de la dernière semaine
  7. Dim ws As Worksheet
  8. Set ws = Worksheets("selva" )
  9. '// on initialise
  10. stme = 0
  11. sto = 0
  12. ' // n est le n° de la dernière ligne des dates
  13. n = ws.Range("A1" ).End(xlDown).row
  14. p = n
  15. ' // n° de la dernière semaine enregistré
  16. week_dern = ws.Range("I1" ).End(xlDown).Value
  17. Debug.Print " dernière semaine : " & week_dern
  18. Do      ' // les nouvelles valeurs implanté sont dans la même semaine
  19.     While Cells(p, 1) = week_dern
  20.     stme = stme + Cells(p, 6).Value
  21.     sto = sto + Cells(p, 5).Value
  22.     p = p - 1
  23.     Exit Do
  24.         ' // les nouvelles valeurs implanté sont dans une nouvelle semaine
  25.         ' on inscrit la dernière semaine dans la ligne suivante, colonne I
  26.     ws.Cells(n + 1, 9) = ws.Range("A1" ).End(xlDown).Value
  27.         ' et on recommence... car la semaine était deja peu etre entamé
  28.     week_dern = ws.Range("I1" ).End(xlDown).Value
  29.     p = n
  30.     Do While Cells(p, 1) = week_dern
  31.     stme = stme + Cells(p, 6).Value
  32.     sto = sto + Cells(p, 5).Value
  33.     p = p - 1
  34.     Exit Do
  35. Loop
  36. Debug.Print "stme : " & stme
  37. Debug.Print "sto : " & sto
  38. '//calcul du TRG (colonne J)
  39. ws.Cells(n + 1, 10).Value = stme / sto


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.

zeb
Profil : Modérateur libre
Plus d'informations

M'enfin, pourquoi ces Exit Do ?
Tout ce qui est entre les lignes 27 à 37 ne sera jamais exécuté !

 

Il y a une subtile différence entre Do .. Exit Do .. Loop, Do While .. Loop et Do .. Loop While. Il s'agit de savoir si on entre au moins une fois dans la boucle et quand et comment on en sort. Dans ton cas, j'écrirais plutôt Do .. Loop While [:spamafote]

 

Etudie ce bout de code :

Code :
  1. Dim c_frst As Range
  2. Dim c_last As Range
  3. Dim c_curr As Range
  4. Dim w_prev As Integer
  5. Dim w_curr As Integer
  6. dim sum    As Integer
  7. ' // On va parcourir la colonne B qui contient les dates
  8. Set c_frst = Range("B1" )
  9. Set c_last = Range("B1" ).End(xlDown)
  10. ' // Initialisation
  11. w_prev = DatePart("ww", c_frst.Value)
  12. sum    = 0
  13. ' // Parcours
  14. For Each c_curr In Range(c_frst, c_last)
  15.    
  16.     ' // Calcul de la semaine à la volée
  17.     w_curr = DatePart("ww", c_curr.Value)
  18.     If w_curr = w_prev Then
  19.         ' // on va additionner la colonne F (=B+3)
  20.         sum = sum + c_curr.Offset(0, 3).Value
  21.     Else
  22.         ' // Rupture !!!!!
  23.         Debug.Print "Semaine " & w_prev & " - Somme : " & sum
  24.         ' // Reinit       
  25.         w_prev = w_curr
  26.         sum    = c_curr.Offset(0, 3).Value
  27.     End If   
  28. Next


Message édité par zeb le 06-11-2007 à 16:09:48

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
zeb
Profil : Modérateur libre
Plus d'informations

Bon. J'ai oublié d'utiliser Do While......

 

On recommence :

Code :
  1. Dim c_frst As Range
  2. Dim c      As Range
  3. Dim w_prev As Integer
  4. Dim w_curr As Integer
  5. dim sum    As Integer
  6. ' // Initialisation
  7. Set c  = Range("B1" )
  8. w_prev = DatePart("ww", c.Value)
  9. sum    = 0
  10. ' // Parcours
  11. Do 
  12.     w_curr = DatePart("ww", c.Value)
  13.     If w_curr = w_prev Then       
  14.         sum = sum + c_curr.Offset(0, 3).Value
  15.     Else
  16.         ' // Rupture !!!!!
  17.         Debug.Print "Semaine " & w_prev & " - Somme : " & sum
  18.         ' // Reinit       
  19.         w_prev = w_curr
  20.         sum    = c_curr.Offset(0, 3).Value
  21.     End If
  22.     Set c = c.Offset(1, 0)
  23. Loop While c.Text <> ""
  24. ' // Dernière Rupture !!!!!
  25. Debug.Print "Semaine " & w_prev & " - Somme : " & sum


Message édité par zeb le 06-11-2007 à 16:08:14

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
zeb
Profil : Modérateur libre
Plus d'informations

T'ai-je dit que cela s'appelait une boucle avec rupture ?
;)


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Il y a aussi le « While <condition> ... Wend » comme syntaxe de boucle (histoire de perdre un peu plus les débutants).

zeb
Profil : Modérateur libre
Plus d'informations

NAAAAN. Ca c'est du Basic de 1982 !
Présent pour des soucis de rétro-compatibilité.
 
Douloupe et Fornecste, picétoo :o


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

ok, merci ZEb, après des petites corrections (pour prouver que je relie et pour lui faire faire ce que je voulais), voici le resultat :

Code :
  1. Sub moyenne()
  2. Dim c_frst As Range
  3. Dim c      As Range
  4. Dim w_prev As Integer
  5. Dim w_curr As Integer
  6. Dim sum_to    As Integer
  7. Dim sum_tme   As Integer
  8. ' // Initialisation
  9. Set c = Range("B2" )                 ' cellule B2 : date...  (car en B1 : legende)
  10. w_prev = DatePart("ww", c.Value)    ' correspond au n° de la semaine de la date en "B2"
  11. sum_to = 0
  12. sum_tme = 0
  13. ' // Parcours
  14. Do
  15.     w_curr = DatePart("ww", c.Value)
  16.     If w_curr = w_prev Then
  17.         sum_to = sum_to + c.Offset(0, 3).Value    ' colonne E : TO
  18.         sum_tme = sum_tme + c.Offset(0, 4).Value    ' colonne F : Tme
  19.     Else
  20.         ' // Rupture !!!!!
  21.         Debug.Print "Semaine " & w_prev & " - TO : " & sum_to
  22.         Debug.Print "Semaine " & w_prev & " - Tme : " & sum_tme
  23.         Debug.Print "Semaine " & w_prev & " - TRG : " & sum_tme / sum_to
  24.         ' // Reinit
  25.         w_prev = w_curr
  26.         sum_to = c.Offset(0, 3).Value
  27.         sum_tme = c.Offset(0, 4).Value
  28.     End If
  29.     Set c = c.Offset(1, 0)
  30. Loop While c.Text <> ""
  31. ' // Dernière Rupture !!!!!
  32. Debug.Print "Semaine " & w_prev & " - TO : " & sum_to
  33. Debug.Print "Semaine " & w_prev & " - Tme : " & sum_tme
  34. Debug.Print "Semaine " & w_prev & " - TRG : " & sum_tme / sum_to
  35. End Sub


bon, c'est jolie, au lieu du debug.print, je mettrais la bonne case ou il faut l'imprimer... ok
ce programme va a chaque fois refaire tout les calculs... je plein l'ordi !! lol  quand meme pas...
je cherche encore et je renvoie apres, mais mon idée d'origine, dans les calculs, c'est bien ce que tu me propose Zeb, mais dans la recherche :
2 tableau (sur le meme onglet) 1 pour les date journalière, 1 pour les semaine)
on regarde la dernière semaine = a
on regarder la dernière date et sa semaine correspondante = b
si a<>b: on note le n° de la semaine et le calcul du TRG (ligne 26) à la suites des autres semaines
si a=b : on recalcul le TRG de la semaine a et on note la nouvelle valeur..

 

maintenant que c'est clair pour moi (et j'espère pour vous), je vous réecris dès que j'ai trouvé.. en restant à l'ecoute... :)


Message édité par loic_akela le 07-11-2007 à 10:38:52

---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
Plus d'informations

arghh... bon... voila deja ce que j'ai pondu...

Code :
  1. Dim w_dern As Integer
  2. Dim week_cour As Range
  3. Dim w_cour As Integer
  4. Dim sum_to As Integer
  5. Dim sum_tme As Integer
  6. ' // Initialisation
  7.         ' dernière semaine enregistré
  8. w_dern = Worksheets("selva" ).Range("I2" ).End(xlDown).Value  'entier
  9. Debug.Print " derniere semaine enrgt " & w_dern
  10.         'dernière date enregistré
  11. Set week_cour = Worksheets("selva" ).Range("B2" ).End(xlDown)  'date
  12. sum_to = 0
  13. sum_tme = 0
  14. ' // Parcours
  15. Do
  16.     w_cour = DatePart("ww", week_cour.Value)
  17.     If w_cour = w_dern Then
  18.         sum_to = sum_to + week_cour.Offset(0, 3).Value    ' colonne E : TO
  19.         sum_tme = sum_tme + week_cour.Offset(0, 4).Value    ' colonne F : Tme
  20.     Else
  21.         ' // Rupture !!!!!
  22.         Debug.Print "Semaine " & w_cour & " - TRG : " & sum_tme / sum_to
  23.         ' // Reinit
  24.         w_dern = w_cour
  25.         sum_to = week_cour.Offset(0, 3).Value
  26.         sum_tme = week_cour.Offset(0, 4).Value
  27.     End If
  28.     Set week_cour = week_cour.Offset(-1, 0)
  29. Loop While w_dern - 1 = DatePart("ww", week_cour.Value) ' je m'arrete quand j'ai vérifier la semaine avant dernière
  30. ' // Dernière Rupture !!!!!
  31. Debug.Print "Semaine " & w_cour & " - TRG : " & sum_tme / sum_to
  32. End Sub


J'ai un depassement de capacité ligne 25.... je suis pas d'accord !! Ce n'est pas de si gros chiffres !!
pourtant, je dois pas etre loin... je trouve pas l'erreur bete....
help me please :(


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
zeb
Profil : Modérateur libre
Plus d'informations

Et si tu nous donnais les valeurs de sum_tme et de sum_to au moment du dépassement de capacité ? :sarcastic:
 
Tu utilises des entiers courts signés de 16 bits (Integer), compris entre -32768 et 32767. Ce n'est pas beaucoup.
 
Et tu te permets de faire une division réelle ( 3 / 2 = 1.5 ) au lieu d'une division entière ( 3 \ 2 = 1, reste 1 ).
 
Passe tes sum_xx en Single (32 bits, 7 chiffres significatifs), Double (64 bits, 15 chiffres significatifs) voire en Decimal (112 bits, 29 chiffres significatifs !).
 
Et révise ton manuel d'informatique au chapique analyse numérique :ange:


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

normalement :  
0<sum_tme<5000 et 0<sum_to<7200
 
ensuite, je cherche bien a faire une division réelle : je cherche une %
 
j'ai rajouté un debug.print entre la ligne 22 et 23....
 
mais je suis désoler, aucune valeur ne s'affiche dans la fenetre d'execution (a part le debug de la ligne 10 :) )


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
zeb
Profil : Modérateur libre
Plus d'informations

Rhoooooooooooooooooooooooooooooooooooooo !!!
 
Essaie le programme suivant :

Code :
  1. Dim t As Balloon
  2. Assistant.On = True
  3. Set t = Assistant.NewBalloon
  4. t.Animation = 11
  5. t.Button = 1
  6. t.Heading = StrReverse("noitinuP" )
  7. t.Text = StrReverse(".siof eniahcorp al ruop " & vbCr & """.oréz rap oréz resivid sap siod en eJ""" & vbCr & " siof 001 sareipoc em uT" )
  8. t.Show
  9. Assistant.Visible = False
  10. Set t = Nothing
  11. Assistant.On = False


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

euh... t'es sur d'etre dans le bon sujet ?


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
zeb
Profil : Modérateur libre
Plus d'informations

Voui.... :whistle: Tu l'as essayé mon bout de code au moins ?


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

euh... non :), en général, je lie et j'essaye de comprendre avant d'essayer.. j'ai rien compris !! donc, je te posais une question inocente...
il sert a quoi ton code ?
 
pour info sur un message plus haut, j'ai essayer avec SIngle et Double.. toujours le meme probleme : depacement de capacité !!


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
Futur papa very happy !!
Plus d'informations

division par zéro...


---------------
C'est une fille ! D(ad)-day - 4 semaines
---
Nouvelle config: Q6600 - Asus P5Q Pro  - 4Go de OCZ DDRII PC8500 - HD4850 512Mo -  Iiyama  ProLite B2403WS -B1
MEMBRE DU GROUPUSCULE DES AVATARS EN COLÈRE [:fraye@idn:5]
zeb
Profil : Modérateur libre
Plus d'informations

frodon1» Pas tout à fait. :o Sinon, le message serait Erreur d'exécution '11': Division par zéro. et non pas Erreur d'exécution '6': Dépassement de capacité.. Mais ce n'est pas loin ;)
 
loic_akela» ... Essaie mon p***** de bout de code. :whistle:


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Bien vue.. c honteux de diviser par zeros !!
en revanche, j'ai des resultats loufoque... (le programme ne plante pas, mais les valeurs qu'il me donne ne sont pas bonne...)
 
je vous renvoie une correction si je m'en sort, mais je suis tj preneur d'idées...


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
zeb
Profil : Modérateur libre
Plus d'informations

Et mes 100 lignes ?

 

Le problème est dans l'initialisation je pense. On ne doit pas commencer par une rupture. Donc il faut que la premier condition soit vraie (w_cour = w_dern).


Message édité par zeb le 07-11-2007 à 17:53:13

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

merci pour le programme ZEB !! tres marrant !!
"je ne divise pas par zeros"^100, ca te va ?
 
j'ai trouver mon erreur !!!! j'ai (encore) honte !!
"j'ai honte, je suis etourdis"^101
 
je me suis trompé quand j'ai reporté les dates... donc la "dernière date enregistré" etait une semaine bien enterieur !!!
 
désoler !!
Je renverais mon programme (si ca vous tente), quand j'aurais remplacé les debug.print par les "ecris moi ca au bonne endroit !"


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
zeb
Profil : Modérateur libre
Plus d'informations