Accélerer macro avec un tableau

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.
 

Pierrot93

XLDnaute Barbatruc
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
@+
 

Gorfael

XLDnaute Barbatruc
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+
 

rouillld

XLDnaute Nouveau
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.
 

Gorfael

XLDnaute Barbatruc
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+
 

rouillld

XLDnaute Nouveau
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 ?
 

MJ13

XLDnaute Barbatruc
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 :) .
 

Statistiques des forums

Discussions
312 391
Messages
2 087 973
Membres
103 690
dernier inscrit
LeDuc