boucle sans fin

boucle sans fin - VB/VBA/VBS - Programmation

Marsh Posté le 16-05-2008 à 13:46:48    

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

Reply

Marsh Posté le 16-05-2008 à 13:46:48   

Reply

Marsh Posté le 16-05-2008 à 13:59:36    

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
Reply

Marsh Posté le 16-05-2008 à 14:13:33    

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

Reply

Marsh Posté le 16-05-2008 à 17:00:12    

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
Reply

Marsh Posté le 16-05-2008 à 17:19:18    

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

Reply

Marsh Posté le 16-05-2008 à 17:28:23    

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
Reply

Marsh Posté le 17-05-2008 à 07:50:54    

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
Reply

Marsh Posté le 19-05-2008 à 13:21:00    

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 !

Reply

Marsh Posté le 19-05-2008 à 13:31:04    

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
Reply

Marsh Posté le 19-05-2008 à 16:08:04    

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

Reply

Marsh Posté le 19-05-2008 à 16:08:04   

Reply

Marsh Posté le 19-05-2008 à 16:12:35    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed