VBA Afficher/Masquer cellules selon leur couleur

Résolu
bkssm5589 Messages postés 17 Statut Membre -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

comment on fait ( macro / VBA ), dans une feuille avec plusieurs cellules de différentes couleurs de n'afficher / masquer que les cellules dont la couleur nous intérésse ?

Merci

9 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Inutile de doublonner, nous allons te répondre ici.

    Comment sont obtenues les couleurs dans ta feuille? Mise en forme conditionnelle ou saisies par l'utilisateur?
    Qu'elles sont les lignes et colonnes concernées?
    1
  2. bkssm5589 Messages postés 17 Statut Membre
     
    Re-bonjour

    Les couleurs dans la cellules sont obtenus en fonction d'"un mot" figurant dans la cellule à l'aide de :
    Private Sub worksheet_selectionchange(ByVal target As Range)
    ligne = ActiveCell.Row
    colonne = ActiveCell.Column
    If InStr(Cells(ligne, colonne), "Entreprise1 ") Then
    Cells(ligne, colonne).Interior.ColorIndex = 36
    Cells(ligne, colonne + 1).Interior.ColorIndex = 36
    End If
    end sub

    et j'ai plus de 15 couleurs ( 15 entreprises )
    lignes concernées sont : 5 à 23
    colonnes concernées : C à BF

    Merci d'avance
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Tu dis :
      j'ai plus de 15 couleurs ( 15 entreprises )
      Or, dans le code que tu nous donnes, je ne vois qu'une entreprise et une couleur.
      Peux tu, stp, nous donner le code entier?
      0
    2. bkssm5589 Messages postés 17 Statut Membre
       
      comme c'est le même code je voulais éviter de vous copier toute la page
      le voila :
      Private Sub worksheet_selectionchange(ByVal target As Range)
      ligne = ActiveCell.Row
      colonne = ActiveCell.Column
      If InStr(Cells(ligne, colonne), "entreprise 1") Then
      Cells(ligne, colonne).Interior.ColorIndex = 36
      Cells(ligne, colonne + 1).Interior.ColorIndex = 36
      End If
      If InStr(Cells(ligne, colonne), "entreprise 2") Then
      Cells(ligne, colonne).Interior.ColorIndex = 10
      Cells(ligne, colonne + 1).Interior.ColorIndex = 10
      End If
      If InStr(Cells(ligne, colonne), "entreprise 3") Then
      Cells(ligne, colonne).Interior.ColorIndex = 3
      Cells(ligne, colonne + 1).Interior.ColorIndex = 3
      End If
      If InStr(Cells(ligne, colonne), "entreprise 4") Then
      Cells(ligne, colonne).Interior.ColorIndex = 37
      Cells(ligne, colonne + 1).Interior.ColorIndex = 37
      End If
      If InStr(Cells(ligne, colonne), "entreprise 5")Then
      Cells(ligne, colonne).Interior.ColorIndex = 24
      Cells(ligne, colonne + 1).Interior.ColorIndex = 24
      End If
      If InStr(Cells(ligne, colonne), "entreprise 6") Then
      Cells(ligne, colonne).Interior.ColorIndex = 40
      Cells(ligne, colonne + 1).Interior.ColorIndex = 40
      End If
      If InStr(Cells(ligne, colonne), "entreprise 7") Then
      Cells(ligne, colonne).Interior.ColorIndex = 7
      Cells(ligne, colonne + 1).Interior.ColorIndex = 7
      End If
      If InStr(Cells(ligne, colonne), "entreprise 8") Then
      Cells(ligne, colonne).Interior.ColorIndex = 46
      Cells(ligne, colonne + 1).Interior.ColorIndex = 46
      End If
      If InStr(Cells(ligne, colonne), "entreprise 9") Then
      Cells(ligne, colonne).Interior.ColorIndex = 43
      Cells(ligne, colonne + 1).Interior.ColorIndex = 43
      End If
      If InStr(Cells(ligne, colonne), "entreprise 10") Then
      Cells(ligne, colonne).Interior.ColorIndex = 27
      Cells(ligne, colonne + 1).Interior.ColorIndex = 27
      End If
      If InStr(Cells(ligne, colonne), "entreprise 11") Then
      Cells(ligne, colonne).Interior.ColorIndex = 22
      Cells(ligne, colonne + 1).Interior.ColorIndex = 22
      End If
      If InStr(Cells(ligne, colonne), "entreprise 12") Then
      Cells(ligne, colonne).Interior.ColorIndex = 39
      Cells(ligne, colonne + 1).Interior.ColorIndex = 39
      End If
      If InStr(Cells(ligne, colonne), "entreprise 13") Then
      Cells(ligne, colonne).Interior.ColorIndex = 8
      Cells(ligne, colonne + 1).Interior.ColorIndex = 8
      End If

      End Sub
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      ok. C'était nécessaire pour avoir les codes couleurs.
      Je regarde pour :
      1- modifier ton code qui est énorme
      2- te faire un système d'affichage / masquage.
      Réponse dans la mâtinée.
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Question subsidiaire :
      Les cellules ou sont tes noms d'entreprises sont toutes dans la même colonne? ColonneB? C?
      0
    5. bkssm5589 Messages postés 17 Statut Membre
       
      non elle vont des collones "C" à " BF "
      0
  3. bkssm5589 Messages postés 17 Statut Membre
     
    Merci énormélement,
    je suis entrain de travailler dessus
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      N'hésite pas à revenir si cela fonctionne ... ou pas!
      0
    2. bkssm5589 Messages postés 17 Statut Membre
       
      j'ai essayé , votre programme marche super bien , sauf que moi j'ai besoin de filtrer les cellules de même couleur, pas toute la ligne
      0
  4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    filtrer les cellules de même couleur, pas toute la ligne
    Je ne comprends pas...
    Prenons un exemple.
    Tu as, dans ton Range("C5:BF23") 5 cellules rouge (colorindex = 3) situées en : C18, G5, AZ23, BA5 et BA6. Tu ne veux avoir affiché à l'écran que ces 5 cellules???
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. bkssm5589 Messages postés 17 Statut Membre
     
    voilà le lien à une partie du tableau ,
    le filtre que vous m'avez proposé se fait sur la ligne , ce qui fait , j'ai des cellules sur la même ligne faisant référence à d'autre entreprises qui restent affichées

    https://www.cjoint.com/?3DyovIC4xXH
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      En fait, un filtre s'applique soit sur toute la ligne, soit sur toute la colonne...

      Si tu veux n'obtenir que tes cellules rouges, il faut les copier/coller sur une autre Feuille par exemple...
      Je te fais ça sur mon classeur exemple.
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      premier exemple :
      Sub FiltreSurCouleur()
      If ActiveCell.Interior.ColorIndex = xlNone Then MsgBox "Merci de sélectionner une cellule colorée pour le filtre.": Exit Sub
      Filtrer ActiveCell.Interior.ColorIndex
      End Sub
      
      Sub Filtrer(coul As Integer)
      Dim lig As Integer, col As Integer, ligF2 As Integer, colF2 As Integer
      
      With Sheets("Feuil2")
          For lig = 5 To 23 'de la ligne 5 à la ligne 23
              For col = 3 To 59 ' de la colonne C à BF
                  If Sheets("Feuil1").Cells(lig, col).Interior.ColorIndex = coul Then Sheets("Feuil1").Cells(lig, col).Copy .Cells(lig, col)
              Next col
          Next lig
          .Activate
      End With
      End Sub
      0
  7. bkssm5589 Messages postés 17 Statut Membre
     
    et pour répondre à votre question , c'est oui !
    0
  8. bkssm5589 Messages postés 17 Statut Membre
     
    Merci beaucoup , ça m'a beaucoup aidé
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      De rien.
      A+
      0
  9. bkssm5589 Messages postés 17 Statut Membre
     
    Bonjour ,

    je reviens vers vous pour savoir comment adapter le code que vous m'avez passé hier afi nde pouvoir filtrer des colonnes

    Sub Filtrer(Coul As Integer)
    Dim lig As Integer, col As Integer, Masque As Boolean

    For lig = 5 To 34
    Masque = True
    For col = 3 To 59
    If Cells(lig, col).Interior.ColorIndex = Coul Then Masque = False
    Next col
    If Masque = True Then Rows(lig).Hidden = True
    Next lig
    End Sub

    Merci d'avance

    cordialement
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bonjour,

      Simplement.
      Tu détermines tes cellules en fonction de deux critères : la ligne (variable lig) et la colonne (variable col).
      Si tu veux masquer la colonne au lieu de la ligne, il convient de remplacer: Rows(machin) par Columns(truc)
      Par contre, comme nous avons une double boucle, d'abord sur les lignes puis sur les colonnes, il nous faudra les inverser...
      Résultat
      Sub Filtrer(Coul As Integer) 
      Dim lig As Integer, col As Integer, Masque As Boolean 
      
      For col = 3 To 59
          Masque = True
          For lig = 5 To 34 
              If Cells(lig, col).Interior.ColorIndex = Coul Then Masque = False 
          Next lig
          If Masque = True Then Columns(col).Hidden = True 
      Next col
      End Sub
      0
  10. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bon, voici ma proposition :

    Un classeur exemple.

    Dans le module de la feuille concernée :
    La macro de coloriage de cellules au clic dans une cellule :
    Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Dim Texte As String, NomsEntreprises As Variant, i As Integer 
    
    If Target.Count > 1 Then Exit Sub 
    NomsEntreprises = RempliEntreprises 
    Texte = "" 
    For i = LBound(NomsEntreprises) To UBound(NomsEntreprises) 
        If InStr(Target.Value, NomsEntreprises(i)) Then Texte = NomsEntreprises(i): Exit For 
    Next i 
    If Texte <> "" And Not IsError(Application.Match(Texte, RempliEntreprises, 0)) Then Range(Target, Target.Offset(0, 1)).Interior.ColorIndex = Colorer(Texte) 
    End Sub

    Pour que cette macro fonctionne, il faut placer ces trois fonctions dans un module standard :
    Function RempliCouleurs() As Variant 
    RempliCouleurs = Array(36, 10, 3, 37, 24, 40, 7, 46, 43, 27, 22, 39, 8) 
    End Function 
    
    'A ADAPTER : 
    'les noms des entreprises ci-dessous, 
    'dans le même ordre que les couleurs ci-dessus 
    
    Function RempliEntreprises() As Variant 
    RempliEntreprises = Array("Renault", "Peugeot", "Citroën", "Fiat", "Ferrari", "Porsche", "Lada", "Seat", "Wolksvagen", "Honda", "BMW", "Mercedes", "Ford") 
    End Function 
    
    Function Colorer(Entreprise) 
    Colorer = RempliCouleurs(Application.Match(Entreprise, RempliEntreprises, 0) - 1) 
    End Function


    La macro qui filtre comprends deux procédures, les placer dans un module standard également (le même) :
    Sub FiltreSurCouleur() 
    If ActiveCell.Interior.ColorIndex = xlNone Then MsgBox "Merci de sélectionner une cellule colorée pour le filtre.": Exit Sub 
    Range("C5:BF23").EntireRow.Hidden = False 
    Filtrer ActiveCell.Interior.ColorIndex 
    End Sub 
    
    Sub Filtrer(Coul As Integer) 
    Dim lig As Integer, col As Integer, Masque As Boolean 
    
    For lig = 5 To 23 'de la ligne 5 à la ligne 23 
        Masque = True 
        For col = 3 To 59 ' de la colonne C à BF 
            If Cells(lig, col).Interior.ColorIndex = Coul Then Masque = False 
        Next col 
        If Masque = True Then Rows(lig).Hidden = True 
    Next lig 
    End Sub

    pour filtrer, sélectionner un cellule de la couleur voulue et lancer la macro FiltreSurCouleur...

    En bonus, cette procédure colorie toutes les cellules de C5 à BF23 qui contiennent une des entreprises...
    Sub ColorieToutLeRangeC5BF23() 
    Dim Cel As Range, Cpt As Integer, Texte As String, NomsEntreprises As Variant, i As Integer 
    
    NomsEntreprises = RempliEntreprises 
    For Each Cel In Range("C5:BF23") 
        Texte = "" 
        For i = LBound(NomsEntreprises) To UBound(NomsEntreprises) 
            If InStr(Cel.Value, NomsEntreprises(i)) Then Texte = NomsEntreprises(i): Exit For 
        Next i 
        If Texte <> "" And Not IsError(Application.Match(Texte, RempliEntreprises, 0)) Then Range(Cel, Cel.Offset(0, 1)).Interior.ColorIndex = Colorer(Texte) 
    Next Cel 
    End Sub


    Cordialement,
    Franck P
    -1