VBA Suppression ligne dans grand tableau structuré Excel

Bonjour à tous,

Après quelques heures à rechercher et à tester, je suis dans l'impasse !

Je débute en VBA, donc excusez moi si c'est simple pour vous

Je veux supprimer des lignes dans un tableau (déclaré comme tel et nommé dans Excel "Tab_Ecritures_Analytiques") en fonction des valeurs contenues dans une colonne. Pour simplifier j'ai créé un code qui ajoute une colonne en fin de tableau, puis qui ajoute une formule pour calculer une clé que je compare à une valeur de référence. Toute cette partie fonctionne correctement (mon code n'est peut être pas très académique ...)

J'ai essayé de filtrer mon tableau sur cette colonne puis de supprimer les lignes visibles mais j'ai systématiquement une erreur d'exécution ! Voici le code (le problème est indiqué en commentaire vers la fin)

Sub Purger2()

Dim DernLigne As Long 'Nombre de ligne du tableau

Dim Exercice As Integer ' Exercice à traiter

Dim FiltreSupp As String 'Variable utilisée pour filtrer les lignes à supprimer

Exercice = InputBox("Quel exercice voulez vous purger ?") 'L'utilisateur choisit un Exercice à purger

FiltreSupp = Exercice & "Réalisé" 'On calcule une clé basée pour simplifier la recherche des lignes à supprimer

Worksheets("Ecritures analytiques").Activate 'On désigne la feuille qui contient les données

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

Range("AC2").Select

ActiveCell.FormulaR1C1 = "=[@Année]&[@[Type écriture]]" 'Ajout d'une colonne avec formule pour calculer la clé de filtrage

Range("AC2").Select

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

Selection.Copy

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False 'On ne conserve que les valeurs dans la colonne créée

Selection.Replace What:=FiltreSupp, Replacement:="SUPP", LookAt:=xlWhole, _

SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _

ReplaceFormat:=False 'On compare la clé calculée avec FiltreSupp et on inscrit SUPP si égalité

Range("A1").AutoFilter Field:=29, Criteria1:="SUPP" 'On filtre les lignes qui contiennent SUPP

Range("AC").Select.SpecialCells(xlCellTypeVisible).EntireRow.Delete '!!!!!!!!!!!!!!!!!!!!!!!! LE PROBLEME !!!!!!!!!!!!!!!!!!!!!

Columns("AC:AC").Select

Selection.Delete 'Suppression de la colone AC après traitement des lignes

End Sub

Grand merci d'avance pour vos éclairages experts ....

Philippe

Je te propose de supprimer tout simplement ta ligne qui pose problème. Pour moi elle ne sert à rien ? Ou alors explique ce que tu voulais faire avec cette ligne

Je souhaite supprimer toutes les lignes qui contiennent SUPP en colonne AC (donc les lignes visibles après avoir appliquer le filtre). En raison du très grand nombre de lignes, je ne peux pas utiliser de boucle

Bonjour,

Si tu débutes, il serait bon de prendre dès le départ l'habitude d'indenter ton code (et pour le citer dans un post, d'utiliser la balise Code), cela te fera gagner beaucoup de temps à la longue, et surtout... tu en feras perdre beaucoup moins à ceux à qui tu demandes de l'aide et qui sont disposés à le faire.

Une autre habitude à prendr (à apprendre d'abord), consiste à éliminer de ton code ce qui est inutile, voir à certains égards nuisible.

Tu veux éliminer des lignes de données, sélectionnées sur 2 critères, pour cela tu envisages de filtrer tes données sur les lignes à supprimer puis de supprimer...

Bien ! Tu as donc besoin de filtrer, sur deux champs, supprimer les lignes visibles, réafficher toutes les lignes (restantes).

C'est donc cela que tu dois faire ! Tout le reste est inutile !

Activer est inutile...

Sélectionner est inutile... et tu y vas à tour de bras dans les Select !!! Dis-toi que chaque fois que tu tapes un Select, cela revient à donner un coup de frein brutal (dans une ligne droite dégagée) quand tu es au volant !

Chercher la dernière ligne, dans un tableau Excel, est inutile.

Ajouter une colonne pour y mettre une formule est inutile.

Copier cette colonne pour la coller en valeurs sur elle-même est inutile.

Substituer une autre mention pour les lignes que tu veux supprimer est inutile.

Et parvenu au stade où il ne reste plus qu'à supprimer, tu trouves moyen d'un Select de plus, sur la colonne entière, oubliant que chaque fois que tu Select, il faut poursuivre sur une nouvelle commande avec Selection !

Honnêtement, je trouverais tout à fait souhaitable que du code ainsi écrit plante systématiquement ! Hélas, VBA fait de son mieux toujours pour rattraper, ce qui, hélas encore, n'incite pas les intéressés à changer radicalement de méthodes.

Cordialement.

Test ce code à la place du tient : ca supprime les lignes où l'année est la même que celle tapée par l'utilisateur et où le type d'écriture est "réalisé". :

Sub purger2()

Application.ScreenUpdating = False

Dim Exercice As Integer
Dim derLig As Double
Dim wS As Worksheet

Set wS = Sheets("Ecritures analytiques")

Exercice = InputBox("Quel exercice voulez vous purger ?")

derLig = wS.Cells(Rows.Count, 1).End(xlUp).Row

For i = derLig To 2 Step -1
    If wS.Cells(i, 14) = Exercice And wS.Cells(i, 28) = "Réalisé" Then Cells(i, 1).EntireRow.Delete
Next

End Sub

Merci pour ces éléments de réponses.

J'ai testé avec ton code. Cela fonctionne (je n'en doutais pas) mais je crains que cela ne soit parti pour un temps très long ( Je viens de chronométrer : 53 lignes en 30 secondes). C'est pour cela que je voulais éviter les boucles. J'ai plus de 100 000 lignes à traiter à chaque fois !

J'ai tout repris en suivant tes conseils (je ne sais pas si j'ai tout respecté à la lettre, mais j'ai essayé). Voici ci - dessous mon nouveau code. Il fonctionne correctement jusqu'à la ligne de suppression qui me retourne une erreur. j'ai beau chercher ... je suis bloqué ! 'ai une erreur 1004. Est ce possible de cette façon ?

Sub Purger3()
Dim DernLigne As Long
Dim Exercice As Integer ' Declare la variable Exercice
Dim wS As Worksheet
    Set wS = Sheets("Ecritures analytiques")
    Exercice = InputBox("Quel exercice voulez vous purger ?")
    DernLigne = wS.Range("A" & Rows.Count).End(xlUp).Row

    wS.Range("A1").AutoFilter Field:=14, Criteria1:=Exercice
    wS.Range("A1").AutoFilter Field:=28, Criteria1:="Réalisé"

    wS.Range("A2:AB" & DernLigne).SpecialCells(xlCellTypeVisible).EntireRow.Delete

End Sub

Je te remercie d'avance pour tes conseils

Rechercher des sujets similaires à "vba suppression ligne grand tableau structure"