Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

effacer lignes cachées

  • Initiateur de la discussion Initiateur de la discussion sinedv
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

S

sinedv

Guest
Bonjour,

Pour optimiser et surtout alléger un grand tableau (> 20 000 lignes et 250 colonnes), j'ai écris une macros pour effacer les lignes masquées par l'utilisation d'un filtre automatique.

Code:
Sub del_hidden_rows()
    Application.ScreenUpdating = False
    timestart = Timer
    Application.Calculation = xlManual
    curlig = 9
    Do Until (IsEmpty(Cells(curlig, 1)))
        Cells(curlig, 1).Select
        If (Cells(curlig, 1).Rows.Hidden) Then
            Rows(curlig).Delete
        Else
            curlig = curlig + 1
        End If
    Loop
    Calculate
    timestop = Timer - timestart
    msgtxt = "Del hidden rows duration: " & timestop
    Application.ScreenUpdating = True
    Application.Calculation = xlAutomatic
    MsgBox (msgtxt)
End Sub

Cette macro fonctionne très bien ... sauf qu'elle prends plusieurs minutes ...

Avez-vous des idées pour optimiser le temps d'exécution ?

merci d'avance, 🙂
 
Re : effacer lignes cachées

Bonjour,

voici qui devrait améliorer les choses

Code:
Sub del_hidden_rows()
    Dim plage As Range
    Dim derlig As Long
    Dim curlig As Long
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    timestart = Timer
    Application.Calculation = xlManual
 
    derlig = Range("A" & Rows.Count).End(xlUp).Row
    For curlig = 9 To derlig
        If Rows(curlig).Hidden = True Then
            If plage Is Nothing Then
                Set plage = Rows(curlig)
            Else
                Set plage = Union(plage, Rows(curlig))
            End If
        End If
    Next
    If Not plage Is Nothing Then plage.EntireRow.Delete
    Calculate
    timestop = Timer - timestart
    msgtxt = "Del hidden rows duration: " & timestop
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Application.Calculation = xlAutomatic
    MsgBox (msgtxt)
End Sub

A+
 
Re : effacer lignes cachées

Merci pour cette réponse rapide.

dans mon cas, il s'agit bien d'effacer les lignes cachées ...

je pense que
Code:
derlig = Range("A" & Rows.Count).End(xlUp).Row
ne prend en compte que les lignes visibles.

c'est la raison pour laquelle j'étais passé par une boucle do until.

une idée pour compter rapidement le nombre de lignes (visibles et cachées) ... sans faire une boucle qui passe en revue les lignes une à une ?

bonne journée !
 
Re : effacer lignes cachées

re,

tu peux remplacer:

Code:
derlig = Range("A" & Rows.Count).End(xlUp).Row

Par

Code:
derlig = usedRange.rows.count

sinon,

fais une boucle Do....Loop si tu veux, mais l'idée est de créer une plage de cellules à effacer en un seul coup, ce qui est extrêmement plus rapide.

Code:
        If Rows(curlig).Hidden = True Then
            If plage Is Nothing Then
                Set plage = Rows(curlig)
            Else
                Set plage = Union(plage, Rows(curlig))
            End If
        End If
et en sortie de boucle:
Code:
    If Not plage Is Nothing Then plage.EntireRow.Delete

A+
 
Re : effacer lignes cachées

un grand merci !

pour un nombre de lignes cachée comparable, je suis passé 185 s à ... 4,8 s !

j'ai bien retenu l'utilisation très efficace de Union()

Reste à creuser usedRange.rows.count ... dans mon cas, je démarre à la ligne 9

merci encore
 
Re : effacer lignes cachées

pour info:

compter le nombre de ligne à partir de la ligne 9 incluse c'est

Code:
nb_lig = ActiveSheet.UsedRange.Rows("9:" & ActiveSheet.UsedRange.Rows.Count).Count

bonne journée
 
Re : effacer lignes cachées

Re,

usedRange.rows.count

Te donne le nombre de lignes utilisées dans la feuille.

Si tu fais une boucle For en partant de curlig=9 jusqu'à 'UsedRange.rows.count' pas de problème.

Mais une boucle Do...Loop va très bien aussi mais t'oblige à inclure un test sur une cellule(si vide) ce qui représente un coût en temps plus élevé.

De façon générale, dans une boucle longue ,moins tu fais référence aux cellules et plus c'est rapide.

Dans ta boucle originelle tu avais 3 références à la même cellule, avec en plus un 'Select' aussi inutil que gourmand en temps.

Si un jour tu es obligé d'en passé par des références multiple à une même cellule ou plage de cellule, il vaut mieux créer une référence explicite:
Code:
Dim c as Range
Dim CurLig As Long
For i =1 to 50000
  Set c=Cells(CurLig,1)
     If IsEmpty(c) then
         c.offset(,2)="toto"
         c.value=i
   End If
Next c

C'est plus rapide que d'obliger excel à calculer 3 fois Cells(CurLig,1).

A+

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

L
Réponses
9
Affichages
1 K
Réponses
8
Affichages
1 K
N
Réponses
10
Affichages
5 K
Nicocotte125
N
N
Réponses
5
Affichages
3 K
Nicocotte125
N
F
Réponses
2
Affichages
683
Fonziino
F
Réponses
1
Affichages
1 K
N
Réponses
4
Affichages
2 K
nomitse
N
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…