Filtre si valeur dans une céllule

Bonjour,

J'ai une macro qui me permet d'afficher les lignes dont il y a une valeur dans la cellule d'une colonne définie.

cela fonctionne mais le processus est très lent

Quelqu'un aurait une idée pour accélérer le processus :

Sub HideLines()
 x = ActiveSheet.Name
 y = ActiveCell.Column
        With ThisWorkbook.Worksheets(x)
            Application.ScreenUpdating = False
            n = .Cells(.Rows.Count, 4).End(xlUp).Row
            For i = 6 To n
                If Application.WorksheetFunction.CountBlank(Range(Cells(i, y), Cells(i, y))) = 1 Then
                Rows(i).EntireRow.Hidden = True
                End If
            Next i
        End With
    End Sub
    

Merci à tous,

Loadlucas

Bonjour,

Tu te compliques la vie avec cette ligne :

If Application.WorksheetFunction.CountBlank(Range(Cells(i, y), Cells(i, y))) = 1 Then Rows(i).EntireRow.Hidden = True

Sauf erreur de ma part, tu cherches juste à savoir si la cellule est vide, ce que VBA fait très facilement avec :

If IsEmpty(Cells(i, y)) Then Rows(i).EntireRow.Hidden = True

Ensuite, pour accélerer la macro, tu peux utiliser :

Application.ScreenUpdating = False 'Désactive l'affichage
Application.Calculation = xlCalculationManual 'Désactive le recalcule auto des formule Excel
'Ton code
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

Enfin, ta procédure peut être accélérée en utilisant plutôt un Auto Filtre (sélectionne tes en-têtes, puis "Données" --> "Filtrer"). Il suffit ensuite de s'inspirer du code obtenu par l'enregistreur de macro pour l'adapter à ton besoin. L'avantage est qu'il n'est pas nécessaire de parcourir ligne par ligne ton fichier, du moment que la plage de travail est correctement renseignée.

Super ça fonctionne parfaitement :

Sub HideLines()
 x = ActiveSheet.Name
 y = ActiveCell.Column
        With ThisWorkbook.Worksheets(x)
            Application.ScreenUpdating = False
            Application.Calculation = xlCalculationManual
            n = .Cells(.Rows.Count, 4).End(xlUp).Row
            For i = 6 To n
                If IsEmpty(Cells(i, y)) Then
                Rows(i).EntireRow.Hidden = True
                End If
            Next i
        End With
    End Sub

J'active cette macro via un bouton situé au dessus de la colonne à filtrer.

Auriez-vous une idée afin que la valeur y = ActiveCell.Column soit définie par mon clique de souris ?

Ainsi, si je clique sur le bouton dans la colonne où je veux filtrer, y = le numéro de la colonne.

Ceci, pour ne pas nettoyer malencontreusement une colonne non désirée si la cellule sélectionnée n'était pas dans la colonne à nettoyer (ActiveCell.Column).

Clique de souris = ActiveCell.Column

Cette méthode me permettrait de copier/coller les boutons dans les colonnes et feuilles que je désire en utilisant la même et unique macro

Merci à vous

Loadlucas

Une exécution malencontreuse n'est pas grave, puisque tu ne supprimes pas de ligne, tu ne fais que les masquer. En fait, je ne vois même pas pourquoi tu t'embêtes à faire une macro, là où un bête AutoFiltre te fais ça tout seul, et plus rapidement sans doute.

autof1 autof2
Rechercher des sujets similaires à "filtre valeur"