Accélerer macro avec un tableau

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 !

rouillld

XLDnaute Nouveau
Bonjour à toutes et à tous,

La macro suivante permet de masquer ou d'afficher certaines lignes en fonction d'une valeur de la colonne B (1, 2 ou 3), me permettant d'effectuer un profil d'affichage.
Elle marche très bien, le seul problème est la lenteur d'exécution, même avec un PC récent :

Sub Afficher_ligne_1&3()

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

Range("B1:B" & Range("B65536").End(xlUp).Row).Select
For Each o In Selection
If o.Value = 1 Then
o.EntireRow.Hidden = False
Else
If o.Value = 2 Then
o.EntireRow.Hidden = True
Else
If o.Value = 3 Then
o.EntireRow.Hidden = False
End If
End If
End If

Next

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

L'utilisation de tableau variant pour la plage à analyser (le Range(...) )permet, semblerait-il d'accélerer le traitement des données. Je suppose qu'il faut déclarer le tableau, passer le Range(....).Select en Range(....).Value et utiliser le tableau dans la boucle pour masquer / afficher les lignes désirées... Mais, bon, encore une fois, impossible d'arriver à un truc qui marche.

Quelqu'un peut-il m'éclairer sur la question ? Merci d'avance.
 
Re : Accélerer macro avec un tableau

Bonjour,

avant le tableau virtuel, essaye peut être ceci si j'ai bien compris :
Code:
Sub test()
Dim o As Range
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
Range("B1:B" & Range("B65536").End(xlUp).Row).EntireRow.Hidden = False
For Each o In Range("B1:B" & Range("B65536").End(xlUp).Row)
    o.EntireRow.Hidden = o.Value = 2
Next
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

bonne fin d'après midi
@+
 
Re : Accélerer macro avec un tableau

Salut rouillld et le forum
Pour la macro, la réponse de Pierrot (Salutations)

Mais... sans macro ? Juste avec un filtre automatique (différent de 2) ? On peut aussi mettre le filtre avec une macro
A+
 
Re : Accélerer macro avec un tableau

Merci pour vos réponses,

Pierrot, ton code est en effet plus court, plus structuré et un peu plus rapide que le mien.

Gorfael, c'est vrai, tu as raison, je n'y avais pas pensé, l'idéal serait de le mettre en macro (j'ai plusieurs profils d'affichage de lignes associé à une liste déroulante). Avec l'enregistreur, celà donne ceci :

Sub Macro1()

Columns("B:B").Select
Selection.AutoFilter
ActiveSheet.Range("$B$1:$B$540").AutoFilter Field:=1, Criteria1:=Array("0", "1", "3"), Operator:=xlFilterValues

End Sub

Le Range("$B$1:$B$540") peut être remplacé par Range("B1:B" & Range("B65536").End(xlUp).Row) => nickel
par contre, je ne peux effectuer de copier-coller et de déplacer-insérer pendant que le filtre est actif.
En plus, si je désactive le filtre, toutes les lignes réapparaissent dans la configuration précédente.
N'y a-t-il pas possibilité, après filtrage, de garder les lignes que l'on veut masquées, mais sans avoir les numéros de ligne en bleu (signifiant que le filtre est actif) ?

Merci d'avance pour vos réponses.
 
Re : Accélerer macro avec un tableau

Salut rouillld et le forum
J'aurais plutôt vu
Code:
Sub Macro1()
ActiveSheet.AutoFilterMode = False
Range("$B$1:$B$540").AutoFilter Field:=1, Criteria1:="<>2"
End Sub
Mais, chacun sa vision
Code:
par contre, je ne peux effectuer de copier-coller
Pourquoi ? Si tu fais un copier d'une plage filtrée suivie d'un coller sur une plage non filtrée, tu n'as que les lignes visibles qui sont collées.
A+
 
Re : Accélerer macro avec un tableau

Salut Gorfael,
Merci pour ton aide, ton code est meilleur

Sub Macro1()
ActiveSheet.AutoFilterMode = False
Range("B1:B" & Range("B65536").End(xlUp).Row).AutoFilter Field:=1, Criteria1:="<>2"
End Sub

C'est vrai que le filtrage est puissant et très rapide, surtout pour les gros fichiers.
Pour le copier-coller, je me suis mal exprimé. Je suis amené à effectuer des copier insérer (ctrl+maj+déplacer avec souris) ou des déplacer(maj+déplacer avec la souris) à l'intérieur d'une plage déjà filtrée. Dans ce cas, excel m'insère une ligne vierge ou rien du tout...

Je me répète encore, mais, n'y a-t-il pas possibilité, après filtrage, de garder les lignes que l'on veut masquées, après avoir désactivé le filtre ?
 
Re : Accélerer macro avec un tableau

Bonjour Roullid, Pierrot, Gorfael

Je me répète encore, mais, n'y a-t-il pas possibilité, après filtrage, de garder les lignes que l'on veut masquées, après avoir désactivé le filtre ?

Peut-être qu'avec un fichier, cela permettra de mieux répondre à ton problème car en matière d'extraction de données, on peut voir tout et son contraire 🙂 .
 
- 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

Discussions similaires

  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
  • Question Question
Microsoft 365 Probléme VBA
Réponses
8
Affichages
504
Réponses
5
Affichages
777
Réponses
7
Affichages
308
Retour