Optimiser code VBA masquer ligne

Bonjour à tous,

Je souhaiterais "optimiser" un code VBA (je suis débutant) pour masquer des lignes inutiles dans un fichier excel.

J'ai effectivement une longue base de données et toutes les lignes ne sont pas utiles. J'ai ajouté une colonne indiquant 0 ou 1 selon que je souhaite afficher la ligne ou non. Je précise que le reste des données ne peux pas être mis sous forme de tableau avec un simple filtre en décochant "0".

J'ai donc créé une macro qui parcourt les différentes lignes de mon fichier et s'il est indiqué 0 en colonne A, alors la ligne est masquée. Cette macro est très lente et je voudrais savoir si une ame charitable pourrait reformuler mon code pour qu'il soit plus efficace.

Merci d'avance et bonne journée,

Mav'

Sub MasquerLigneACondition()

'paramètres avant macro
    Application.ScreenUpdating = False
    Application.DisplayStatusBar = False
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False

'input

LigneDebut = 1
LigneFin = 2000
NumeroColonne = 1

'code

Sheets("PEM PV").Select

For i = LigneDebut To LigneFin

If Cells(i, NumeroColonne).Value <> 1 Then
    Cells(i, NumeroColonne).EntireRow.Hidden = True
Else
    Cells(i, NumeroColonne).EntireRow.Hidden = False
End If

Next i

'paramètres après macro

  Application.ScreenUpdating = True
  Application.DisplayStatusBar = True
  Application.Calculation = xlCalculationAutomatic
  Application.EnableEvents = True
  ActiveSheet.DisplayPageBreaks = True
  ActiveWorkbook.RefreshAll
  Call turpe

End Sub

bonjour,

Cette macro devrait convenir :

Sub MasquerLigneACondition()
Dim Arr, i%
Sheets("PEM PV").Select
Arr = Range("A1:A2000").Value
For i = 2000 To 1 Step -1
Cells(i, 1).EntireRow.Hidden = Arr(i, 1) = 0
Next
  Call turpe
End Sub

A+

Merci beaucoup Galopin !

Ca fonctionne parfaitement.

J'avoue ne pas trop saisir comment vous arrivez en 3 lignes à optimiser un code qui m'a fallu écrire longtemps (je débute).

Pour mon information,

1) pourquoi l'utilisation d'un tableau rend plus rapide le traitement de la macro ?

2) pourquoi parcourir les lignes de la fin vers le début ?

Bravo et encore merci.

Bonjour,

1- Pourquoi l'utilisation d'un tableau rend plus rapide le traitement de la macro ? L'utilisation d'un tableau(Array) au lieu de parcourir une feuille est environ 20 fois plus rapide ?

Parce que dans un Array vous ne considérez que les valeurs des cellules concernées. Quand vous travaillez sur une feuille vous travaillez dans un fatras de trucs sur 1 millions de lignes et des milliers de colonnes. Dans ce fatras votre code dois éliminer tout ce qui ne lui sert à rien, les objets,les propriétés couleurs, formules et autres joyeusetés qui même si on essaie d'inhiber les recalcul, ne lui servent en réalité à rien. Une seule chose l'intéresse la valeur de la cellule 1 de chaque ligne.

Ici vous récupérez en une seule ligne toutes les valeurs clefs puis vous récupérez en une seule boucle les index et la caractéristique visible de la ligne.

2- Pourquoi j'ai procédé à l'envers ? Parce que dans ce cas il n'y aucun affichage possible puisque les dernières lignes sont masquées... c'est surtout l'affichage qui ralentirait le processus, ici au pire vous n'avez vu que le rafraichissement des "30 dernières lignes...

Cette méthode est surtout utilisé dans le cas de suppression de ligne car en plus de l'affichage, la suppression doit gérer, la réorganisation des index de ligne à chaque suppression : La progression de votre variable est constantes en progression inverse.

Dans une progression de 1 à 2000 si vous supprimez la ligne 1 elle disparait et la ligne 2 devient la nouvelle ligne 1 mais comme la boucle For... va vous faire passer à 2, l'ancienne ligne 2 ne sera jamais testée vous testerez sans le savoir en réalité la ligne 3 : Le résultat sera décevant.

Nota : J'ai fait l'impasse sur le recalcul automatique puisque le masquage deslignes n'affecte pas les valeurs.

A+

Rechercher des sujets similaires à "optimiser code vba masquer ligne"