Microsoft 365 suppression de plusieurs lignes dans des tableaux tres grands

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

cecilette

XLDnaute Junior
Bonjour,

un de mes tableurs contenant plusieurs tableaux sur des onglets différents me pose un souci

chaque tableau contient plus de 17000 lignes, je dois filtrer les données et supprimer certaines de ces données.

par exemple : dans le 1er tableau qui contient 17352, j'ai trié la donnée à supprimer ça représente 13587 lignes

je voudrais savoir s'il existe un moyen de sélectionner ces données en un clic pour les supprimer sans devoir sélectionner manuellement les lignes car ça prend un temps infini.

d'avance, je vous remercie pour l'aide que vous m'apporterez.
C.
 
Bonjour
Si c'est un tableau structuré il suffit de cliquer sur le titre d'une colonne, puis clic droit sur une des lignes et supprimer (ligne entière ou ligne de tableau)
Sinon cliquer sur une cellule de la ligne située sous le titre, CRTL Shift Bas, et clic droit supprimer ligne
 
Dernière édition:
@ChTi160 juste une question, à quoi ça sert de s'adresser à un forum (d'humains) pour avoir des réponses d'IA (Idiotie Avérée) ?
Si encore vous les testiez (et là vous vous seriez aperçu d'une "hallucination", une de plus) et la corrigiez pourquoi pas, mais si c'est juste pour faire un copier/coller, autant dire "allez donc poser la question à une idiotie avérée" et fermez tous les forums humains

Ca me ramène quelques années en arrière où la réponse favorites de ceux qui voulaient juste répondre pour répondre était "google est ton amis" sans aucune utilité

La réponse de @chris est quand même plus censé que celles du "chat qui pète" (merci humain Chis 😉)
 
Bonjour le forum,

C'est classique : si la plage des lignes à supprimer est constituée d'un grand nombre (plusieurs milliers) de lignes disjointes leur suppression peut prendre beaucoup de temps.

Pour y remédier il faut utiliser une colonne auxiliaire avec une formule de filtrage suivie d'un tri sur les valeurs pour regrouper.

Il y a pas mal d'exemples sur ce forum.

A+
 
Bonjour à tous,
En supposant qu'on travaille avec des tables structurées, un exemple ci joint
Nota: s'il y a plus d'une table ou d'autres données sur la feuille, seules les lignes de la table concernée sont supprimées
VB:
Option Explicit
Sub Filter_Delete()
Dim Lignes As Variant, L As Long
Application.ScreenUpdating = False

    With [Tableau1[#Data]]
        .Parent.Activate
       ' on garde en  colonne 1 les éléments finissants par 5
        .AutoFilter Field:=1, Criteria1:="=*5"
        On Error Resume Next
       ' on récupère les adresses des lignes filtrées
        Lignes = Split(.SpecialCells(xlCellTypeVisible).Address, ",")
        If Err = 0 Then ' si le filtre affiche des lignes, on va les supprimer
            ' on enlève les filtres
             .AutoFilter Field:=1
            ' les adresses ayant de fortes chances de représenter des plages non jointives
            ' on va les détruires 1 par 1 en commençant par la fin
             For L = UBound(Lignes) To 0 Step -1
                 Range(Lignes(L)).Delete
             Next
        End If
    End With
End Sub
Sub Restore()
    With [Tableau1[#Data]]
        .AutoFilter Field:=1
        .Delete
        .Resize([Tableau13[#Data]].Rows.Count).Value = [Tableau13[#Data]].Value
    End With
End Sub
 

Pièces jointes

Dernière édition:
Bonjour à tous😉,

En appliquant ce qu'a décrit @job75 que je salue 😛, voici un exemple de ce qu'on peut faire avec un grand tableau structuré (80 000 lignes) et qui comporte de nombreuses lignes filtrées disjointes.
Attention! pour supprimer les lignes filtrées, il faut que la cellule active soit dans le tableau structuré concerné.
  1. initialiser les données
  2. puis lancer le traitement
edit: version v1a -> j'avais mis par mégarde en commentaire la ligne : ts.ListColumns(1).Delete

Le code est dans Module1:
VB:
Sub TSsupprLigneFiltre()
' ----- supprime les lignes filtrées d'un tableau structuré
Dim ts As ListObject, xrg As Range, ti#
   ti = Timer
   Application.ScreenUpdating = False     ' on fige l'écran
   On Error Resume Next                   ' on continue le traitement si une erreur se produit
   Set ts = ActiveCell.ListObject         ' le tableau structuré de la cellule active
   If ts Is Nothing Then MsgBox "La cellule active n'appartient pas à un tableau structuré -> échec", vbCritical: Exit Sub
   With ts     ' avec le tableau structuré
      ' on ajoute une colonne auxiliaire nommée "AuxTempo" si ce n'est pas déjà fait
      If .Range(1, 1) <> "AuxTempo" Then .ListColumns.Add 1: .Range(1, 1) = "AuxTempo"
      Set xrg = ts.ListColumns(1).DataBodyRange.SpecialCells(xlCellTypeVisible)  ' le range des cellules visibles de la colonne 1
      If xrg Is Nothing Then ts.ListColumns(1).Delete: Exit Sub    ' cas où le filtre ne renvoie rien
      xrg.Value = CVErr(xlErrNA)          ' on place une valeur d'erreur dans la colonne1 dans les lignes visibles
      ts.AutoFilter.ShowAllData           ' on affiche toutes les lignes
      ts.Range.Sort key1:=ts.Range.Columns(1), order1:=xlAscending, Header:=xlYes            ' tri du TS selon colonne 1
      Set xrg = ts.ListColumns(1).DataBodyRange.SpecialCells(xlCellTypeConstants, xlErrors)  ' le range des lignes avec #N/A en colonne 1
      xrg.Resize(, ts.ListColumns.Count).Delete shift:=xlShiftUp  ' effacement du bloc de ces lignes dans le TS
      ts.ListColumns(1).Delete            ' on supprime la colonne auxiliaire
   End With
   MsgBox "Exécution terminée en " & vbLf & Format(Timer - ti, "0.00\ sec."), vbInformation
End Sub
 

Pièces jointes

Dernière édition:
Suite à une remarque en privée de @mapomme,
les adresses filtrées peuvent être tronquées dans la propriété SpecialCells(xlCellTypeVisible).Address limitée à 255 caractères ( 257 chez moi ? ) .
1775418187901.png

J'ai donc modifié mon code ainsi :
VB:
Sub Filter_Delete()
Dim Lignes As Areas, L As Long, ti#
Application.ScreenUpdating = False
Restore
    ti = Timer
    With Sheets("Feuil1").ListObjects(1).DataBodyRange
       ' on garde en  colonne 1 les éléments contenant 2
        .AutoFilter Field:=1, Criteria1:="=*2*"
       ' on récupère les adresses des lignes filtrées
        On Error Resume Next
        Set Lignes = .SpecialCells(xlCellTypeVisible).Areas
        If Err = 0 Then
            ' on enlève les filtres
            .AutoFilter Field:=1
            ' les adresses ayant de fortes chances de représenter des plages non jointives
            ' on va les détruires 1 par 1 en commençant par la fin
             For L = Lignes.Count To 1 Step -1
                 Lignes(L).Delete
             Next
         End If
    End With
    MsgBox "Exécution terminée en " & vbLf & Format(Timer - ti, "0.00\ sec."), vbInformation
End Sub
Mais si vous n'avez pas d'objections à ajouter une colonne temporaire et que votre table n'a pas un ordre de tri significatif,
je vous conseille le code de @mapomme qui s'exécute en 0.06sd contre 0.57sd pour ma part, ceci sur une table de 4000 lignes .
Ci-joint le classeur de test
 

Pièces jointes

Salut,
1 - Applique ton filtre.
2 - Sélectionne la zone filtrée (par exemple tout le tableau par son nom dans la zone Nom (en haut à gauche, juste à gauche de la barre de formule)).
3 - Appuie sur Alt + ; (Appuyer sur la touche Alt et la touche ; )
Cela sélectionne uniquement les lignes visibles, même si elles ne sont pas consécutives.

4 - Clic droit → Supprimer la ligne (supprime toutes les lignes sélectionnées).
5 - Pour faire réapparaître toutes les lignes qui restent : l
Va dans l’onglet Données.
Clique sur Effacer (icône avec une gomme, dans le groupe Filtrer).
Toutes les lignes encore présentes dans le tableau réapparaissent immédiatement.
FiltreSuppression.gif


A noter qu'on peut ajouter la commande Sélectionner les cellules visibles (Alt + ; ) par la barre d'accès rapide :
SelectCellVisible.png




Nullosse
 
Dernière édition:
Salut,
1 - Applique ton filtre.
2 - Sélectionne la zone filtrée (par exemple tout le tableau par son nom dans la zone Nom (en haut à gauche, juste à gauche de la barre de formule)).
3 - Appuie sur Alt + ; (Appuyer sur la touche Alt et la touche ; )
Cela sélectionne uniquement les lignes visibles, même si elles ne sont pas consécutives.

4 - Clic droit → Supprimer la ligne (supprime toutes les lignes sélectionnées).
5 - Pour faire réapparaître toutes les lignes qui restent : l
Va dans l’onglet Données.
Clique sur Effacer (icône avec une gomme, dans le groupe Filtrer).
Toutes les lignes encore présentes dans le tableau réapparaissent immédiatement.

Nullosse
@nullosse , salut
Il semblerait qu'on ne cherche pas à supprimer des "lignes entières" mais des lignes de tableaux, pour préserver ce qui est à gauche ou à droite du tableau .
Après filtre, si on doit supprimer les lignes sélectionnées, la seule option proposée est de supprimer la ligne entière ....
 
@nullosse , salut
Il semblerait qu'on ne cherche pas à supprimer des "lignes entières" mais des lignes de tableaux, pour préserver ce qui est à gauche ou à droite du tableau .
Après filtre, si on doit supprimer les lignes sélectionnées, la seule option proposée est de supprimer la ligne entière ....
Salut fanch55,
en effet, il faut savoir si les tableaux sont les seuls éléments des onglets , où si il y a d'autres éléments sur les lignes des tableaux.
 
Bonjour à tous,
par exemple : dans le 1er tableau qui contient 17352, j'ai trié la donnée à supprimer ça représente 13587 lignes
Voici mon code pour ces nombres de lignes :
VB:
Sub Initialisation()
Application.ScreenUpdating = False
[A2:E2] = Array("A00001", "B00001", "C00001", "D00001", "E00001")
[A2:E2].AutoFill [A2:E17353]
[J:J].ClearContents
[J2:J13588] = "Oui"
[K2:K17353] = "=RAND()": [K2:K17353] = [K2:K17353].Value
[J2:K17353].Sort [K2], Header:=xlNo
[F2:F17353] = [J2:J17353].Value
[J:K].ClearContents
End Sub

Sub Suppression()
Dim t, P As Range, n&
t = Timer
Application.ScreenUpdating = False
With ActiveSheet.ListObjects(1).Range 'tableau structuré
    .AutoFilter: .AutoFilter 'si la feuille est filtrée, ôte le filtre
    .Columns(6).Insert xlToRight 'colonne auxiliaire
    .Columns(6) = "=1/(RC[1]<>""Oui"")"
    .Columns(6) = .Columns(6).Value 'supprime les formules
    .Sort .Columns(6), xlAscending, Header:=xlYes 'tri pour regrouper et accélérer
    On Error Resume Next 'si aucune SpecialCell
    Set P = .Columns(6).SpecialCells(xlCellTypeConstants, 16)
    n = P.Count
    Intersect(.Cells, P.EntireRow).Delete xlUp 'supprime les valeurs d'erreur
    .Columns(6).Delete xlToLeft 'supprime la colonne auxiliaire
End With
With ActiveSheet.UsedRange: End With 'actualise la barre de défilement verticale
Application.ScreenUpdating = True
MsgBox Format(n, "#,##0") & " lignes supprimées en " & Format(Timer - t, "0.00 \sec")
End Sub
Chez moi la suppression de 13587 lignes se fait en 1/10ème de seconde.

A+
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour