XL 2013 Boucle For trop lente

RomainPOIRET

XLDnaute Occasionnel
Bonjour à tous,

J'ai une macro qui supprime des lignes si une cellule est vide (par une boucle)

VB:
Sub suppression_lignes()

Dim iii As Integer
Dim lignes_supp As Range
Dim derLig As Long
    
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
    
derLig = Range("S" & Cells.Rows.Count).End(xlUp).Row

    For iii = 15 To derLig
        If Cells(iii, 19) = "" Then
            If lignes_supp Is Nothing Then Set lignes_supp = Rows(iii) _
            Else Set lignes_supp = Union(lignes_supp, Rows(iii))
        End If
    Next iii

If Not lignes_supp Is Nothing Then lignes_supp.Delete
    
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Aujourd'hui je mets 25 secondes pour 300 lignes, avez vous des solutions pour me réduire le temps d'execution ?

Merci d'avance,

Romain
 
Solution
Bonjour,

D'après ce que je comprends, vous cherchez à supprimer les lignes vides, vous pouvez aussi utiliser
la méthode specialCells (renvoie une erreur si aucune trouvée) pour les sélectionner d'un coup.

VB:
Sub supprimerlignesvides()
    Dim plg As Range
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
    With ActiveSheet
        On Error Resume Next
        Set plg = .Range(.Cells(15, 19), .Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeBlanks)
        If Not plg Is Nothing Then plg.EntireRow.Delete
        On Error GoTo 0
    End With
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation...

Dranreb

XLDnaute Barbatruc
Bonjour.
Si d'ajouter au début Application.EnableEvents = False, True à la fin, améliorait les choses, ça impliquerait quand même de vérifier aussi si une procédure Worksheet_Change ne provoque pas d'appels récursifs d'elle même. À mon avis…
 

Jacky67

XLDnaute Barbatruc
Bonjour à tous,

J'ai une macro qui supprime des lignes si une cellule est vide (par une boucle)

VB:
Sub suppression_lignes()

Dim iii As Integer
Dim lignes_supp As Range
Dim derLig As Long
   
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
   
derLig = Range("S" & Cells.Rows.Count).End(xlUp).Row

    For iii = 15 To derLig
        If Cells(iii, 19) = "" Then
            If lignes_supp Is Nothing Then Set lignes_supp = Rows(iii) _
            Else Set lignes_supp = Union(lignes_supp, Rows(iii))
        End If
    Next iii

If Not lignes_supp Is Nothing Then lignes_supp.Delete
   
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Aujourd'hui je mets 25 secondes pour 300 lignes, avez vous des solutions pour me réduire le temps d'execution ?

Merci d'avance,

Romain
Bonjour,
Essaye
VB:
Sub suppression_lignes()
    Dim i&, derLig As Long
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    derLig = Cells(Rows.Count, "S").End(xlUp).Row
    For i = derLig To 15 Step -1
        If Cells(i, 19) = "" Then Rows(i).Delete
    Next i
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

D'après ce que je comprends, vous cherchez à supprimer les lignes vides, vous pouvez aussi utiliser
la méthode specialCells (renvoie une erreur si aucune trouvée) pour les sélectionner d'un coup.

VB:
Sub supprimerlignesvides()
    Dim plg As Range
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
    With ActiveSheet
        On Error Resume Next
        Set plg = .Range(.Cells(15, 19), .Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeBlanks)
        If Not plg Is Nothing Then plg.EntireRow.Delete
        On Error GoTo 0
    End With
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With
End Sub

Cordialement
 
Dernière édition:

RomainPOIRET

XLDnaute Occasionnel
Merci à tous,

J'ai enfin trouvé ma solution,
Au final j'ai importé cette macro sur un fichier source qui ne contient pas de macro.
Sur mon fichier actuelle, je demande juste d'ouvrir le fichier source dès que l'on ouvre le fichier actuelle, la macro du fichier source fonctionne dès l'ouverture donc plus de soucis :)

Merci Dranreb, Jacky67 et Roblochon !

Romain
 

Discussions similaires

Statistiques des forums

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