Boucle ki plante pour rien au 15e tour !!!

stidjeanmoulin Messages postés 29 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 29 avril 2003 - 24 avril 2003 à 22:54
stidjeanmoulin Messages postés 29 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 29 avril 2003 - 26 avril 2003 à 00:57
g écris un algorithme de tri pour une feuille excel (VBA):
c le truc le plus simple ki soi
voila le truc:
---------------------------------------------------------------------
dim Feuille as String
Sub Tri(ByVal Feuille As String)
' Tri Macro
Dim i As Integer 'indice de boucle
Dim Ligne As Variant 'variable auxiliaire de tri
' algorithme de tri par propagation du minimum dit tri bulle
For i = 2 To 9007
If Sheets(Feuille).Cells(i, 1) > Sheets(Feuille).Cells(i + 1, 1) Then
Ligne = Sheets(Feuille).Range(Cells(i, 1), Cells(i, 11))
Sheets(Feuille).Range(Cells(i, 1), Cells(i, 11)) = Sheets(Feuille).Range(Cells(i + 1, 1), Cells(i + 1, 11))
Sheets(Feuille).Range(Cells(i + 1, 1), Cells(i + 1, 11)) = Ligne
If i > 2 Then
i = i - 2
End If
End If
Next i
' Macro enregistrée le 24/04/2003 par Etienne Baguenier Desormeaux
End Sub
---------------------------------------------------------------------
:question) la boucle s'arete a i=15 et je ve juste savoir pourkoi :shock)

16 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 avril 2003 à 23:15
je trouves ca un peu louche ton i = i-2 mais bon , cote algorithmie , ca me semble correct ( perso , on m'a appris a placer activer un flag, si on applique une modif , et repeter la boucle (en vidant le flag!! ) tant que celui ci est a 1 en sortie : tant qu'on a une modif d'effectuee... ) mais bon , ton algo me semble bon...

autre chose qui a rien a voir , passe par des variables intermediares , plutot sque d'acceder tout le temps a Sheets(Feuille) , il s'agit d'une collection , c'est plus long d'acces que de piquer un pointeur vers la sheet en question

Set monSheet = Sheets(Feuille)

sui tu fais une boucle longue d'execution , (ici , c'est le cas !!!!! ) donne un peu la main a Windows : place un
Doevents dans ta boucle , ca permettera de laisser souffler un peu la boucle , et evitera de figer la fenetre...

ton programme se bloque ?? il te renvoie une erreur ??...
---------------------------------------------------------------
By Renfield

thomas_reynald@msn.com

Aucune touche n'a été bléssée lors de la saisie de ce texte..........
0
stidjeanmoulin Messages postés 29 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 29 avril 2003
24 avril 2003 à 23:46
le tri par propagation c comme ca non?
i=i-2 a cause du next i
sa fé i = i-1 en fait

sa marche comment ton flag?
sa fé koi exactement?
jen ai jamais entendu parlé ...

les variable oui mais feuille c deja une variable
enfin j penserais

le doevent[u/] il sert po car sa boucle po mé bon... je le mettrait ( on c jamis )

le probleme reste l'erreur d'execution '1004' erreur definie par l'aplication ou par l'objet ligne8(ligne=sheet...)
se serait du chinois je comprendrait pet'etre mieux? :question)
0
cs_rene38 Messages postés 1858 Date d'inscription samedi 29 juin 2002 Statut Membre Dernière intervention 17 octobre 2013 11
24 avril 2003 à 23:54
Bonsoir
Essaie ceci :

dim Feuille as String
Sub Tri(ByVal Feuille As String)
' Tri Macro
Dim i As Integer, j As Integer 'indices de boucles
Dim Ligne As Variant 'variable auxiliaire de tri
Dim S As Integer
' algorithme de tri par propagation du minimum dit tri bulle
For i = 9007 To 2 Step -1
S = 0
For j = 2 To i
If Sheets(Feuille).Cells(i, 1) > Sheets(Feuille).Cells(i - 1, 1) Then
Ligne = Sheets(Feuille).Range(Cells(i, 1), Cells(i, 11))
Sheets(Feuille).Range(Cells(i, 1), Cells(i, 11)) = Sheets(Feuille).Range(Cells(i - 1, 1), Cells(i - 1, 11))
Sheets(Feuille).Range(Cells(i - 1, 1), Cells(i - 1, 11)) = Ligne
End If
[Red]S = j
Next j
i = S[Red]
Next i
End Sub
0
cs_rene38 Messages postés 1858 Date d'inscription samedi 29 juin 2002 Statut Membre Dernière intervention 17 octobre 2013 11
24 avril 2003 à 23:56
Bonsoir
Essaie ceci :

dim Feuille as String
Sub Tri(ByVal Feuille As String)
' Tri Macro
Dim i As Integer, j As Integer 'indices de boucles
Dim Ligne As Variant 'variable auxiliaire de tri
Dim S As Integer
' algorithme de tri par propagation du minimum dit tri bulle
For i = 9007 To 2 Step -1
S = 0
For j = 2 To i
If Sheets(Feuille).Cells(i, 1) > Sheets(Feuille).Cells(i - 1, 1) Then
Ligne = Sheets(Feuille).Range(Cells(i, 1), Cells(i, 11))
Sheets(Feuille).Range(Cells(i, 1), Cells(i, 11)) = Sheets(Feuille).Range(Cells(i - 1, 1), Cells(i - 1, 11))
Sheets(Feuille).Range(Cells(i - 1, 1), Cells(i - 1, 11)) = Ligne
End If
S = j
Next j
i = S
Next i
End Sub
0

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

Posez votre question
stidjeanmoulin Messages postés 29 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 29 avril 2003
25 avril 2003 à 00:01
sa a l'air bien en éfait mé je comprend po le :
i = S
"red" c parceke cette ligne s'affiche en rouge?lollll
a part sa merci
ps : si j'enleve le sa marche kan meme? :question)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 avril 2003 à 00:03
tu crée un Booleen
dim Flag as boolean

flag = true
while flag
doevents
Flag = False
     for i = ...........................

          if ... > ..... then
              flag = True
              ..............
              
           endif
     next i.............................
wend


cet facon de faire m'a ete apprise , mais me semble plus cohérente , car tu ne retri pas tous les elements enetre eux , avec ta facon , il existe surement des inversion qui ne sont pas effectuées , mais bon , la n'est pas la question !

plante - t'il toujours au meme endroit , les données de cette colonne sont elles remarquables ??

autre chose , tu utilise un for ......... donc , une boucle !!! tu m'a dis que l'usage du doevents etait pas necessaire parce que tu boucle pas , met le quand meme , ca aidera surement , bien que ca ne va pas resoudre ton pb !!!

je ne connais pas trop Excel , et ne peut pour le moment tester ton code .... quel est le type renvoyé par une ...Range... , tu devrai peut-etre utiliser un Set objet = Sheets... enfin , je sais pas , je te l'ai dis , Renfield et le VBA.........
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 avril 2003 à 00:07
dans la mesure ou tu ne modifies pas i dans ta boucle j , pourquoi utiliser S ??
0
cs_rene38 Messages postés 1858 Date d'inscription samedi 29 juin 2002 Statut Membre Dernière intervention 17 octobre 2013 11
25 avril 2003 à 00:12
Mea culpa : le S est inutile.
0
stidjeanmoulin Messages postés 29 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 29 avril 2003
25 avril 2003 à 00:19
ok merci
ton tri c un tri bulle ossi c sur?
c marant il resemble po a celui kon a vu en cour d'un otre coté g perdu le cour... :blush)

c d balises de kel langage entre crochet? (sorti de l'html et de vb ou je rame deja comme un porc l'informatik et moi sa fé 3ou4 ... et sa g jamais entendu parler)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 avril 2003 à 00:24
lol , c'est bien du tri a bulles , la facon dont je l'ai apprise , mais bon , on a vu ca en algo , sur du Pascal........

les balises sont propres a VbFrance ! , ca permet de mettre un peu de styles dans tes msgs ...
0
stidjeanmoulin Messages postés 29 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 29 avril 2003
25 avril 2003 à 08:48
si j'enlève le "S" je met :
..........
next j
i=j-1
next i
...........

:question)
0
stidjeanmoulin Messages postés 29 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 29 avril 2003
25 avril 2003 à 09:28
pour les variables
je pe mettre:
Set LF1(feuille as string,i as integer)=sheets(feuille).range(cells(i,1),cells(i,11))
:question)

STID JeanMoulin
0
stidjeanmoulin Messages postés 29 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 29 avril 2003
25 avril 2003 à 09:31
pour les variables
je pe mettre:
Set LF1(feuille as string,i as integer)=sheets(feuille).range(cells(i,1),cells(i,11))
 
:question)

ou je déclare un type ?

STID JeanMoulin
0
cs_rene38 Messages postés 1858 Date d'inscription samedi 29 juin 2002 Statut Membre Dernière intervention 17 octobre 2013 11
25 avril 2003 à 09:55
Exact.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 avril 2003 à 00:54
Ca me semble mieux , en effet , mais il doit bien exister un type a cette variable .... regardes ce que renvoie un Range...
-----------------------------------------------------------------------
By Renfield

thomas_reynald@msn.com

Aucune touche n'a été bléssée lors de la saisie de ce texte..........
0
stidjeanmoulin Messages postés 29 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 29 avril 2003
26 avril 2003 à 00:57
range c de type variant

:) STID JeanMoulin :)
0
Rejoignez-nous