Supprimer des lignes avec une valeur à 0 sans test

Bonjour à tous,

Je cherche un moyen plus rapide de supprimer des lignes que celui que j'utilise actuellement

En effet, dans la colonne E, j'ai enormement de lignes que je souhaite supprimer parce que la valeur dans cette colonne est égale à 0.

J'utilise la macro ci dessous: c'est à dire que je teste chaque ligne pour voir si elle est à 0 et je la supprime si la valeur est à 0.

N'y a t il pas un moyen plus rapide pour supprimer ces lignes?

Merci pour votre aide

Sub Macro1

()

Range("E2").Select

While ActiveCell.Offset(0, -4) <> ""

If ActiveCell.Value = 0 Or ActiveCell.Value = "" Then

ActiveSheet.Rows(ActiveCell.Row).EntireRow.Delete

ActiveCell.Offset(-1, 0).Select

End If

ActiveCell.Offset(1, 0).Select

Wend

End Sub

21classeur1.xlsx (38.67 Ko)

Bonsoir,

En manuel ou en vba.

1 - Placer un filtre sur la colonne E

2 - Sélectionner les valeurs "0" dan le filtre

3 - Sélectionner toutes les lignes trouvées

4 - Supprimer ces lignes

5 - Supprimer le Filtre

Sub SuppressionLignesAZero()

'

' SuppressionLignesAZero Macro

'

'

Columns("E:E").Select

Selection.AutoFilter

ActiveSheet.Range("$E$1:$E$1071").AutoFilter Field:=1, Criteria1:="0"

Rows("2:2").Select

Range(Selection, Selection.End(xlDown)).Select

Selection.Delete Shift:=xlUp

ActiveSheet.Range("$E$1:$E$122").AutoFilter Field:=1

End Sub

C'est vrai que je n'avais pas pensé au filtre!

J'y suis presque, j'ai encore 2 questions:

1/ Comment puis je etre sur que j'ai filtré sur tout mon tableur?

Mes lignes peuvent varier et la selection peut etre superieure à 1071.

2/ De plus, je ne souhaite pas filtrer sur la colonne E mais sur la colonne dont l'etiquette est "Physique Disponible"

Ci dessous la macro améliorée et le fichier en PJ

Merci pour votre aide

Sub Macro1()

'

' Macro1 Macro

'

Cells.Find(What:="Physique disponible", After:=ActiveCell, LookIn:= _

xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _

xlNext, MatchCase:=False, SearchFormat:=False).Activate

Selection.AutoFilter

ActiveSheet.Range("$E$1:$E$1071").AutoFilter Field:=5, Criteria1:="0"

Rows("2:2").Select

Range(Selection, Selection.End(xlDown)).Select

Selection.Delete Shift:=xlUp

Selection.AutoFilter

Range("A1").Select

End Sub

30classeur1.xlsm (43.36 Ko)

solution à tester bien sûr

1/ Comment puis je etre sur que j'ai filtré sur tout mon tableur?

Mes lignes peuvent varier et la selection peut etre superieure à 1071

Rechercher la dernière ligne de la colonne A

derl = Range("A" & Rows.Count).End(xlUp).Row

puis mettre derl à la place de 1071

ActiveSheet.Range("$E$1:$E$" & derl).AutoFilter Field:=5, Criteria1:="0"

2/ De plus, je ne souhaite pas filtrer sur la colonne E mais sur la colonne dont l'etiquette est "Physique Disponible"

Comme la colonne "Physique disponible est en E je ne vois pas la différence

19classeur2.xlsm (44.77 Ko)

Bonjour,

Une autre proposition à tester.

Cdlt.

Option Explicit

Public Sub DeleteRowsToZero()
Dim rng As Range

    Application.ScreenUpdating = False
    With ActiveSheet
        If .FilterMode Then .ShowAllData
        .[A1].AutoFilter field:=5, Criteria1:="0"
    End With

    With ActiveSheet.AutoFilter.Range
        On Error Resume Next
        Set rng = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count) _
                   .SpecialCells(xlCellTypeVisible)
        On Error GoTo 0
    End With
    If rng Is Nothing Then
        MsgBox "Il n'y a pas de lignes à supprimer", vbInformation
    Else
        ActiveSheet.ShowAllData
        rng.Delete xlShiftUp
        Set rng = Nothing
    End If

End Sub

Merci Bernard22 pour ta reponse.

La problématique est du au fait que les gens utilisent un ERP et ils manipulent l'ERP comme ils veulent. Ce qui engendre que la colonne Physique Disponible peut tout à fait être sur une autre colonne que la colonne E, par exemple, en C, en D..

Jean Eric

Meme remarque, il semblerait que le filtre se fasse sur la colonne 5 ou E, ce qui n'est pas toujours le cas => Ca depend de l'affichage défini sur l'ecran des gens.

Est il possible de faire un filtre sur la colonne Physique Disponible qui n'est pas forcément placée en colonne n°5 ou E?

Merci pour votre aide

Re,

Peux-tu m'expliquer ce que tu ne comprenais pas ?

https://forum.excel-pratique.com/excel/en-vba-tri-selon-en-tete-dont-la-place-peut-varier-t76763-10.html

Une nouvelle proposition, sur le même principe.

Cdlt.

Option Explicit

Public Sub ProcessData()
Dim wb As Workbook
Dim ws As Worksheet
Dim lo As ListObject
Dim lCol As Long
Dim rng As Range

    Application.ScreenUpdating = False
    Set wb = ActiveWorkbook
    Set ws = wb.Worksheets(1)
    Set lo = ws.ListObjects.Add(xlSrcRange, ws.Cells(1).CurrentRegion, , xlYes)
    With lo
        On Error GoTo err_Handler
        lCol = Application.Match("Physique disponible", .HeaderRowRange, 0)
        .Range.AutoFilter field:=lCol, Criteria1:="=0"
        With .AutoFilter.Range
            On Error Resume Next
            Set rng = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count) _
                      .SpecialCells(xlCellTypeVisible)
            On Error GoTo 0
        End With
        If rng Is Nothing Then
            MsgBox "Il n'y as pas de lignes à supprimer.", vbInformation
            .Range.AutoFilter field:=lCol
            GoTo exit_Handler
        End If
        .Range.AutoFilter field:=lCol
        rng.Delete xlShiftUp
        Set rng = Nothing
    End With

exit_Handler:
    Set lo = Nothing: Set ws = Nothing: Set wb = Nothing
    Exit Sub
err_Handler:
    MsgBox "La colonne 'Physique disponible' n'existe pas.", vbCritical
    Resume exit_Handler

End Sub

Bonjour Jean Eric

Merci, j'ai testé et ca marche!

En revanche, j'ai pas eu le temps de le tester sur d'autres fichiers avec lesquels j'aurai peut etre un probleme par rapport à la creation dutableau.

Je pars en congés, je vous recontacte mardi prochain à mon retour.

En tout cas merci beaucoup pour l'aide et la reactivité

bonne journée

Bonjour

Je suis de retour!

Donc la macro marche bien excepté le fait que les extractions tirées de mon ERP, sont déjà issues d'un tableau. Enfin c'est ce que j'ai compris de la macro qui etait au dessus. C'est à dire que tu déclines la BDD en tableau et qu'apres, tu mets un filtre sur Physique Disponible et que tu supprimes les lignes correspondantes.

Ce qui engendre que j'ai le message en PJ quand j'y applique la macro. Comment passer outre cette problématique dans le code svp?

J'ai aussi mis l'extraction de base en PJ.

Merci d'avance

capture
17classeur1.xlsm (16.91 Ko)

Bonjour,

ma petite contribution

P.

28lecoc-xlp.zip (143.22 Ko)

Merci Patrick

quand j'integre la macro dans mon fichier, j'obtiens l'erreur en PJ.

Sais tu pourquoi stp?

Merci

capture

re,

peux-tu envoyer ton fichier (anonymisé) avec + de lignes (20 ou 30) ?

mets un ' avant les 2 lignes "timer" 2e et avant dernière

P.

Bonjour

Desole Patrick, je n'ai pas envoyé le bon fichier

Donc ma question est : Peut on supprimer les lignes à valeur 0 dans la colonne Stocks Physique Disponible sans tester toutes les lignes.

Mon classeur original s'appelle Stocks dispos

Merci pour ton aide


Bonjour

Desole Patrick, je n'ai pas envoyé le bon fichier

Donc ma question est : Peut on supprimer les lignes à valeur 0 dans la colonne Stocks Physique Disponible sans tester toutes les lignes.

Mon classeur original s'appelle Stocks dispos

Merci pour ton aide

22classeur1.xlsm (14.34 Ko)
17classeur1.xlsm (14.34 Ko)

re,

tu as plusieurs moyens pour éliminer les lignes à zéro:

  • les trier
  • les filtrer
  • utiliser un macro qui scanne toutes les lignes (

Ici tu n'as déjà plus le même titre que tout à l'heure , hors c'est justement sur cette colonne que l'on teste

"Physique_disponible" est <> de "Stocks Physique Disponible"

Si un de ces 2 titres est toujours pareil, comme c'est nommé dan mon code, peut importe où elle se trouvera, mais il faut que le titre de la colonne ne change pas d'une fois à l'autre

Sub StockZéro()
t = Timer
Dim Last
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Range("A1").CurrentRegion.Select
' nommer les colonnes
Selection.CreateNames Top:=True, Left:=False, Bottom:=False, Right:=False
Application.DisplayAlerts = True
Last = [A65000].End(xlUp).Row
' colonne "Physique_disponible"
col = [Stocks_Physique_disponible].Column
For i = Last To 1 Step -1
  If Cells(i, col) <= 0 Then Cells(i, col).EntireRow.Interior.ColorIndex = 15 'colorer pour les voir
  'If Cells(i, col) <= 0 Then Cells(i, col).EntireRow.Delete ' détruire la ligne
Next i
MsgBox (Timer - t)
End Sub

ok ca marche,

Merci beaucoup, maintenant il faut que je revienne sur ma recherche verticale qui ne se fait plus mais je suis proche de la verité, je pense

Bonjour,

A tester.

Cdlt.

Option Explicit

Public Sub ProcessData()
Dim wb As Workbook
Dim ws As Worksheet
Dim lo As ListObject
Dim lCol As Long
DimrCell As Range, rng As Range

    Application.ScreenUpdating = False
    Set wb = ActiveWorkbook
    Set ws = wb.Worksheets(1)
    Set rCell = ws.Cells(1)    

   If rCell.ListObject Is Nothing Then
        Set lo = ws.ListObjects.Add(xlSrcRange, rCell.CurrentRegion, , xlYes)
    Else
        Set lo = ws.ListObjects(1)
    End If
    With lo
        On Error GoTo err_Handler
        lCol = Application.Match("Physique disponible", .HeaderRowRange, 0)
        .Range.AutoFilter field:=lCol, Criteria1:="=0"
        With .AutoFilter.Range
            On Error Resume Next
            Set rng = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count) _
                      .SpecialCells(xlCellTypeVisible)
            On Error GoTo 0
        End With
        If rng Is Nothing Then
            MsgBox "Il n'y as pas de lignes à supprimer.", vbInformation
            .Range.AutoFilter field:=lCol
            GoTo exit_Handler
        End If
        .Range.AutoFilter field:=lCol
        rng.Delete xlShiftUp
        Set rng = Nothing
    End With

exit_Handler:
    Set rCell = Nothing: Set lo = Nothing: Set ws = Nothing: Set wb = Nothing
    Exit Sub
err_Handler:
    MsgBox "La colonne 'Physique disponible' n'existe pas.", vbCritical
    Resume exit_Handler

End Sub

Merci Jean Eric

Bonne journée

Bonjour

Bon sincerement, je ne m'en sors pas. La BDD est trop grande et ca prend beaucoup trop de temps

J'ai pensé à une autre solution, à savoir faire un filtre different de 0 sur la colonne Stocks Physique Disponible dans la PJ

Ma question est donc de savoir comment filtrer sur la colonne Stocks Physique disponible les valeurs differetes de 0, Ca suffira largement

Pouvez vous svp m'aider dans ce sens.

Le fichier est en PJ

Merci


Fichier en Pj c'est mieux

21classeur1.xlsm (9.72 Ko)

Bonjour,

filtre élaboré alors

P.

Merci Patrick,

Mais ca ne marche pas dans le sens où

La colonne Stocks Physique Disponible peut bouger, donc il ne faut pas filtrer selon un numero de colonne mais bien selon l'etiquette de données "Stocks Physique Disponible"

Le nombre de lignes peut lui aussi varier...

Donc l'idée serait de faire un filtre sur etiquettes avec un nombre de lignes variables

Rechercher des sujets similaires à "supprimer lignes valeur test"