Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1611 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  boucle sans fin

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

boucle sans fin

n°1732693
okianos
Posté le 16-05-2008 à 13:46:48  profilanswer
 

Bonjour,
 
 
J'ai écrit ce petit programme permettant d'effacer les cellules vides dans une colonne
 
 
Dim i As Double
 
For i = 3 To 9000
 
If IsEmpty(Cells(i, 2)) Then
       
    Cells(i, 2).Select
    Selection.Delete Shift:=xlUp
    i = i - 1
 
End If
 
Next i

 
 
Mais avec la remontée de l'indice (i = i -1)  le programme ne s'arrête plus (il efface toutes les lignes vides qui suivent mes données lorsqu'il arrive à la fin)
 
Merci d'avance pour votre aide

mood
Publicité
Posté le 16-05-2008 à 13:46:48  profilanswer
 

n°1732708
babasss
Posté le 16-05-2008 à 13:59:36  profilanswer
 

Quel est le but de ton programme :

  • Traiter une liste de la ligne 1 à la ligne 9000 actuel ?
  • Traiter une liste de la ligne 1 à la ligne 9000 futur ?


Car si la solution est :
1/ alors ton compteur est mal placé
2/ il faut que tu rajoutes un deuxième compteur qui ne fait l'opération que 65536 fois au max (nb de ligne dispo dans Excel (horrs 2007))


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
n°1732718
okianos
Posté le 16-05-2008 à 14:13:33  profilanswer
 

J'ai mis 9000 au hasard, je voudrais que le programme traite toutes mes données. Ca doit être ce que tu appelles les 9000 actuelles non ?
si par exemple elles vont jusqu'à la ligne 9000 et que je ne connais pas le nombre de cases vides, je mets mon compteur jusqu'à 9000
 
Mais je préfèrerais mettre un nombre de type double (j'ai beaucoup de données) pour que ça marche quelle que soit ma colonne et que le programme s'arrête lorsqu'il rencontre une case vide après laquelle il n'y a plus rien ...
Mais je ne sais pas trop si c'est possible, s'il peut "deviner" que c'est la dernière ligne non vide de la colonne
 
 
J'avais essayé un programme du style  
 
pour i allant de 1 à 9000
pour j allant de i à 9000
do ...
 
Ca m'évitait de mettre je j=j-1, donc le programme devrait terminer ... mais dans mon cas il ferait 9000 passages, niveau complexité c'est pas génial ...  

n°1732833
babasss
Posté le 16-05-2008 à 17:00:12  profilanswer
 

Alors ce que je te propose c'est de mettre une boucle infini (un peu dangeureux mais c'est pas mal) et de l'arrêter quand il y a plus de 5 lignes vides....
 

Code :
  1. Dim i As Double
  2. i = 1
  3. While 1
  4. If IsEmpty(Cells(i, 2)) Then
  5.   If IsEmpty(Cells(i + 1, 2)) And IsEmpty(Cells(i + 2, 2)) And IsEmpty(Cells(i + 3, 2)) And IsEmpty(Cells(i + 4, 2)) Then
  6.     End
  7.   End If
  8.   Cells(i, 2).Select
  9.   Selection.Delete Shift:=xlUp
  10.   'MsgBox i
  11.   i = i - 1
  12. End If
  13. i = i + 1
  14. Wend


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
n°1732846
okianos
Posté le 16-05-2008 à 17:19:18  profilanswer
 

Merci j'essaierai lundi, là je dois partir du travail
 
L'autre problème c'est qu'il peut y en avoir plus de 5 vides, je ne connais pas non plus le nombre de cases vides possibles, mais il peut être élevé, c'est aléatoire

n°1732850
babasss
Posté le 16-05-2008 à 17:28:23  profilanswer
 

okianos a écrit :

Merci j'essaierai lundi, là je dois partir du travail


 :ouch: à 17h30 ?

okianos a écrit :


L'autre problème c'est qu'il peut y en avoir plus de 5 vides, je ne connais pas non plus le nombre de cases vides possibles, mais il peut être élevé, c'est aléatoire


En remplacant la ligne : "If IsEmpty(Cells(i + 1, 2)) And IsEmpty(Cells(i + 2, 2)) And IsEmpty(Cells(i + 3, 2)) And IsEmpty(Cells(i + 4, 2)) Then"
par celle-ci : "If WorksheetFunction.CountA(Activesheet.Range(Cells(i, 2), Cells(65536, 2))) = 0 Then"


Message édité par babasss le 16-05-2008 à 17:28:45

---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
n°1733001
seniorpapo​u
Posté le 17-05-2008 à 07:50:54  profilanswer
 

Bonjour,
je n'ai pas tout compris, mais est-ce que cela peut répondre au problème:
 
Dim i As Double  
  Application.ScreenUpdating = False
For i = 9000 to 3 step -1
 
If IsEmpty(Cells(i, 2)) Then  
         
    Cells(i, 2).Select  
    Selection.Delete Shift:=xlUp  
     
 
End If  
 
Next i  
  Application.ScreenUpdating = true
 
 
 
Cordialement


Message édité par seniorpapou le 17-05-2008 à 07:54:46
n°1733664
okianos
Posté le 19-05-2008 à 13:21:00  profilanswer
 

Citation :

En remplacant la ligne : "If IsEmpty(Cells(i + 1, 2)) And IsEmpty(Cells(i + 2, 2)) And IsEmpty(Cells(i + 3, 2)) And IsEmpty(Cells(i + 4, 2)) Then"
par celle-ci : "If WorksheetFunction.CountA(Activesheet.Range(Cells(i, 2), Cells(65536, 2))) = 0 Then"


 
Ca a marché, merci beaucoup !
 

Citation :

:ouch: à 17h30 ?


 
Oui je suis stagiaire, j'ai la chance de pouvoir sortir tôt
 

Citation :

Bonjour,  
je n'ai pas tout compris, mais est-ce que cela peut répondre au problème:  
 
Dim i As Double  
  Application.ScreenUpdating = False  
For i = 9000 to 3 step -1  
   
If IsEmpty(Cells(i, 2)) Then  
         
    Cells(i, 2).Select  
    Selection.Delete Shift:=xlUp  
     
   
End If  
   
Next i  
  Application.ScreenUpdating = true  


 
Ca marche aussi, merci ! Le temps d'exécution est juste un peu plus long puisque je remplace 9000 par 65536 (je veux que ca marche pour n'importe quelle base de données)
 
Merci pour votre aide !

n°1733675
babasss
Posté le 19-05-2008 à 13:31:04  profilanswer
 

okianos a écrit :


Oui je suis stagiaire, j'ai la chance de pouvoir sortir tôt


Si tu es stagiaire, ca va. Je te dénoncerai pas...  :D


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
n°1733808
seniorpapo​u
Posté le 19-05-2008 à 16:08:04  profilanswer
 

Bonjour,
pour ne pas boucler sytématiquement sur 65536.
teste en remplaçant ton 65536 par :
 
 
dernièreligne = Cells(65536, 2).End(xlUp).Row  
For i = dernièreligne to 3 step -1  
 
.......
 
Ce qui te permet d'avoir la dernière cellule non vide.  
 
Valable si la 65536 est vide, si c'est le cas, il faut tester et mettre dernièreligne  = 65536 lorsqu'elle n'est pas vide.
 
Cordialement

mood
Publicité
Posté le 19-05-2008 à 16:08:04  profilanswer
 

n°1733809
Xxxaaavvv
Posté le 19-05-2008 à 16:12:35  profilanswer
 

au lieu de prendre 65536
 
autant utiliser la coordonnée de  

Code :
  1. ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row


qui donne la derniere cellule utilisée dans la feuille active
(au dela, la feuille est obligatoirement vide :) )


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  boucle sans fin

 

Sujets relatifs
images en bouclepage automatique dans une boucle
[Résolu][VB-Excel-Macro]Boucle qui ne boucle pas.[Résolu] Boucle For et condition if
Site qui sort des pages en boucleBOUCLE VBA EXCEL
[Batch] Problème de variable dans boucle forManipulation de chaine caractère par boucle
Bug? Ou j'ai raté quelque chose? Boucle for à résultats étranges...Macro avec boucle "For Each Feuille" pour une partie du nom
Plus de sujets relatifs à : boucle sans fin


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR