Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Supprimer ligne avec condition

ketzakoalt

XLDnaute Nouveau
Bonjour,

j'ai créé ce code pour supprimer les lignes avec cellules non vides dans les colonnes H, I et K.(à partir de la 2ème ligne)
Quand je le teste ça me supprime uniquement les lignes paires.

Savez-vous pourquoi ?

Et SVP, comment remplacer 20 par "derniere ligne non vide".

Public Sub supprimer()

Dim i As Integer
Sheets("espace").Select
For i = 2 To 20
If (Cells(i, 8) <> "") And (Cells(i, 9) <> "") And (Cells(i, 11) <> "") Then Rows(i).Delete

Next i

End Sub


merci pour votre aide
 

Jacky67

XLDnaute Barbatruc
Bonjour,
Pour supprimer des lignes sur une feuille il faut commencer par la fin et remonter vers le début
Cela pourrait ressembler à ici
VB:
Sub supprimer()
Dim i&, Derlg&
Application.ScreenUpdating = False
With Sheets("espace")
  Derlg = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
  For i = Derlg To 2 Step -1
    If .Cells(i, "h") & .Cells(i, "i") & .Cells(i, "k") <> "" Then .Rows(i).Delete
  Next i
End With
Application.ScreenUpdating = True
End Sub
 

Jacky67

XLDnaute Barbatruc
Merci Jacky, ca marche bien. Je garde

Mais j'aurais quand même bien aimé savoir pourquoi mon code supprime une ligne sur 2
Re..
Ne voyant pas ton classeur, je dirais….
En commençant par le début, si deux lignes à supprimer sont consécutives on ne voit plus la deuxième puisque i=i+1 et la ligne i est supprimée.
Il faudrait plusieurs passages pour trouver le bon résultat.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum, ketzakoalt, Jacky67

Une autre voie (sans boucle)
VB:
'NB: Plage à adapter
'Dans cet exemple: ligne 1= ligne d'entête
'Plage avec des données : colonne A à O
Sub SupprimerBIS()
With Sheets("espace")
  Derlg = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
   With .Range("P2:P" & Derlg)
   .Formula = "=1/((COUNTA(H2,I2,K2)=3))"
   .SpecialCells(xlCellTypeFormulas, 1).EntireRow.Delete
   End With
   .Columns("P:P").Delete
End With
End Sub
 

ketzakoalt

XLDnaute Nouveau
Bon, j'ai parlé trop vite. Ca marchait avec un petit exemple de 3 colonnes mais ca ne marche pas dans mon fichier .
Que je joins...
Les deux macros de Jacky et Staple ne fonctionnent pas du coup.
 

Pièces jointes

  • supprimer_lignes.xlsm
    22.2 KB · Affichages: 26

Jacky67

XLDnaute Barbatruc
Re..
Parce que les cellules concernées en colonne h-i-k ne sont pas vides mais contiennent 0

*Si ces cellules devaient toujours contenir 0 au lieu d'être vides
Remplace cette ligne
If .Cells(i, "h") & .Cells(i, "i") & .Cells(i, "k") <> "" Then .Rows(i).Delete
par
If Not IsNumeric(.Cells(i, "h") & .Cells(i, "i") & .Cells(i, "k")) Then .Rows(i).Delete
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @ketzakoalt, @Jacky67 , @Staple1600,

Pour le fun, un essai sans boucle :
VB:
Sub Supprimer()
  With Worksheets("espace").Range("a1").CurrentRegion
    On Error Resume Next
    Union(.Columns(8), .Columns(9), .Columns(11)).Replace 0, "", xlWhole
    Intersect(.Columns(8).SpecialCells(xlCellTypeBlanks).Offset(, 3), _
      .Columns(9).SpecialCells(xlCellTypeBlanks).Offset(, 2), _
      .Columns(11).SpecialCells(xlCellTypeBlanks)).EntireRow.Delete xlShiftUp
  End With
End Sub
 

Jacky67

XLDnaute Barbatruc

Bonjour mapomme

Jolie...mais je crois que c'est l'inverse qui doit être supprimé...
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @Jacky67 ,

Bonjour mapomme
Jolie...mais je crois que c'est l'inverse qui doit être supprimé...

C'est pas faux . Bon une p'tite correction. On remplace les zéros par des vides puis on supprime les lignes dont toutes les cellule en colonnes I, J et K sont non vides.
VB:
Sub Supprimer()
  On Error Resume Next
  With Worksheets("espace").Range("a1").CurrentRegion
    With .Offset(1).Resize(.Rows.Count - 1)
      Union(.Columns(8), .Columns(9), .Columns(11)).Replace 0, "", xlWhole
      Intersect(.Columns(8).SpecialCells(xlCellTypeConstants).Offset(, 3), _
        .Columns(9).SpecialCells(xlCellTypeConstants).Offset(, 2), _
        .Columns(11).SpecialCells(xlCellTypeConstants)).EntireRow.Delete xlShiftUp
    End With
  End With
End Sub
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum, ketzakoalt, Jacky67, mapomme

@ketzakoalt
Bon alors je reviens dans le fil avec ma macro modifiée
VB:
Sub SupprimerTER()
With Sheets("espace")
  Derlg = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
  .Range("H:I,K:K").Replace "0", ""
   With .Range("P2:P" & Derlg)
   .Formula = "=1/((COUNTA(H2,I2,K2)=3))"
   .SpecialCells(xlCellTypeFormulas, 1).EntireRow.Delete
   End With
   .Range("P2:P" & Derlg) = Empty
End With
End Sub
P/S: Une cellule qui n'affiche pas le zéro qu'elle contient n'est pas pour autant vide...

NB: @mapomme
D'habitude, c'est moi le gars aux endives
 

ketzakoalt

XLDnaute Nouveau
Bonjour à tous,

merci à vous pour toutes ces solutions.

Elles fonctionnent bien avec mon fichier joint mais malheureusement pas avec mon vrai fichier (confidentialité oblige).
Le problème vient peut être des formules.

Donc je vous livre mon "vrai" fichier
 

Pièces jointes

  • supprimer_lignes_ori.xlsm
    328.8 KB · Affichages: 26

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…