Se connecter avec
S'enregistrer | Connectez-vous

do...loop

Dernière réponse : dans Programmation

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 !

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

Autres pages sur : loop

Lassé par la pub ? Créez un compte
Expert Programmation

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

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

On recommence :
  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.  
  7. ' // Initialisation
  8. Set c = Range("B1")
  9. w_prev = DatePart("ww", c.Value)
  10. sum = 0
  11.  
  12. ' // Parcours
  13. Do
  14. w_curr = DatePart("ww", c.Value)
  15. If w_curr = w_prev Then
  16. sum = sum + c_curr.Offset(0, 3).Value
  17. Else
  18. ' // Rupture !!!!!
  19. Debug.Print "Semaine " & w_prev & " - Somme : " & sum
  20. ' // Reinit
  21. w_prev = w_curr
  22. sum = c_curr.Offset(0, 3).Value
  23. End If
  24. Set c = c.Offset(1, 0)
  25. Loop While c.Text <> ""
  26.  
  27. ' // Dernière Rupture !!!!!
  28. Debug.Print "Semaine " & w_prev & " - Somme : " & sum

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

arghh... bon... voila deja ce que j'ai pondu...
  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.  
  7. ' // Initialisation
  8. ' dernière semaine enregistré
  9. w_dern = Worksheets("selva").Range("I2").End(xlDown).Value 'entier
  10. Debug.Print " derniere semaine enrgt " & w_dern
  11. 'dernière date enregistré
  12. Set week_cour = Worksheets("selva").Range("B2").End(xlDown) 'date
  13.  
  14. sum_to = 0
  15. sum_tme = 0
  16.  
  17. ' // Parcours
  18. Do
  19. w_cour = DatePart("ww", week_cour.Value)
  20. If w_cour = w_dern Then
  21. sum_to = sum_to + week_cour.Offset(0, 3).Value ' colonne E : TO
  22. sum_tme = sum_tme + week_cour.Offset(0, 4).Value ' colonne F : Tme
  23. Else
  24. ' // Rupture !!!!!
  25. Debug.Print "Semaine " & w_cour & " - TRG : " & sum_tme / sum_to
  26. ' // Reinit
  27. w_dern = w_cour
  28. sum_to = week_cour.Offset(0, 3).Value
  29. sum_tme = week_cour.Offset(0, 4).Value
  30. End If
  31. Set week_cour = week_cour.Offset(-1, 0)
  32. Loop While w_dern - 1 = DatePart("ww", week_cour.Value) ' je m'arrete quand j'ai vérifier la semaine avant dernière
  33.  
  34. ' // Dernière Rupture !!!!!
  35. Debug.Print "Semaine " & w_cour & " - TRG : " & sum_tme / sum_to
  36.  
  37. 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 :( 
Expert Programmation

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: 

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 :)  )
Expert Programmation

Rhoooooooooooooooooooooooooooooooooooooo !!!

Essaie le programme suivant :
  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

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é !!
Expert Programmation

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: 

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...
Expert Programmation

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).

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 !"
Expert Programmation

:sol: 

Cela s'appelle un "bug". Tu as supposé que tes dates étaient correctement reportées et tu n'as pas pris la peine de faire les contrôles nécessaires dans ton programme. Loi de Murphy oblige, bing. Pour une petite macro sous Excel, ce n'est pas bien grave. Dans une grosse application commerciale, un peu plus. Mais rassure-toi, si tu as jamais entendu parler de bug, c'est que c'est hélas monnaie courante.

Bienvenue dans le monde des développeurs :D 

encore un tout petit soucis...
si ma semaine n est déja comencé... je voudrais recalculer la moyenne avec les valeur qui arrive aujourd'hui.
donc pour cela il doit remplacer le résultat par le nouveau calculer
si ma semaine n vient de commencer, il faut qu'il ecrive sur la ligne suivante...
je pensais avoir trouvé... je pense pas que mon erreur soit enorme.... les première ligne marche... c'est vers la dernière boucle if... elle fait pas ce que je veux !!

et si il n'y a rien dans la colonne I, j'ai mis une petit boucle if en début de prog. Mais dans ce cas, j'ai une erreur dans le dernier else du programme !!

je remet tout le code :
  1. Dim week_dern As Range
  2. Dim w_dern As Integer
  3. Dim week_cour As Range
  4. Dim w_cour As Integer
  5. Dim sum_to As Double
  6. Dim sum_tme As Double
  7.  
  8. ' // Initialisation
  9. ' dernière semaine enregistré
  10. Set week_dern = Worksheets("selva").Range("I1").End(xlDown)
  11. w_dern = week_dern.Value
  12.  
  13. 'dernière date enregistré
  14. Set week_cour = Worksheets("selva").Range("B2").End(xlDown) 'date
  15. sum_to = 0
  16. sum_tme = 0
  17.  
  18. ' si aucune valeur n'est déjà en moyenne
  19. If w_dern = Null Then w_dern = w_cour
  20.  
  21. ' // Parcours
  22. Do
  23. w_cour = DatePart("ww", week_cour.Value)
  24. If w_cour = w_dern Then
  25. sum_to = sum_to + week_cour.Offset(0, 3).Value ' colonne E : TO
  26. sum_tme = sum_tme + week_cour.Offset(0, 4).Value ' colonne F : Tme
  27. Else
  28. ' // Reinit
  29. w_dern = w_cour
  30. sum_to = week_cour.Offset(0, 3).Value
  31. sum_tme = week_cour.Offset(0, 4).Value
  32. End If
  33. Set week_cour = week_cour.Offset(-1, 0)
  34. Loop While w_dern = DatePart("ww", week_cour.Value)
  35.  
  36. ' // inscrire le résultat dans la bonne case !
  37. If DatePart("ww", week_dern.Value) = Worksheets("selva").Range("B2").End(xlDown) Then
  38. week_dern = w_cour
  39. week_dern.Offset(0, 1) = sum_tme / sum_to
  40. Else: week_dern.Offset(1, 0) = w_cour
  41. week_dern.Offset(1, 1) = sum_tme / sum_to
  42. End If
Expert Programmation

Commentaires désagréables (Désolé :(  ) :
  1. Dim w_dern As Integer
  2. ..
  3. If w_dern = Null Then ..
Non. Ne pas confondre Null et 0.

Citation :
boucle if
M'enfin. Un if n'est pas une boucle.

  1. ' // dernière date enregistréE
  2. Set week_cour
M'enfin, si ce n'est pas une semaine mais une date, ne l'appelle pas week, appele-la date_cour !!!!!

If DatePart("ww", week_dern.Value) = Worksheets("selva" ).Range("B2" ).End(xlDown) Then

DatePart te renvoie un entier. Avec ww, cet entier est un numéro de semaine. End(xlDown) te renvoie un Range. Par défaut, il utilisera Range.Text. Dedans il y a une date je crois. Tu ne peux pas comparer une date et une semaine !!!!!
Expert Programmation

Dixit l'aide de VB :
Citation :
Null

Le mot clé Null est utilisé comme un sous-type Variant. Il indique qu'une variable ne contient aucune donnée valide.


La variable w_dern est dimensionnée comme un entier, donc ni comme un variant, ni comme une case (Range). Donc non.

Alors ta formule <<"8 nov. 2007" = 45>> ça marche maintenant ?

arrghhh... ce prg me casse les pieds. Soit il me marque la nouvelle valeur dans la case suivante, soit il me remmplace la valeur précédente. Le deuxième cas est bien, sauf quand on changeras de semaine... je commence a me perdre un peu... C'est plus dure que je ne pensais d'ecrire dans la bonne case...

bon, je simplifie...
j'ecris dans la case en dessous et si j'ai deux semaine identique, je supprime l'avant dernière et je remonte la valeur...

en revanche, pour la "petite" vérification... si aucune semaine n'est déja implanté... je sais pas encore.. le plus simple est d'admettre qu'une semaine au moin est implanté... mais c'est pas tres correcte !!

Tu me le rappeler effectivement !!

j'ai encore deux question questions...

d'abord sur les graphiques (peut tu regarder http://www.presence-pc.com/forum/ppc/Programmation/excel-taille-graphique-sujet-5359-1.htm#t36444)

sinon, j'ai un probleme : l'aide me dis que j'ai une "variable objet non def".... ligne 6
pourtant c'est bien définie... Surtout que mon programme marchait avant que je rajoute les lignes 3 et 4
  1. Dim ws As Worksheet
  2. TextBox2.Text = machine
  3. If machine = "SELVA" Then Set ws = Worksheets("selva")
  4. If machine = "ROBOLIX" Then Set ws = Worksheets("robolix")
  5. Dim dern_lign As Range
  6. Set dern_lign = ws.Range("B2").End(xlDown)
  7. ...
Expert Programmation

En entier le message d'erreur s'il te plaît. :o  Est-ce ce qui suit ?
Erreur d'exécution '91': Variable objet ou variable de bloc With non définie


Entre 5 et 6, ajoute ceci :
Debug.Print "ws devrait être un Worksheet mais : " & TypeName(ws)


Si le type de ws n'est pas Worksheet, c'est qu'il n'a pas été initialisé.
Il te manque soit une clause Else, soit une valeur par défaut.

Par principe, tes lignes 3 et 4 sont mal écrites : Je les refais :
  1. If machine = "SELVA" Then
  2. Set ws = Worksheets("selva" )
  3. Else
  4. If machine = "ROBOLIX" Then
  5. Set ws = Worksheets("robolix" )
  6. Else
  7. ......
Ou encore
  1. If machine = "SELVA" Then
  2. Set ws = Worksheets("selva" )
  3. ElseIf machine = "ROBOLIX" Then
  4. Set ws = Worksheets("robolix" )
  5. Else
  6. ......
Ou encore
  1. Select Case machine Of
  2. Case "SELVA" : Set ws = Worksheets("selva" )
  3. Case "ROBOLIX": Set ws = Worksheets("robolix" )
  4. .....
  5. Case Else: Err.Raise "Alerte !"
  6. End Select

escusez moi... j'ai trouvé mon erreur... encore une fois, j'ai honte.. maus bon... maintenant, ca marche !!

voici le code que j'avais mis :
  1. Dim ws As Worksheet
  2. TextBox2.Text = machine
  3. If machine = "SELVA" Then Set ws = Worksheets("selva")
  4. If machine = "ROBOLIX" Then Set ws = Worksheets("robolix")
  5. Dim dern_lign As Range
  6. Set dern_lign = ws.Range("B2").End(xlDown)
  7. ...

et en fait, l'erreur est ligne 2 !!!
il fallait mettre machine = textbox2.text !!!!

merci en tout cas pour les conseils.
J'ai bien changé dans mon code les lignes 3 et 4, pour que les principes soient bien appliqué !!

Encore un Do....loop

j'ai (encore) une instruction do..loop qui ne me donne... rien !!

  1. Dim machine As String
  2. Dim dern_jour As Worksheet
  3. '// machine
  4. machine = principal.ComboBox2.Text
  5. TextBox2.Text = machine
  6.  
  7. '// onglet
  8. Select Case machine
  9. Case "630T": Set dern_jour = Worksheets("630t")
  10. Case Else: Set dern_jour = Worksheets("350t") ' presse 350t
  11. End Select
  12.  
  13. '// date
  14. Set srce_d = dern_jour.Range("A2").End(xlDown)
  15. jour.Value = srce_d.Value + 1
  16.  
  17. '// trouver la bonne date pour mise a jour
  18. Dim n As Integer
  19. n = 0
  20. Do
  21. If jour.Value = dern_jour.Cells(15 + n, 11).Value Then
  22. Debug.Print "Jour : " & dern_jour.Cells(15 + n, 11).Value
  23. nbr_coup.Value = dern_jour.Cells(15 + n, 11).Offset(0, 4).Value
  24. Exit Do
  25. Else: n = n + 1
  26. End If
  27. Loop While n < 11

je m'explique :
jour est un textbox dans laquel est ecrit une date
nbr_coup est un textbox
les lignes 1 à 15 fonctionne, je vous ai déjà posé des questions, je l'ai tester, mon programme marche. mais j'en veux toujours plus... quand ce que je fais marche.. je continue en profondeur (je suis ch**** !!)

problematique :
entre les cellules k15 et k26, j'ai des dates, en face de ces dates, des valeurs.
je voudrais trouver, dans ce groupe de dates, celles qui corresponds à la date du textbox "jour" et une fois que je l'a trouver, je voudrais copier la valeur qui lui es associé dans le textbox "nbr_coup"

probleme :
vous aurez remarqué que j'ai mis un debug.print !! Quand j'ai dis que je ne voyait rien, c'est que ca ne "printais" rien et que mon textbox "nbr_coup" restait vierge.
je suppose que c'est une erreur bete... mais je la vois pas...
Je m'attend à un "roooo tu n'as pas honte..." et je copirais 100 fois ( :)  ) mais bon, on, j'ai pas honte ! mais j'ai quand meme envie de trouver !
Expert Programmation

Avant de rentrer plus avant dans ton code, quelques petites remarques :

  1. ' // Bien
  2. Do
  3. If ... Then
  4. ...
  5. Exit Do
  6. Else
  7. n = n + 1
  8. End If
  9. Loop While ...
Ce genre de code s'écrit plutôt comme ça :
  1. ' // Mieux
  2. Do
  3. If ... Then
  4. ...
  5. Exit Do
  6. End If
  7. n = n + 1
  8. Loop While ...


  1. ' // Bien
  2. n = 0
  3. Do
  4. ...
  5. If ... Then ... Exit Do
  6. ...
  7. n = n + 1
  8. Loop While n < 11
Ce genre de code s'écrit plutôt comme ça :
  1. ' // Mieux
  2. For n = 0 To 10
  3. ...
  4. If ... Then ... Exit For
  5. Next



Le mieux étant l'ennemi du bien, tu fais comme tu veux ;) 
Expert Programmation

Je mettrais le Debug.Print avant, entre tes lignes 20 et 21, par exemple :

  1. Do
  2. Debug.Print "Loop #" & n " - jour Value" & jour.Value & " - " & _
  3. "dern_jour Cell Address" & dern_jour.Cells(15 + n, 11).Address & " " & _
  4. "Cell Value >>" & dern_jour.Cells(15 + n, 11).Value & "<<"
  5. If ...

du style :
  1. For n = 15 To 26
  2. Debug.Print "Loop #" & n; " - jour Value" & jour.Value & " - " & _
  3. "dern_jour Cell Address" & dern_jour.Cells(n, 11).Address & " " & _
  4. "Cell Value >>" & dern_jour.Cells(n, 11).Value & "<<"
  5. If jour.Value = dern_jour.Cells(n, 11).Value Then 'a partir de K15
  6. Debug.Print "Jour : " & dern_jour.Cells(n, 11).Value
  7. nbr_coup.Value = dern_jour.Cells(n, 11).Offset(0, 4).Value
  8. Exit For
  9. end if
  10. Next

juste pour info tu avais oublié (merci de me tester !!) le end if dans la boucle for.. next que tu me proposais !!

je suppose que tu voulais la valeur du debug.print :
ARGGGGGGGGGGG
tu te souviens de notre amis "bug" !! le revoila ! satané non de non !!
encore des dates mal implanté !! mais c'est pas moi qui gère ces dates... sa me soule ! pourquoi il mette pas les bonne dates !!
Bon merci zeb... je suppose que l'erreur venait de là si tu n'as pas hurler en lisant mon programme.
Expert Programmation

Oublier End If... Non, non. VB est le pire langage qui soit :
If True Then MsgBox "If sur une ligne sans End If"

If True Then
MsgBox "If sur plusieurs lignes. End If nécessaire"
End If


Je n'ai pas vu de problème dans ton code. Mais je ne suis pas infaillible. Je soupçonnais tes données, d'où l'intérêt de les afficher avant le test.

Tu te souviens de ça, un peu plus haut :
Err.Raise "Alerte !"

c'est bon, le programme fonctionne...enfin je veux dire qu'il ne bugue pas !! mais il ne renvoie rien. je veux dire qu'il ne vas pas dans l'instruction If

voici le resultat du debug (de la ligne 2 à 4) :
Loop #15 - jour Value08/11/2007 - dern_jour Cell Address$K$15 Cell Value >>05/11/2007<<
....
Loop #18 - jour Value08/11/2007 - dern_jour Cell Address$K$18 Cell Value >>08/11/2007<<
....
Loop #26 - jour Value08/11/2007 - dern_jour Cell Address$K$26 Cell Value >>17/11/2007<<

au niveau du loop#18, le programme devrais s'arreter !!

A moins que... il faudrais peu etre que je rajoute un Cdate(..) quelques part, il doit inverser mois/jour c'est pour sa qu'il ne fait pas la suite des instructions !

et voila !!! ça marche !!

apres reflexion : ca ne amrche toujours pas... mais c'est déjà plus "jolie"

un peu dans le style du code ci dessus, je cherche à calcul pour toute les semaines présente, une somme de chiffre.
les jours et les chiffres sont dans les colonnes C et D
les semaines et les sommes dess chiffres sont dans les colonnes AA et AB

  1. Dim n_j As Integer
  2. Dim day_week As Integer
  3. Dim dern_week As Range
  4. Dim d_week As Integer
  5.  
  6. Dim ws_machine As Worksheet
  7.  
  8. Set ws_machine = Worksheets("machine")
  9. n_j = 1
  10.  
  11. Do
  12. day_week = DatePart("ww", ws_machine.Cells(n_j, 3).Value)
  13. Set dern_week = ws_machine.Range("AA2").End(xlDown)
  14. d_week = dern_week.Value
  15. If day_week = dern_week Then
  16. dern_week.Offset(0, 1) = dern_week.Offset(0, 1) + ws_machine.Cells(n_j, 4).Value
  17. Else: dern_week = dern_week.offet(1, 0)
  18. dern_week.Value = day_week
  19. dern_week.Offset(0, 1) = ws_machine.Cells(n_j, 4).Value
  20. End If
  21. n_j = n_j + 1
  22. Loop While ws_machine.Cells(n_j, 3) <> ""

et bien mon problème : j'ai une incompatibilité de type ligne 12... je ne comprends pas
Expert Programmation

Tu as encore des problèmes de dates mal foutues dans ta feuille ?

  1. Dim n_j As Integer
  2. Dim day_week As Integer
  3. Dim dern_week As Range
  4. Dim d_week As Integer
  5. Dim ws_machine As Worksheet
  6. Set ws_machine = Worksheets("machine" )
  7. n_j = 1
  8. Do
  9.  
  10. If Nit IsDate(ws_machine.Cells(n_j, 3).Value) Then
  11. MsgBox "Boudiou, qui m'a foutu autre chose qu'une date dans cette fichue cellule " & _
  12. ws_machine.Cells(n_j, 3).Address
  13. Stop
  14. End If
  15.  
  16. day_week = DatePart("ww", ws_machine.Cells(n_j, 3).Value)
  17. Set dern_week = ws_machine.Range("AA2" ).End(xlDown)
  18. d_week = dern_week.Value
  19. If day_week = dern_week Then
  20. dern_week.Offset(0, 1) = dern_week.Offset(0, 1) + ws_machine.Cells(n_j, 4).Value
  21. Else: dern_week = dern_week.offet(1, 0)
  22. dern_week.Value = day_week
  23. End If
  24. n_j = n_j + 1
  25. Loop While ws_machine.Cells(n_j, 3) <> ""

bon, déjà, j'ai oublié d'initialiser...
  1. '/ initialisation
  2. dern_week = ws_machine.Range("AA2")
  3. dern_week.Value = DatePart("ww", ws_machine.Range("C2").Value)
  4. dern_week.Offset(0, 1).Value = DatePart("ww", ws_machine.Range("D2").Value)

ca plante déjà !!
et flute de flute, mes dates sont bonnes... grrr vertu cardinal ou pas !!
et maintenant : variable objet ou variable de bloc with non définis !!

et mes dates sont bien !! (pour une fois)

ok, erreur completement stupide.... je remets "set".. mais j'ai encore un probleme... ligne 22.... encore une erreur defini par l'application ou par l'objet... je ne comprends pas tout....

  1. Dim n_j As Integer
  2. Dim day_week As Integer
  3. Dim dern_week As Range
  4. Dim d_week As Integer
  5. Dim ws_machine As Worksheet
  6. Dim sum_to As Integer
  7.  
  8. Set ws_machine = Worksheets("machine")
  9. n_j = 3
  10. sum_to = 0
  11.  
  12. '/ initialisation
  13. Set dern_week = ws_machine.Range("AA2")
  14. dern_week.Value = DatePart("ww", ws_machine.Range("C2").Value)
  15. dern_week.Offset(0, 1).Value = ws_machine.Range("D2").Value
  16.  
  17. sum_to = dern_week.Offset(0, 1).Value
  18. Debug.Print "<<---------------------------------debut-------------->>"
  19.  
  20. Do
  21. day_week = DatePart("ww", ws_machine.Cells(n_j, 3).Value)
  22. Debug.Print "semaine en cour : " & day_week
  23. Set dern_week = ws_machine.Range("AA2").End(xlDown)
  24. d_week = dern_week.Value
  25. Debug.Print "semaine dernière : " & d_week
  26. If day_week = d_week Then
  27. sum_to = sum_to + ws_machine.Cells(n_j, 4).Value
  28. Else:
  29. Set dern_week = dern_week.Offset(1, 0)
  30. d_week = day_week
  31. sum_to = ws_machine.Cells(n_j, 4).Value
  32. End If
  33. Debug.Print "TO : " & sum_to
  34. n_j = n_j + 1
  35. Loop While ws_machine.Cells(n_j, 3) <> ""
  36.  
  37. 'rupture
  38. dern_week.Value = day_week
  39. dern_week.Offset(1, 0) = sum_to

je comprend pas.... mon programme marche... je n'ai plus l'erreur ligne 22, mais rien ne se passe.... que la procedure d'initialisation...
j'ai rajouter des debug.print entre les lignes.. mon sum_to ne semble servire à rien...
Mon débug.print fonctionne, en revanche, rien ne s'affiche sur excel ....

je dois avoir un probleme des la ligne 29 : d_week et day_week devrais etre egale !!

fenetre d'execution :
<<---------------------------------debut-------------->>
semaine en cour : 40
semaine calculer : 47
TO : 24
semaine en cour : 40
semaine calculer : 47
TO : 24
semaine en cour : 40
semaine calculer : 47
TO : 24
semaine en cour : 40
semaine calculer : 47
TO : 24
semaine en cour : 41
semaine calculer : 47
Expert Programmation

Pas tout compris non plus.
Par principe, retire de la boucle do loop tout ce qui est constant par rapport à cette boucle : les lignes 23 et 29(*) en ligne 19.
C'est d'ailleurs là qu'il faut se poser la question. Ne devraient-il pas être dans la boucle pour varier avec n_j ?



(*) N'importe quoi zeb :pfff: 

j'avais déjà enlevé la ligne 23 de la boucle avant ton message !!
grace à l'objet le plus utile en informatique, j'ai trouver mon erreur !!
mon programme marche !!! NA !
et le voici !! les changement sont apres le "else" et juste avant le "Loop"
  1. Dim n_j As Integer
  2. Dim day_week As Integer
  3. Dim dern_week As Range
  4. Dim d_week As Integer
  5. Dim ws_machine As Worksheet
  6. Dim sum_to As Integer
  7.  
  8. Set ws_machine = Worksheets("machine")
  9. n_j = 3
  10. sum_to = 0
  11.  
  12. '/ initialisation
  13. Set dern_week = ws_machine.Range("AA2")
  14. dern_week.Value = DatePart("ww", ws_machine.Range("C2").Value)
  15. dern_week.Offset(0, 1).Value = ws_machine.Range("D2").Value
  16.  
  17. sum_to = dern_week.Offset(0, 1).Value
  18.  
  19. Do
  20. day_week = DatePart("ww", ws_machine.Cells(n_j, 3).Value)
  21. d_week = dern_week.Value
  22. If day_week = d_week Then
  23. sum_to = sum_to + ws_machine.Cells(n_j, 4).Value
  24. Else:
  25. dern_week.Offset(1, 0).Value = day_week
  26. sum_to = ws_machine.Cells(n_j, 4).Value
  27. Set dern_week = dern_week.Offset(1, 0)
  28. End If
  29. n_j = n_j + 1
  30. dern_week.Offset(0, 1).Value = sum_to
  31. Loop While ws_machine.Cells(n_j, 3) <> ""


et pour info, l'objet le plus utile est le papier suivis de son compere le crayon !!
Expert Programmation

Papier/Crayon/Gomme :lol:  Imparable. Faut aussi avoir un cerveau :o 

(Je crois que ce n'est pas ce qui te manque le plus. S'il te manque quelque chose, jeune louveteau, c'est peut-être juste un peu d'assurance. Bientôt tu n'auras plus besoin de nous, tu passeras quand même aider les autres ;)  )
Lassé par la pub ? Créez un compte