XL 2016 RESOLU VBA supprimer ligne vides d'une plage

richard31

XLDnaute Occasionnel
Bonjour

j'ai un tableau qui récupère des données mais qui intègre des lignes vides, je désire simplement les supprimer ! j 'ai trouvé des codes sur le net mais aucun ne fonctionne ou super long ! Pourtant c'est simple..
Le tableau est feuille "SUIVI-RESPONSABLES-PF" de A21 à V2000 quand une ligne est vide , la supprimer entièrement sans toucher le reste bien sur !

C'est compliqué ?
 

Pièces jointes

  • Sup_Lignes_Vides.xlsx
    122.1 KB · Affichages: 41

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour

Non, pas compliqué mais si les codes que tu as trouvé pour cette action basique maintes fois demandée et résolue ne fonctionnent pas, cela vient peut être de ton fichier ou de tes données. Mets un fichier exemple.

Bien cordialement, @+
 

richard31

XLDnaute Occasionnel
Bonjour

Non, pas compliqué mais si les codes que tu as trouvé pour cette action basique maintes fois demandée et résolue ne fonctionnent pas, cela vient peut être de ton fichier ou de tes données. Mets un fichier exemple.

Bien cordialement, @+
non je rectifie en fait ça ne fonctionne pas du tout . j en ai pas trouvé un seul qui fonctionne correctement. le fichier est très simple un tableau de A21 à V 2000 rien de plus. je vais en faire un pour exemple....
 

richard31

XLDnaute Occasionnel
non je rectifie en fait ça ne fonctionne pas du tout . j en ai pas trouvé un seul qui fonctionne correctement. le fichier est très simple un tableau de A21 à V 2000 rien de plus. je vais en faire un pour exemple....
je ne trouve pas les demandes de ce type sur le forum des demandes de suppressions de cellules vides ou ligne avec conditions de valeurs précises juste mais ce n'est pas ce que je recherche , aucunes conditions a part si vide bien sur ;)
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
Bonjour,

il faut boucler sur les cellules, car la fonction ci-dessous(+simple) mais avec quadrillage ça ne fonctionne pas !
If Application.CountA(Rows(R)) = 0 Then Rows(R).Delete

voir classeur avec la macro !?
il faut que la feuille ne contienne que ce tableau !
ensuite je supprime toutes les lignes vides de la ligne No 1 à la dernière
le tableau est compacté tout en haut !


EDIT: j'ai modifié comme tu le souhaites,
ne supprimer les lignes vides qu'à partir de la ligne 22 (sous les entêtes) !

RE-EDIT:
j'avais pas vu, tu dis que si la 1'cellule de la ligne est vide on peut supprimer cette ligne !
c'est fais dans la version_2 !
 

Pièces jointes

  • Sup_Lignes_Vides.xlsm
    140.4 KB · Affichages: 50
  • Sup_Lignes_Vides_2.xlsm
    140 KB · Affichages: 68
Dernière édition:

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
si j'ai bien compris, tu as donc un tableau de A21 à V2000 tout bête avec des lignes vides que tu veux supprimer.
question: y a t'il une colonne ou la cellule n'est vide que si la ligne est vide ou n'importe quelle colonne peut comporter une valeur alors que les autres sont vides, c'est pour la rapidité du code.
Pareil, la ligne 20 contient t'elle des en-têtes ?
C'est pour cela qu'un fichier est utile pour que les contributeurs ne perdent pas de temps à faire un code qui sera finalement inadapté
 

richard31

XLDnaute Occasionnel
si j'ai bien compris, tu as donc un tableau de A21 à V2000 tout bête avec des lignes vides que tu veux supprimer.
question: y a t'il une colonne ou la cellule n'est vide que si la ligne est vide ou n'importe quelle colonne peut comporter une valeur alors que les autres sont vides, c'est pour la rapidité du code.
Pareil, la ligne 20 contient t'elle des en-têtes ?
C'est pour cela qu'un fichier est utile pour que les contributeurs ne perdent pas de temps à faire un code qui sera finalement inadapté
en fait tout dépend de la cellule située en colonne A si elle est vide toute la ligne le sera. La ligne 20 contient des entête oui en A20 on à le nom Chrono. j ai collé le fichier ! merci pour ton aide ^^
 

richard31

XLDnaute Occasionnel
Bonjour,

il faut boucler sur les cellules, car la fonction ci-dessous(+simple) mais avec quadrillage ça ne fonctionne pas !
If Application.CountA(Rows(R)) = 0 Then Rows(R).Delete

voir classeur avec la macro !?
il faut que la feuille ne contienne que ce tableau !
ensuite je supprime toutes les lignes vides de la ligne No 1 à la dernière
le tableau est compacté tout en haut !
merci pour ton aide ! je peux pas le regarder la j ai excel occupé pendant un bon moment ^^ je vois a peut près ce que vous avez fait mais effectivement il va y avoir un autre petit tableau en haut qui comptabilise les entrées sur une colonne donc je suis coincé :( j'ai vue des codes VBA qui choisisses les numéros de colonnes en commençant par un numéro de ligne mais je ne sais pas comment le faire...
bref je vais voir ce que vous avez fait et je reviens quand excel est re dispo !

merci en tout les cas !
 

richard31

XLDnaute Occasionnel
re:

j'ai remis les classeurs modifiés comme tu le souhaites (ne pas supprimer les lignes au-dessus du tableau !

voir mon dernier message avec EDIT !
https://www.excel-downloads.com/threads/resolu-vba-supprimer-ligne-vides-dune-plage.20026426/

Bon j'abuse .. J utilise un code qui permet de Pinger une lite d hostname et cela fonctionne très bien mais il est très long! peut être que c'est tout à fait normal je sais pas en fait. Apparemment vous êtes expert en VB ^^ le plus étrange est que si je fais une fois ECHAP ça va plus vite.. ce n'est pas une obligation bien sur mais peut être qu'en un coup d 'œil vous verrez la coquille si elle est existe bien sur ! le voici :

Sub PingListePostes()
Application.ScreenUpdating = False
On Error Resume Next
Dim Tab_Ra As Range, Cel_en_Cours As Range, objhttp As Variant, PingResult As Variant, Computer$, IP As String
Set objhttp = CreateObject("MSXML2.ServerXMLHTTP.4.0")
Dim Last&
Last = [E65000].End(xlUp).Row
Set Tab_Ra = Range("E21:E" & Last) ' tab_ra.Address = E21:E5000
For Each Cel_en_Cours In Tab_Ra.Cells
If Cel_en_Cours.Value <> "" Then
If Cel_en_Cours.Offset(0, 1).Value = "" Or Cel_en_Cours.Offset(0, 1).Value = "Poste Non joignable" Then
Computer$ = Trim(Cel_en_Cours.Value): IP = ""
For Each PingResult In GetObject("winmgmts://./root/cimv2").ExecQuery _
("SELECT * FROM Win32_PingStatus WHERE Address = '" & Computer$ & "'")
If IsObject(PingResult) Then IP = PingResult.ProtocolAddress
Next
If IP = "" Then Cel_en_Cours.Offset(0, 1).Value = "Poste Non joignable" Else Cel_en_Cours.Offset(0, 1).Value = IP

End If
End If
Next Cel_en_Cours
Set objhttp = Nothing
Application.ScreenUpdating = True
MsgBox "FIN DU PING"
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous,

Un autre essai qui tente de faire des paquets de lignes vides consécutives pour faire des suppressions par bloc et non ligne par ligne.
Le fichier travaille sur un tableau de 10 000 lignes.
  • la feuille "COPIE" est inutile et n'est présente que pour la phase de test afin de conserver le tableau d'origine
  • la macro est codée pour un tableau de type liste (franchement Microsoft aurait pu appeler cette structure par un autre mot que tableau !!!)
  • évidemment si les lignes vides contigües sont en faible nombre, le gain sera lui-même faible
  • cliquez sur le bouton Hop! pour lancer la macro
 

Pièces jointes

  • richard31- Sup_Lignes_Vides- v1.xlsm
    613.8 KB · Affichages: 35

job75

XLDnaute Barbatruc
Bonjour à tous,

Fichier joint avec ma solution pour la suppression des lignes "vides" :
Code:
Sub SupprimerLignesVides()
Dim c As Range, i%, f$
Application.ScreenUpdating = False
ActiveSheet.ListObjects(1).ListColumns.Add Position:=1 'insertion d'une colonne auxiliaire
With ActiveSheet.ListObjects(1).Range
    Set c = .Cells(1)
    For i = 2 To .Columns.Count
        f = f & "&" & c(1, i).Address(0, 0)
    Next
    .Columns(1) = "=LN(" & Mid(f, 2) & "="""")"
    .Columns(1) = .Columns(1).Value 'supprime les formules
    .Sort .Cells(1), xlDescending, Header:=xlYes 'tri pour grouper et accélérer
    i = Application.Count(.Columns(1))
    If i Then .Columns(1).SpecialCells(xlCellTypeConstants, 1).EntireRow.Delete 'suppression des lignes "vides"
    .Columns(1).Delete xlToLeft 'suppression de la colonne auxiliaire
    With .Parent.UsedRange: End With 'actualise les barres de défilement
End With
Application.ScreenUpdating = True
MsgBox IIf(i, i, "Aucune") & " ligne" & IIf(i > 1, "s", "") & " supprimée" & IIf(i > 1, "s", "") & "..."
End Sub
Grâce au tri du tableau la suppression est très rapide.

Curieux que personne n'ait fait cette remarque : les cellules "vides" ne sont pas vides mais contiennent le texte "".

A+
 

Pièces jointes

  • Sup_Lignes_Vides(1).xlsm
    137.3 KB · Affichages: 46

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @job75,

Grâce au tri du tableau la suppression est très rapide.
Certes, mais j'avais envie de changer de méthode :rolleyes:

Curieux que personne n'ait fait cette remarque : les cellules "vides" ne sont pas vides mais contiennent le texte "".
J'avions vu mais comme je ne m'en servais pas...

Certain prônent l'utilisation des structures "tableau". Pour ma part, je n'aime guère et, de plus, je trouve qu'en programmation VBA, c'est la plaie. Ça me laisse l'impression d'une "verrue" mal intégrée. En plus, si on décide un jour de se passer d'une telle structure en la convertissant en plage, les codes sont à réécrire (ce que tu as fait).
 

Discussions similaires

Réponses
8
Affichages
667

Statistiques des forums

Discussions
312 329
Messages
2 087 334
Membres
103 519
dernier inscrit
Thomas_grc11