Mémoriser les lignes à supprimer

GeoTrouvePas

XLDnaute Impliqué
Bonjour tout le monde,

J'utilise une macro relativement pour supprimer des lignes en fonction d'un critère :
Code:
With Thisworkbook.Sheets("DATA")
    CptrLig = 1
    While .Cells(CptrLig,1) <> VbNullString
        If .Cells(CptrLig,2) = "Réel" then
            .Rows(CptrLig).Delete
        Else
             CptrLig = CptrLig + 1
        End if
    Wend
End with

Mon soucis est que j'ai 50 000 lignes à étudier et la suppression une à une de ces lignes ralenti énormément l'exécution (j'utilise bien entendu tout ce qui ScreenUpdating, Calcul Manuel et autres astuces)

Je me demandais donc si il n'y aurait pas moyen de stocker tous les numéros de lignes à supprimer dans une variable pour toutes les supprimer d'un coup en sortie de boucle ?

En vous remerciant par avance de votre aide
 

GeoTrouvePas

XLDnaute Impliqué
Bonjour Géo..........

Pas certain de pouvoir répondre exactement à la demande.
J'interviens uniquement pour te signaler que lorsqu'on supprime des lignes , il faut partir de la dernière vers la première

à+
Philippe

Bonjour phlaurent,

Quel intérêt de partir de la dernière ligne ? Pour éviter d'avoir à faire le "Else" présent dans mon code ?
 
Dernière édition:

GeoTrouvePas

XLDnaute Impliqué
Bonjour.
Cette instruction devrait le faire :
VB:
ThisWorkbook.Sheets("DATA").Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

Bonjour Dranreb,

Merci pour l'info mais j'ai du mal à avoir comment on utilise ta ligne.
Si je comprends bien, ça consiste à repérer les cellules vides de la colonne 1 et à supprimer la ligne entière ?

Du coup dans ma boucle, il faudrait que j'efface simplement la première cellule de chaque ligne puis que j'utilise ta ligne en fin de boucle ?
 

Dranreb

XLDnaute Barbatruc
Pardon, je n'avais pas tout lu.
VB:
Sub SuppressionRéel()
LignesOùCondR1C1(ThisWorkbook.Sheets("DATA").Rows(1), "RC2=""Réel""").Delete
End Sub
Function LignesOùCondR1C1(ByVal LigneDéb As Range, ByVal CondR1C1 As String) As Range
Rem. ——— Lignes entières partant de LigneDéb qui vérifient une condition R1C1 CondR1C1.
Dim Lignes As Range, ColTrv As Range
With LigneDéb.Worksheet.UsedRange
   Set Lignes = LigneDéb.EntireRow.Resize(.Rows.Count + .Row - LigneDéb.Row)
   Set ColTrv = Intersect(.Columns(.Columns.Count + 1), Lignes): End With
ColTrv.FormulaR1C1 = "=1/(" & CondR1C1 & ")"
On Error Resume Next
Set LignesOùCondR1C1 = ColTrv.SpecialCells(xlCellTypeFormulas, 1).EntireRow
ColTrv.Delete xlShiftToLeft
End Function
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Bonjour,

plus rapide :
-trier colonne B
-filtrer sur "Réel"
-supprimer les lignes visibles (toutes regroupées suite au tri, ça va très vite)
-annuler le filtre
-remettre éventuellement le tri voulu
l'enregistreur de macro te donnera une bonne partie du code
eric
 

Discussions similaires

Réponses
8
Affichages
615

Statistiques des forums

Discussions
311 711
Messages
2 081 782
Membres
101 817
dernier inscrit
carvajal