Macro de suppression de ligne lente

  • Auteur de la discussion adrien17
  • Date de début

adrien17

Nouveau membre
Salut,
Mon problème vient du fait que ma macro est assez lente
Certains de mes fichiers excel font plus de 20000 ligne et le but de cette macro est de diviser se nombre par un facteur de mon choix.
Je commence de supprimer des lignes à partir de la ligne 8
Ce que je voudrais savoir est s'il existe une autre commande plus rapide que Row().Delete
Merci

Code:
Sub reduction()
'
    Application.ScreenUpdating = False
    Dim Ligne As Long
         Ligne = Range("D1").End(xlDown).Row
    Dim div, iter, i As Integer
        div = InputBox("Par combien diviser le nombre de point")
        iter = 7
        i = 1
    Do While iter < 7 + (Ligne - 7) / div
        iter = iter + 1
        Do While i < div
            i = i + 1
            Rows(iter).Delete Shift:=xlUp
        Loop
        i = 1
    Loop
End Sub
 

zeb

Modérateur
Oh le vilain algo pas beau du tout !

Dans un tableau, et une feuille Excel est un tableau, il faut commencer par le bas quand on supprime des lignes au fur et à mesure !
J'explique tout ça .

Bon, en dehors de ça, pour accélérer les choses, tu peux utiliser ScreenUpdating. Je vois que tu le passe à faux, c'est pas mal, mais il ne faut pas oublier de le repasser à vrai. C'est sans doute fait ailleurs dans ton code.

Sinon, une grosse astuce, pour répondre à ta question sans regarder ton code, ce serait de créer en mémoire une zone qui contiendrait tes lignes à supprimer, puis de tout supprimer d'un coup.

C'est parti. Pour étude, je te propose de supprimer une ligne sur trois.
Code:
Dim r As Long

For r = 65535 To 3 Step -3
    Rows(r).Delete
Next
On est d'accord, c'est long, très long, surtout vers la fin.

Code:
Dim area As Range
Dim r As Long
    
Set area = Nothing    
For r = 3 To 65535 Step 3
    If area Is Nothing Then Set area = Rows(r) Else Set area = Union(area, Rows(r))
Next

area.Delete
Mouais :/ Peut mieux faire. C'est con que VB soit un si mauvais langage, c'était une bonne idée.

Code:
Dim r As Long
Dim s As String

s = ""
For r = 3 To 65535 Step 3
    s = s & ":" & Rows(r).Address
Next

Range(s).Delete
C'est pas mal, non ?

Pour faire patienter l'itilisateur, rien de tel que d'utiliser Application.StatusBar et le sablier, bien sûr.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 125
Messages
6 717 772
Membres
1 586 361
Dernier membre
Florian3549
Partager cette page
Haut