Supprimer des lignes sous Excel

Supprimer des lignes sous Excel - VB/VBA/VBS - Programmation

Marsh Posté le 31-01-2009 à 21:48:37    

Bonsoir à tous,
 
Voila mon problème, J'aimerais supprimer toutes les lignes d'un tableau contenant une ou plusieurs cellules vides de la colonne A à la colonne P.  
 
Comment faire?
 
Merci d'avance pour votre aide?


Message édité par Elmoricq le 01-02-2009 à 17:49:24
Reply

Marsh Posté le 31-01-2009 à 21:48:37   

Reply

Marsh Posté le 01-02-2009 à 17:46:24    

Bonsoir,
tu peux t'inspirer de cela:
http://forum.hardware.fr/hfr/Progr [...] 4715_1.htm
Cordialement
 
edit: précision, modifie le titre de ton post et mets le en minuscules... tu vas te faire "disputer" par un modérateur.


Message édité par seniorpapou le 01-02-2009 à 17:48:47
Reply

Marsh Posté le 01-02-2009 à 17:49:47    

Titre modifié : les titres tout en majuscules sont interdits. Merci de lire les règles de la section Programmation.

Reply

Marsh Posté le 01-02-2009 à 22:27:08    

Désolé pour le titre, je suis nouveau je ne savais pas.
Par contre le programme que tu m'as conseillé n'est pas tout fait ce que je veux.
j'aimerais supprimer toute la ligne qui contient une cellule vide.
 
 
Merci encore pour votre aide

Reply

Marsh Posté le 01-02-2009 à 22:41:38    

J
Je me suis peut etre mal expliqué, voici une explication qui sera peut etre plus clair :
'ai une liste de données dans la première feuille excel et j'aimerais créer une macro qui a chaque fois qu'il voit apparaître une cellule vide dans une matrice , il supprimer la ligne entiere. Je suis débutant et je n'y arrive pas.  

Reply

Marsh Posté le 02-02-2009 à 11:41:59    

Salut,
 
un truc comme ca devrait marcher :
 

Code :
  1. Sub test()
  2. Const LIGNE_DEBUT As Long = 1
  3. Const LIGNE_FIN As Long = 6
  4. Const COLONNE_DEBUT As Long = 1
  5. Const COLONNE_FIN As Long = 3
  6. Dim supprime_ligne As Boolean
  7. Dim ligne As Long
  8. Dim colonne As Long
  9. Dim nb_suppr As Long
  10. nb_suppr = 0
  11. 'on boucle sur les lignes
  12. For ligne = LIGNE_DEBUT To LIGNE_FIN
  13.     'par defaut cette ligne n'est pas supprimable
  14.     supprime_ligne = False
  15.     'on boucle sur les colonnes
  16.     For colonne = COLONNE_DEBUT To COLONNE_FIN
  17.    
  18.         ' on selectionne la cellule pour visualiser
  19.         ' a virer si beaucoup de donnees a traiter
  20.         Cells(ligne, colonne).Select
  21.         'on teste si la cellule est vide
  22.         If Cells(ligne, colonne).Value = "" Then
  23.             supprime_ligne = True
  24.         End If
  25.     Next colonne
  26.     ' si la ligne est supprimable, on le fait
  27.     If supprime_ligne Then
  28.         Rows(ligne & ":" & ligne).Select
  29.         Selection.Delete Shift:=xlUp
  30.         nb_suppr = nb_suppr + 1
  31.         'bidouille pour rester sur la meme ligne
  32.         ligne = ligne - 1
  33.         If (ligne + nb_suppr) >= LIGNE_FIN Then Exit For
  34.     End If
  35. Next ligne
  36. End Sub


 
Tu regles les constantes du debut et c'est tout.
Dans ton cas, si tu veux aller jusqu'a la colonne P, COLONNE_FIN doit valoir 16.
 
Ca n'est surement pas tres propre, mais ca fonctionne.
 
v.


Message édité par vonm le 02-02-2009 à 11:45:15
Reply

Marsh Posté le 02-02-2009 à 20:19:51    

Bonsoir
 
J'ajouterais juste en debut de code un  
Application.ScreenUpdating = False
puis a la fin du code un  
Application.ScreenUpdating = True
 
Ca masquera ce que fait excel, et donc ca gagne du temps a l'execution.
 
De plus, la ligne 27 ne sert a rien, sinon perdre du temps a l'execution.
Pareil pour les lignes 36-37, un  
Rows(ligne & ":" & ligne).Delete Shift:=xlUp
 
Apres le dernier If ne sert pas a grand chose (vu que le If precedent ne fait que valider un test sur le contenu de la cellule), mais c'est pas le souci, ca fonctionne.
 
Cordialement


Message édité par SuppotDeSaTante le 02-02-2009 à 20:20:12

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 02-02-2009 à 22:21:24    

ben comme je l'ai ecrit dans le commentaire le select de la cellule sert essentiellement a visualiser ou on en est.
 
par contre je ne saisis pas ton commentaire sur le dernier if.
 
Il me semble interessant car il evite de tourner en permanence sur les lignes vides en fin de tableau.
 
v.

Reply

Marsh Posté le 03-02-2009 à 09:37:41    

Salut, encore une remarque
For ligne = LIGNE_DEBUT To LIGNE_FIN
faire plutot For ligne = LIGNE_FIN To LIGNE_DEBUT Step -1
ce qui evitera qqch d'ignoble ( voire interdit par certains compilateurs ) en programmation : la gestion de variable de boucle

Reply

Marsh Posté le 03-02-2009 à 09:41:52    

kiki29 a écrit :

Salut, encore une remarque
For ligne = LIGNE_DEBUT To LIGNE_FIN
faire plutot For ligne = LIGNE_FIN To LIGNE_DEBUT Step -1
ce qui evitera qqch d'ignoble ( voire interdit par certains compilateurs ) en programmation : la gestion de variable de boucle


 
exact !
 
la solution est effectivement plus elegante.
 
v.

Reply

Marsh Posté le 03-02-2009 à 09:41:52   

Reply

Marsh Posté le 03-02-2009 à 10:16:10    

vonm a écrit :

ben comme je l'ai ecrit dans le commentaire le select de la cellule sert essentiellement a visualiser ou on en est.
 
par contre je ne saisis pas ton commentaire sur le dernier if.
 
Il me semble interessant car il evite de tourner en permanence sur les lignes vides en fin de tableau.
 
v.


 
Tout simplement car tu definis une variable a true, seulement si la cellule est vide. Ensuite tu testes cette variable, et si elle est true tu fais ta suite du prog. Ca ne sert a rien de tester si elle est true, puisque tu le definis comme tel plus haut, et surtout tu ne fais rien si c'est le cas inverse. Il faut donc mettre le dernier If en lieu et place de celui qui teste si la cellule est vide.
 
        'on teste si la cellule est vide
        If Cells(ligne, colonne).Value = "" Then
           Rows(ligne & ":" & ligne).Select
           Selection.Delete Shift:=xlUp
           nb_suppr = nb_suppr + 1
           'bidouille pour rester sur la meme ligne
           ligne = ligne - 1
           If (ligne + nb_suppr) >= LIGNE_FIN Then Exit For
        End If
    Next colonne
 
Je ne critiquais pas le moins du monde hein ;)
 
Cordialement


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 03-02-2009 à 10:25:21    

T'inquiete pas, si j'avais peur de la critique je ne mettrais pas de code en ligne !!!  :)  
 
Par contre, je ne suis pas d'accord avec ta remarque car il s'agit de ce que j'ai fait naturellement au debut.
Mais si on regarde bien le code qui est inclu dans la boucle sur les colonnes, je vais supprimer la ligne mais je ne vais pas recommencer a la premiere colonne.
Je continue ou j'en suis et donc si j'etais sur une des dernieres colonnes, il y a une chance que je rate une cellule vide.
 
d'ou l'interet de mon booleen.
 
J'ai bon ?
 
v.


Message édité par vonm le 03-02-2009 à 10:25:59
Reply

Marsh Posté le 03-02-2009 à 21:17:13    

Bonsoir,
pour éviter le if ....:
Sub ev()
 
Dim i As Double
limite = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
 
  Application.ScreenUpdating = False
For i = limite To 1 Step -1
  j = 1
While Not (IsEmpty(Cells(i, j))) And j < 17
j = j + 1
Wend
    If j < 17 Then
    Cells(i, j).EntireRow.Select
    Selection.Delete Shift:=xlUp
    End If
Next i
  Application.ScreenUpdating = True
 
 
End Sub
 
j=1 colonne début A
j=17 colonne fin P +1
_______________________________________________________________________________________
ou encore:
_______________________________________________________________________________________
Sub w()
Application.ScreenUpdating = False
limite = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
Do
Range(Cells(1, 1), Cells(limite, 16)).Select
With Selection
Set c = .Find(What:="", After:=ActiveCell, LookIn:=xlValues, LookAt:= _
        xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False)
         
        If c Is Nothing Then Exit Sub
        c.EntireRow.Select
        Selection.Delete Shift:=xlUp
       
End With
limite = limite - 1
Loop Until limite = 0
Application.ScreenUpdating = true
End Sub
 
Bonne nuit


Message édité par seniorpapou le 03-02-2009 à 21:20:15
Reply

Sujets relatifs:

Leave a Replay

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