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 !
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 !
'============== calcul de la moyenne
Dim stme As Integer ' somme Tme
Dim sto As Integer ' somme To
Dim n As Integer ' numeros de la dernière ligne
Dim p As Integer
Dim week_dern As Integer ' numeros de la dernière semaine
Dim ws As Worksheet
Set ws = Worksheets("selva")
'// on initialise
stme = 0
sto = 0
' // n est le n° de la dernière ligne des dates
n = ws.Range("A1").End(xlDown).row
p = n
' // n° de la dernière semaine enregistré
week_dern = ws.Range("I1").End(xlDown).Value
Debug.Print " dernière semaine : " & week_dern
Do ' // les nouvelles valeurs implanté sont dans la même semaine
While Cells(p, 1) = week_dern
stme = stme + Cells(p, 6).Value
sto = sto + Cells(p, 5).Value
p = p - 1
Exit Do
' // les nouvelles valeurs implanté sont dans une nouvelle semaine
' on inscrit la dernière semaine dans la ligne suivante, colonne I
ws.Cells(n + 1, 9) = ws.Range("A1").End(xlDown).Value
' et on recommence... car la semaine était deja peu etre entamé
week_dern = ws.Range("I1").End(xlDown).Value
p = n
Do While Cells(p, 1) = week_dern
stme = stme + Cells(p, 6).Value
sto = sto + Cells(p, 5).Value
p = p - 1
Exit Do
Loop
Debug.Print "stme : " & stme
Debug.Print "sto : " & sto
'//calcul du TRG (colonne J)
ws.Cells(n + 1, 10).Value = stme / sto
Autres pages sur : loop
Lassé par la pub ? Créez un compte
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] [:spamafote]]()
Etudie ce bout de code :
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] [:spamafote]](http://m.bestofmedia.com/sfp/design/usr/fr/smilies/3e/46/spamafote.gif)
Etudie ce bout de code :
Dim c_frst As Range Dim c_last As Range Dim c_curr As Range Dim w_prev As Integer Dim w_curr As Integer dim sum As Integer ' // On va parcourir la colonne B qui contient les dates Set c_frst = Range("B1") Set c_last = Range("B1").End(xlDown) ' // Initialisation w_prev = DatePart("ww", c_frst.Value) sum = 0 ' // Parcours For Each c_curr In Range(c_frst, c_last) ' // Calcul de la semaine à la volée w_curr = DatePart("ww", c_curr.Value) If w_curr = w_prev Then ' // on va additionner la colonne F (=B+3) sum = sum + c_curr.Offset(0, 3).Value Else ' // Rupture !!!!! Debug.Print "Semaine " & w_prev & " - Somme : " & sum ' // Reinit w_prev = w_curr sum = c_curr.Offset(0, 3).Value End If Next
Bon. J'ai oublié d'utiliser Do While......
On recommence :
On recommence :
Dim c_frst As Range Dim c As Range Dim w_prev As Integer Dim w_curr As Integer dim sum As Integer ' // Initialisation Set c = Range("B1") w_prev = DatePart("ww", c.Value) sum = 0 ' // Parcours Do w_curr = DatePart("ww", c.Value) If w_curr = w_prev Then sum = sum + c_curr.Offset(0, 3).Value Else ' // Rupture !!!!! Debug.Print "Semaine " & w_prev & " - Somme : " & sum ' // Reinit w_prev = w_curr sum = c_curr.Offset(0, 3).Value End If Set c = c.Offset(1, 0) Loop While c.Text <> "" ' // Dernière Rupture !!!!! 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 :
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...
Sub moyenne() Dim c_frst As Range Dim c As Range Dim w_prev As Integer Dim w_curr As Integer Dim sum_to As Integer Dim sum_tme As Integer ' // Initialisation Set c = Range("B2") ' cellule B2 : date... (car en B1 : legende) w_prev = DatePart("ww", c.Value) ' correspond au n° de la semaine de la date en "B2" sum_to = 0 sum_tme = 0 ' // Parcours Do w_curr = DatePart("ww", c.Value) If w_curr = w_prev Then sum_to = sum_to + c.Offset(0, 3).Value ' colonne E : TO sum_tme = sum_tme + c.Offset(0, 4).Value ' colonne F : Tme Else ' // Rupture !!!!! Debug.Print "Semaine " & w_prev & " - TO : " & sum_to Debug.Print "Semaine " & w_prev & " - Tme : " & sum_tme Debug.Print "Semaine " & w_prev & " - TRG : " & sum_tme / sum_to ' // Reinit w_prev = w_curr sum_to = c.Offset(0, 3).Value sum_tme = c.Offset(0, 4).Value End If Set c = c.Offset(1, 0) Loop While c.Text <> "" ' // Dernière Rupture !!!!! Debug.Print "Semaine " & w_prev & " - TO : " & sum_to Debug.Print "Semaine " & w_prev & " - Tme : " & sum_tme Debug.Print "Semaine " & w_prev & " - TRG : " & sum_tme / sum_to 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...
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
Dim w_dern As Integer
Dim week_cour As Range
Dim w_cour As Integer
Dim sum_to As Integer
Dim sum_tme As Integer
' // Initialisation
' dernière semaine enregistré
w_dern = Worksheets("selva").Range("I2").End(xlDown).Value 'entier
Debug.Print " derniere semaine enrgt " & w_dern
'dernière date enregistré
Set week_cour = Worksheets("selva").Range("B2").End(xlDown) 'date
sum_to = 0
sum_tme = 0
' // Parcours
Do
w_cour = DatePart("ww", week_cour.Value)
If w_cour = w_dern Then
sum_to = sum_to + week_cour.Offset(0, 3).Value ' colonne E : TO
sum_tme = sum_tme + week_cour.Offset(0, 4).Value ' colonne F : Tme
Else
' // Rupture !!!!!
Debug.Print "Semaine " & w_cour & " - TRG : " & sum_tme / sum_to
' // Reinit
w_dern = w_cour
sum_to = week_cour.Offset(0, 3).Value
sum_tme = week_cour.Offset(0, 4).Value
End If
Set week_cour = week_cour.Offset(-1, 0)
Loop While w_dern - 1 = DatePart("ww", week_cour.Value) ' je m'arrete quand j'ai vérifier la semaine avant dernière
' // Dernière Rupture !!!!!
Debug.Print "Semaine " & w_cour & " - TRG : " & sum_tme / sum_to
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
Et si tu nous donnais les valeurs de sum_tme et de sum_to au moment du dépassement de capacité ?
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
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
Rhoooooooooooooooooooooooooooooooooooooo !!!
Essaie le programme suivant :
Essaie le programme suivant :
Dim t As Balloon
Assistant.On = True
Set t = Assistant.NewBalloon
t.Animation = 11
t.Button = 1
t.Heading = StrReverse("noitinuP")
t.Text = StrReverse(".siof eniahcorp al ruop " & vbCr & """.oréz rap oréz resivid sap siod en eJ""" & vbCr & " siof 001 sareipoc em uT")
t.Show
Assistant.Visible = False
Set t = Nothing
Assistant.On = False
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 !"
"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 !"
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
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 :
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 :
Dim week_dern As Range Dim w_dern As Integer Dim week_cour As Range Dim w_cour As Integer Dim sum_to As Double Dim sum_tme As Double ' // Initialisation ' dernière semaine enregistré Set week_dern = Worksheets("selva").Range("I1").End(xlDown) w_dern = week_dern.Value 'dernière date enregistré Set week_cour = Worksheets("selva").Range("B2").End(xlDown) 'date sum_to = 0 sum_tme = 0 ' si aucune valeur n'est déjà en moyenne If w_dern = Null Then w_dern = w_cour ' // Parcours Do w_cour = DatePart("ww", week_cour.Value) If w_cour = w_dern Then sum_to = sum_to + week_cour.Offset(0, 3).Value ' colonne E : TO sum_tme = sum_tme + week_cour.Offset(0, 4).Value ' colonne F : Tme Else ' // Reinit w_dern = w_cour sum_to = week_cour.Offset(0, 3).Value sum_tme = week_cour.Offset(0, 4).Value End If Set week_cour = week_cour.Offset(-1, 0) Loop While w_dern = DatePart("ww", week_cour.Value) ' // inscrire le résultat dans la bonne case ! If DatePart("ww", week_dern.Value) = Worksheets("selva").Range("B2").End(xlDown) Then week_dern = w_cour week_dern.Offset(0, 1) = sum_tme / sum_to Else: week_dern.Offset(1, 0) = w_cour week_dern.Offset(1, 1) = sum_tme / sum_to End If
Commentaires désagréables (Désolé
) :
M'enfin. Un if n'est pas une boucle.
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 !!!!!
) :Non. Ne pas confondre Null et 0.
Dim w_dern As Integer .. If w_dern = Null Then ..
Citation :
boucle ifM'enfin, si ce n'est pas une semaine mais une date, ne l'appelle pas week, appele-la date_cour !!!!!
' // dernière date enregistréE Set week_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 !!!!!
Dixit l'aide de VB :
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 ?
Citation :
NullLe 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 !!
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
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
Dim ws As Worksheet
TextBox2.Text = machine
If machine = "SELVA" Then Set ws = Worksheets("selva")
If machine = "ROBOLIX" Then Set ws = Worksheets("robolix")
Dim dern_lign As Range
Set dern_lign = ws.Range("B2").End(xlDown)
...
En entier le message d'erreur s'il te plaît.
Est-ce ce qui suit ?
Entre 5 et 6, ajoute ceci :
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 :
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 :
Ou encore
If machine = "SELVA" Then
Set ws = Worksheets("selva" )
Else
If machine = "ROBOLIX" Then
Set ws = Worksheets("robolix" )
Else
......
Ou encore
If machine = "SELVA" Then
Set ws = Worksheets("selva" )
ElseIf machine = "ROBOLIX" Then
Set ws = Worksheets("robolix" )
Else
......
Select Case machine Of
Case "SELVA" : Set ws = Worksheets("selva" )
Case "ROBOLIX": Set ws = Worksheets("robolix" )
.....
Case Else: Err.Raise "Alerte !"
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 :
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é !!
voici le code que j'avais mis :
Dim ws As Worksheet
TextBox2.Text = machine
If machine = "SELVA" Then Set ws = Worksheets("selva")
If machine = "ROBOLIX" Then Set ws = Worksheets("robolix")
Dim dern_lign As Range
Set dern_lign = ws.Range("B2").End(xlDown)
...
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 !!
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 !
j'ai (encore) une instruction do..loop qui ne me donne... rien !!
Dim machine As String
Dim dern_jour As Worksheet
'// machine
machine = principal.ComboBox2.Text
TextBox2.Text = machine
'// onglet
Select Case machine
Case "630T": Set dern_jour = Worksheets("630t")
Case Else: Set dern_jour = Worksheets("350t") ' presse 350t
End Select
'// date
Set srce_d = dern_jour.Range("A2").End(xlDown)
jour.Value = srce_d.Value + 1
'// trouver la bonne date pour mise a jour
Dim n As Integer
n = 0
Do
If jour.Value = dern_jour.Cells(15 + n, 11).Value Then
Debug.Print "Jour : " & dern_jour.Cells(15 + n, 11).Value
nbr_coup.Value = dern_jour.Cells(15 + n, 11).Offset(0, 4).Value
Exit Do
Else: n = n + 1
End If
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 !
Avant de rentrer plus avant dans ton code, quelques petites remarques :
Le mieux étant l'ennemi du bien, tu fais comme tu veux
Ce genre de code s'écrit plutôt comme ça :
' // Bien Do If ... Then ... Exit Do Else n = n + 1 End If Loop While ...
' // Mieux Do If ... Then ... Exit Do End If n = n + 1 Loop While ...
Ce genre de code s'écrit plutôt comme ça :
' // Bien n = 0 Do ... If ... Then ... Exit Do ... n = n + 1 Loop While n < 11
' // Mieux For n = 0 To 10 ... If ... Then ... Exit For Next
Le mieux étant l'ennemi du bien, tu fais comme tu veux
du style :
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.
For n = 15 To 26
Debug.Print "Loop #" & n; " - jour Value" & jour.Value & " - " & _
"dern_jour Cell Address" & dern_jour.Cells(n, 11).Address & " " & _
"Cell Value >>" & dern_jour.Cells(n, 11).Value & "<<"
If jour.Value = dern_jour.Cells(n, 11).Value Then 'a partir de K15
Debug.Print "Jour : " & dern_jour.Cells(n, 11).Value
nbr_coup.Value = dern_jour.Cells(n, 11).Offset(0, 4).Value
Exit For
end if
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.
Oublier End If... Non, non. VB est le pire langage qui soit :
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 :
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
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 !!
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
et bien mon problème : j'ai une incompatibilité de type ligne 12... je ne comprends pas
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
Dim n_j As Integer Dim day_week As Integer Dim dern_week As Range Dim d_week As Integer Dim ws_machine As Worksheet Set ws_machine = Worksheets("machine") n_j = 1 Do day_week = DatePart("ww", ws_machine.Cells(n_j, 3).Value) Set dern_week = ws_machine.Range("AA2").End(xlDown) d_week = dern_week.Value If day_week = dern_week Then dern_week.Offset(0, 1) = dern_week.Offset(0, 1) + ws_machine.Cells(n_j, 4).Value Else: dern_week = dern_week.offet(1, 0) dern_week.Value = day_week dern_week.Offset(0, 1) = ws_machine.Cells(n_j, 4).Value End If n_j = n_j + 1 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
Tu as encore des problèmes de dates mal foutues dans ta feuille ?
Dim n_j As Integer Dim day_week As Integer Dim dern_week As Range Dim d_week As Integer Dim ws_machine As Worksheet Set ws_machine = Worksheets("machine" ) n_j = 1 Do If Nit IsDate(ws_machine.Cells(n_j, 3).Value) Then MsgBox "Boudiou, qui m'a foutu autre chose qu'une date dans cette fichue cellule " & _ ws_machine.Cells(n_j, 3).Address Stop End If day_week = DatePart("ww", ws_machine.Cells(n_j, 3).Value) Set dern_week = ws_machine.Range("AA2" ).End(xlDown) d_week = dern_week.Value If day_week = dern_week Then dern_week.Offset(0, 1) = dern_week.Offset(0, 1) + ws_machine.Cells(n_j, 4).Value Else: dern_week = dern_week.offet(1, 0) dern_week.Value = day_week End If n_j = n_j + 1 Loop While ws_machine.Cells(n_j, 3) <> ""
bon, déjà, j'ai oublié d'initialiser...
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)
'/ initialisation
dern_week = ws_machine.Range("AA2")
dern_week.Value = DatePart("ww", ws_machine.Range("C2").Value)
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....
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
Dim n_j As Integer Dim day_week As Integer Dim dern_week As Range Dim d_week As Integer Dim ws_machine As Worksheet Dim sum_to As Integer Set ws_machine = Worksheets("machine") n_j = 3 sum_to = 0 '/ initialisation Set dern_week = ws_machine.Range("AA2") dern_week.Value = DatePart("ww", ws_machine.Range("C2").Value) dern_week.Offset(0, 1).Value = ws_machine.Range("D2").Value sum_to = dern_week.Offset(0, 1).Value Debug.Print "<<---------------------------------debut-------------->>" Do day_week = DatePart("ww", ws_machine.Cells(n_j, 3).Value) Debug.Print "semaine en cour : " & day_week Set dern_week = ws_machine.Range("AA2").End(xlDown) d_week = dern_week.Value Debug.Print "semaine dernière : " & d_week If day_week = d_week Then sum_to = sum_to + ws_machine.Cells(n_j, 4).Value Else: Set dern_week = dern_week.Offset(1, 0) d_week = day_week sum_to = ws_machine.Cells(n_j, 4).Value End If Debug.Print "TO : " & sum_to n_j = n_j + 1 Loop While ws_machine.Cells(n_j, 3) <> "" 'rupture dern_week.Value = day_week 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
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"
et pour info, l'objet le plus utile est le papier suivis de son compere le crayon !!
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"
Dim n_j As Integer
Dim day_week As Integer
Dim dern_week As Range
Dim d_week As Integer
Dim ws_machine As Worksheet
Dim sum_to As Integer
Set ws_machine = Worksheets("machine")
n_j = 3
sum_to = 0
'/ initialisation
Set dern_week = ws_machine.Range("AA2")
dern_week.Value = DatePart("ww", ws_machine.Range("C2").Value)
dern_week.Offset(0, 1).Value = ws_machine.Range("D2").Value
sum_to = dern_week.Offset(0, 1).Value
Do
day_week = DatePart("ww", ws_machine.Cells(n_j, 3).Value)
d_week = dern_week.Value
If day_week = d_week Then
sum_to = sum_to + ws_machine.Cells(n_j, 4).Value
Else:
dern_week.Offset(1, 0).Value = day_week
sum_to = ws_machine.Cells(n_j, 4).Value
Set dern_week = dern_week.Offset(1, 0)
End If
n_j = n_j + 1
dern_week.Offset(0, 1).Value = sum_to
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 !!
Lassé par la pub ? Créez un compte
Tu l'as essayé mon bout de code au moins ?