Sélection de plusieurs lignes NON-consécutives et application d'un formatage à c

Résolu
RoGx Messages postés 10 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 9 mars 2010 - 9 mars 2010 à 21:57
RoGx Messages postés 10 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 9 mars 2010 - 9 mars 2010 à 23:14
bonjour,

Je souhaite cacher certaines lignes de mon fichier Excel selon la valeur qui apparait dans une colonne de chacune des lignes. J'y suis arrivé et cela fonctionne bien. Par contre, le processus est très lent et l'affichage "clignote" durant le tri. Je suppose que c'est parce que j'évalue chacune des lignes et applique le format une ligne à la fois.

Je voudrais savoir s'il y a un moyen de créer un "range" ou un autre moyen de sélectionner plusieurs lignes dans un fichier excel QUI NE SONT PAS CONSÉCUTIVES et donc la valeur d'un des colonnes est la meme. Donc, je cherche un moyen de faire en VBA ce que l'usager fait en enfoncant CTRL et en cliquant sur chacune des qu'il veut sélectionner.

Une fois la sélection créée, je vais la cacher ou l'afficher d'un seul coup et j'espère que ce sera plus rapide.

voici mon code en ce moment (qui fonctionne), mais qui est très lent étant donné le nombre de lignes dans ma feuille.

merci de votre aide!

Private Sub AfficherLignesSelectionnees()
    
    Dim i As Integer
    
    For i = 1 To UsedRange.Rows.Count
        If ((UsedRange(i, 13).Value "EN COURS" And ChkAfficherEnCours.Value True) Or _
            (UsedRange(i, 13).Value "EN SUIVI" And ChkAfficherEnSuivi.Value True) Or _
            (UsedRange(i, 13).Value "FERMÉ" And ChkAfficherFerme.Value True) Or _
            (UsedRange(i, 13).Value <> "FERMÉ" And UsedRange(i, 13).Value <> "EN COURS" And UsedRange(i, 13).Value <> "EN SUIVI")) Then
            
            'la ligne doit être affichée
            Call RowShow(i, True)
        Else
            'la ligne doit être cachée
            Call RowShow(i, False)
        End If
    Next
    
End Sub

Sub RowShow(myRow As Integer, bShow As Boolean)
    
    Rows(myRow & ":" & myRow).Select
    If (Selection.EntireRow.Hidden <> IIf(bShow = True, False, True)) Then
        Selection.EntireRow.Hidden IIf(bShow True, False, True)
    End If

End Sub

1 réponse

RoGx Messages postés 10 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 9 mars 2010
9 mars 2010 à 23:14
Oubliez ca, j'ai trouvé... et c'est SUPERBE.... fonctionne très rapidement et tout... alors pour la postérité:

Private Sub executerFiltre()
    
    Dim i As Integer
    Dim rMultiAfficher As range
    Dim rMultiCacher As range
    
    For i = 1 To UsedRange.Rows.Count
        If ((UsedRange(i, 13).Value "EN COURS" And ChkAfficherEnCours.Value True) Or _
            (UsedRange(i, 13).Value "EN SUIVI" And ChkAfficherEnSuivi.Value True) Or _
            (UsedRange(i, 13).Value "FERMÉ" And ChkAfficherFerme.Value True) Or _
            (UsedRange(i, 13).Value <> "FERMÉ" And UsedRange(i, 13).Value <> "EN COURS" And UsedRange(i, 13).Value <> "EN SUIVI")) Then
            
            'la ligne doit être affichée
            Set rMultiAfficher = Union(rMultiAfficher, Cells(i, 1))
        Else
            'la ligne doit être cachée
            Set rMultiCacher = Union(rMultiCacher, Cells(i, 1))
        End If
    Next
    
    'Activation de la propriété sur les 2 plages
    If (Not rMultiAfficher Is Nothing) Then rMultiAfficher.EntireRow.Hidden = False
    If (Not rMultiCacher Is Nothing) Then rMultiCacher.EntireRow.Hidden = True
    
End Sub

Function Union(Rng1 As range, Rng2 As range) As range
    If Rng1 Is Nothing Then
        Set Union = Rng2
    ElseIf Rng2 Is Nothing Then
        Set Union = Rng1
    Else
        Set Union = Application.Union(Rng1, Rng2)
    End If
End Function



Bonne journée!
3
Rejoignez-nous