XL 2019 Suppression de lignes avec condition VBA

MONTREAL2020

XLDnaute Junior
Bonjour,

Ne connaissant pas grand chose au VBA. je souhaiterais savoir quel code appliquer pour supprimer des lignes qui contiennent le mot (OUT) existant sur la colonne exemple 44. cela doit se faire sur l'ensemble des lignes du tableau .

Merci pour votre aide
 

M12

XLDnaute Accro
Re,
Teste comme ceci, la macro est légèrement modifiée avec des commentaires
N'ayant pas au départ de classeur exemple, je ne pouvais savoir où rechercher le Nb de lignes remplies
 

Pièces jointes

  • Montreal2020 (3).xlsm
    300.3 KB · Affichages: 10

job75

XLDnaute Barbatruc
Bonjour MONTREAL2020, M12, le forum,

Tout d'abord avec la touche F5 je constate que la dernière cellule est AT4933.

Alors que le tableau a 1485 lignes : il faut donc épurer en supprimant les lignes vides inutiles.

Ensuite concernant la solution donnée par M12 : elle est très simple mais prendra trop de temps s'il y a beaucoup de lignes à supprimer.

Voyez le fichier (4) joint et cette macro qui évite ces problèmes :
VB:
Sub SupprimerOUT()
Application.ScreenUpdating = False
On Error Resume Next 'si aucune SpecialCell
With ActiveSheet
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    '---épure la feuille en supprimant les lignes vides du bas---
    .Range(.Cells.Find("*", , xlValues, , xlByRows, xlPrevious)(2), .Rows(.Rows.Count)).Delete
    '---supprime les lignes OUT---
    With .UsedRange.Offset(1).Resize(.UsedRange.Rows.Count - 1) 'évite la ligne des en-têtes
        .Columns(44).EntireColumn.Insert 'insère une colonne auxiliaire
        With .Columns(44)
            .FormulaR1C1 = "=1/(RC[1]<>""OUT"")" 'valeur d'erreur si OUT
            .Value = .Value 'supprime les formules
            .EntireRow.Sort .Cells, xlAscending, Header:=xlNo 'tri pour regrouper et accélérer
            .SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete 'supprime les valeurs d'erreur
            .EntireColumn.Delete 'supprime la colonne auxiliaire
        End With
    End With
    '---actualise les barres de défilement---
    With .UsedRange: End With
End With
End Sub
Pour tester les durées d'exécution j'ai copié le tableau A2:AT1485 sur 29 680 lignes :

- cette macro => 0,55 seconde chez moi

- macro du post #7 => 37 secondes.

1640 lignes avec OUT supprimées.

A+
 

Pièces jointes

  • Montreal2020 (4).xlsm
    301.8 KB · Affichages: 14

job75

XLDnaute Barbatruc
En fait il y a des formules (volatiles) avec AUJOURDHUI() en colonne B.

Elles se recalculent toutes chaque fois qu'on modifie la feuille.

Donc pour accélérer la macro du post #7 il faut éviter ce recalcul :
VB:
Sub Suppr()
    Dim n&, i&
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual 'évite le recalcul des formules
    With ActiveSheet 'Avec la feuille active
        n = .Range("A" & .Rows.Count).End(xlUp).Row  'je recherche la dernière ligne remplie de la colonne A
          For i = n To 2 Step -1 'Je boucle sur chaque cellule de la colonne AR en partant du bas vers le haut (ligne2) (STEP -1 pour remonter ligne par ligne
              'Si dans la colonne AR et la ligne, il y a le mot OUT, je supprime la ligne
              If Range("AR" & i).Value = "OUT" Then .Range("AR" & i).EntireRow.Delete
          Next i
    End With
    Application.Calculation = xlCalculationAutomatic
End Sub
Sur 29 680 lignes la macro s'exécute en 16 secondes, c'est quand même mieux.
 

job75

XLDnaute Barbatruc
Pour terminer je réponds à ceci :
Désolé de vous importuné, j'ai essayé de plusieurs façons ça me donne un message (erreur 13)
C'est sans doute que vous avez utilisé la macro de M12 sur un tableau de plus de 32767 lignes.

En effet dans cette macro les variables n et i sont déclarées As Integer => Dim n%, i%

Il faut alors les déclarer As Long => Dim n&, i&
 

MONTREAL2020

XLDnaute Junior
Bonjour,
Je ne comprends pas pourquoi mon code VBA ne fonctionne plus, il m'affiche

la ligne (Then .Range("AR" & i).EntireRow.Delete) est en couleur jaune

Sub Suppr()

Dim n&, i&

Application.ScreenUpdating = False

Application.Calculation = xlCalculationManual 'évite le recalcul des formules

With ActiveSheet 'Avec la feuille active

n = .Range("A" & .Rows.Count).End(xlUp).Row 'je recherche la dernière ligne remplie de la colonne A

For i = n To 2 Step -1 'Je boucle sur chaque cellule de la colonne AR en partant du bas vers le haut (ligne2) (STEP -1 pour remonter ligne par ligne

'Si dans la colonne AR et la ligne, il y a le mot OUT, je supprime la ligne

If Range("AR" & i).Value = "OUT" Then .Range("AR" & i).EntireRow.Delete

Next i

End With

Application.Calculation = xlCalculationAutomatic

End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 193
Messages
2 086 062
Membres
103 110
dernier inscrit
Privé