masquer les lignes ne contenant pas une cellule "jaune"

vadelacaisse

XLDnaute Junior
Bonjour

J’utilise un fichier de calcul de quelques milliers de lignes
j'ai habitude de mettre sur fond jaune (le jaune standard d'Excel) les cellules sans valeur ou avec une valeur provisoire

Au final, je recherche toutes les cellules jaunes à compléter ou corriger : c'est parfois long !

Est-il possible avec une macro de masquer toutes les lignes ne contenant pas au moins une cellule jaune ?
Puis de tout afficher ensuite ? Sans chambouler le tableau...
Le filtrage sur une couleur ne convient pas car il déplace les cellules !

merci de votre aide
 

job75

XLDnaute Barbatruc
Re : masquer les lignes ne contenant pas une cellule "jaune"

Bonjour vadelacaisse,

Filtrage de plusieurs couleurs dans le fichier joint avec cette macro :

Code:
Sub Filtre()
Dim ref As Range, a As Range, coul&, b As Range
Set ref = [B8:B39] 'à adapter
ref = "" 'RAZ
For Each a In [B2:B6] 'cellules liées aux cases à cocher
  If a Then
    coul = a(, 0).Interior.Color 'en colonne A
    For Each b In ref.Offset(, 1).Resize(, 17)
      If b.Interior.Color = coul Then Cells(b.Row, 2) = 1
    Next
  End If
Next
ref.AdvancedFilter xlFilterInPlace, [A8:A9]
End Sub
Le filtre avancé est utilisé.

A+
 

Pièces jointes

  • Filtre couleur(1).xlsm
    24.5 KB · Affichages: 67
  • Filtre couleur(1).xlsm
    24.5 KB · Affichages: 77
  • Filtre couleur(1).xlsm
    24.5 KB · Affichages: 66

job75

XLDnaute Barbatruc
Re : masquer les lignes ne contenant pas une cellule "jaune"

Re,

Vous parliez de quelques milliers de lignes.

J'ai donc copié le tableau précédent jusqu'à la ligne 6208.

Ce code est plus rapide grâce à Exit For qui fait passer à la ligne suivante :

Code:
Sub Macro()
'permet à la case à cocher d'être cochée immédiatement
Application.OnTime 1, "FiltreCouleur"
End Sub

Sub FiltreCouleur()
Dim t#, ref As Range, ncol%, P As Range, a As Range, coul&, i&, j%
t = Timer
Set ref = [B8:B6208] 'à adapter
ncol = 17 'nombre de colonnes du tableau, à adapter
Set P = ref.Offset(, 1).Resize(, ncol)
Application.ScreenUpdating = False 'pour accélérer
ref = "" 'RAZ
For Each a In [B2:B6] 'cellules liées aux cases à cocher
  If a Then
    coul = a(, 0).Interior.Color 'en colonne A
    For i = 1 To P.Rows.Count
      If ref(i) = "" Then
        For j = 1 To ncol
          If P(i, j).Interior.Color = coul Then ref(i) = 1: Exit For
        Next
      End If
    Next
  End If
Next
ref.AdvancedFilter xlFilterInPlace, [A8:A9]
MsgBox "Durée " & Format(Timer - t, "0.0 \s") 'mesure facultative
End Sub
Les durées d'exécution sont de quelques secondes.

Fichier (2).

A+
 

Pièces jointes

  • Filtre couleur(2).xlsm
    403.6 KB · Affichages: 61
  • Filtre couleur(2).xlsm
    403.6 KB · Affichages: 62
  • Filtre couleur(2).xlsm
    403.6 KB · Affichages: 67
Dernière édition:

vadelacaisse

XLDnaute Junior
Re : masquer les lignes ne contenant pas une cellule "jaune"

Bonjour
et merci pour cette réponse rapide
c'est impressionnant !
mais je suis loin de comprendre la syntaxe de macro

elle a même un plus : pouvoir sélectionner une ou plusieurs couleurs - cette possibilité m'intéresse en fin de compte

par contre, la colonne B avec ses 1 - que je ne comprends pas :confused:- me gène...
mes colonnes A à C sont occupées et les couleurs seront dans les colonnes D à N
la colonne avec les 1 est indispensable ?
peut-on la mettre après (en Z par exemple ?)

vu que j'ai encore d'autres couleurs, Est-ce qu'une autre macro permettrait de tout réafficher, sans cliquer sur toutes les couleurs possibles, comme ici ?

merci
 

job75

XLDnaute Barbatruc
Re : masquer les lignes ne contenant pas une cellule "jaune"

Bonjour vadelacaisse, le forum,

Je pense que ce fichier (3) correspond à ce que vous voulez.

Bonne journée.
 

Pièces jointes

  • Filtre couleur(3).xlsm
    274.9 KB · Affichages: 70

job75

XLDnaute Barbatruc
Re : masquer les lignes ne contenant pas une cellule "jaune"

Re,

Allez un p'tit digestif.

La liste des couleurs à filtrer peut être dans une autre feuille.

Il faut juste assurer une correspondance avec les cellules liées, fichier (4).

A+
 

Pièces jointes

  • Filtre couleur(4).xlsm
    283.1 KB · Affichages: 57
Dernière édition:

vadelacaisse

XLDnaute Junior
Re : masquer les lignes ne contenant pas une cellule "jaune"

bonsoir la version 4 me bottait déjà
la 5 me scie : on peut tout faire, avec si peu de code...

depuis plus de deux heures je bricole la 4 - (voir la 4 b, jointe)
pour des raisons d'encombrement :
- je commence le tri à la ligne 16
- j'ai déplacé les contrôles en 01:07 en mettant la couleur dessous

j'ai tenté d'adapter le code mais cela ne marche pas : mes excuses pour les bourdes :(

j'ai entouré en vert les zones "libres" dans mon fichier...

merci pour votre persévérance et votre imagination
 

Pièces jointes

  • masquer-les-lignes-4-b.xlsm
    276.9 KB · Affichages: 47

job75

XLDnaute Barbatruc
Re : masquer les lignes ne contenant pas une cellule "jaune"

Bonjour vadelacaisse, le forum,

Votre couleur "Rose" en O5 n'était pas la bonne, prenez ce fichier (2).

Par ailleurs, pour le cas où aucune case n'est cochée (filtre vide) :

- j'ai revu les bordures sur la ligne 6216

- j'ai ajouté ActiveCell.Activate, voyez la différence quand D15 ou E15 est sélectionnée.

Et bien sûr j'ai masqué les valeurs des cellules liées P2:p7.

A+
 

Pièces jointes

  • masquer-les-lignes(2).xlsm
    271.9 KB · Affichages: 53

job75

XLDnaute Barbatruc
Re : masquer les lignes ne contenant pas une cellule "jaune"

Re,

Un petit outil pour éviter de se fatiguer :

Code:
Sub RangerCases()
Dim a, P As Range, o As Object, i As Variant
a = Array("Afficher tout", "Bleu", "Vert", "Rose", "Jaune", "Inverser le filtrage")
Set P = [O2:O7] 'plage du rangement
For Each o In ActiveSheet.DrawingObjects
  i = Application.Match(o.Text, a, 0)
  If IsNumeric(i) Then
    o.Left = P(i).Left + 2 'à 2 points du bord gauche
    o.Top = P(i).Top + (P(i).Height - o.Height) / 2
  End If
Next
End Sub
A+
 

vadelacaisse

XLDnaute Junior
Re : masquer les lignes ne contenant pas une cellule "jaune"

Bonsoir
J'ai récupéré le dernier fichier en rentrant et j'a réussi à transposer tout dans le mien
Compris qu'il fallait créer les deux champs couleur et critères...
J'ai même pu limiter à 3 couleurs sans planter la macro :)
Le résultat est conforme : top !

J'ai remarqué que la macro ne détecte pas les cellules coloriées par un format conditionnel - pas grave, j'ai contourné
Dans mon fichier, le changement d'affichage prend 9 secondes - à cause de la flopée de formule de recherche, de conditionnels, je suppose - mon portable n'est pourtant pas "trop mauvais" (Elitebook HP) - la saisie est aussi à retardement, comme sur le cloud
je me demande ce qui se passerait si Excel devrait traiter bien plus de lignes - mon fichier ne fait que 2 Mo

je pense arriver à calquer une deuxième macro pour un autre onglet d'un format différent
j'ai compris à quoi serais le petit outil :rolleyes: - pas essayé - j'avais redimensionné les contrôles en affichage à 200%

un grand merci pour votre intervention efficace et assidue
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : masquer les lignes ne contenant pas une cellule "jaune"

Bonjour vadelacaisse, le forum,

1) Vous avez peut-être remarqué que le fichier (2) ne fonctionne pas correctement : cocher "Inverser le filtrage", puis cocher "jaune", puis décocher "jaune"...

Pour y remédier il faut mettre ActiveSheet.ShowAllData dans la macro FiltreCouleur.

2) Utiliser les Application.Calculation pour passer en calcul manuel pendant l'exécution de la macro.

Cela réduira peut-être la durée des calculs chez vous.

Utilisez donc ce fichier (3).

Bonne journée.
 

Pièces jointes

  • masquer-les-lignes(3).xlsm
    284.5 KB · Affichages: 57

job75

XLDnaute Barbatruc
Re : masquer les lignes ne contenant pas une cellule "jaune"

Re,

Au post #12 vous parlez de Mise en forme conditionnelle (MFC).

Voici un exemple qui filtre les 4 conditions de la MFC.

A+
 

Pièces jointes

  • Filtrer MFC(1).xlsm
    279.9 KB · Affichages: 65

vadelacaisse

XLDnaute Junior
Re : masquer les lignes ne contenant pas une cellule "jaune"

Bonsoir

Je n'ai pas pu encore tester le (3) au niveau de la rapidité sur mon fichier - faut que j'adapte pour ne pas détruire votre code...

Je viens d'essayer le (MFC) - il fonctionne parfaitement pour les MFC mais pas pour les celles colorées avec le menu
Mon souci est que je pouvais avoir les deux "cas jaunes" (MFC et normale) dans mon fichier
Mais j'ai trouvé une solution simple en mettant une couleur fixe où cela ne gênait pas : votre macro n'a pas à chercher des MCF

En parallèle, j'ai aussi collé dans mon fichier une macro d'ici (il me semble) pour compter les cellules jaunes
L'intérêt est de ne filtrer que s'il y en a au moins une - sinon, on ne filtre pas !
Cette macro ne détecte pas non plus les MFC mais ce n'est pas grave

Par contre le fonctionnement de la fonction est curieux : la valeur affichée se met à jour que dans deux cas
- en faisant F2 sur cette fonction puis en validant
- faisant varier le nombre de cellules jaune avec la souris (glissée)
Ajouter une cellule jaune avec la palette n'est pas détecté

Je me demande si ce n'est pas cette nouvelle fonction "en veille" qui ralentit mon fichier en fin de compte - ce n'était pas aussi lent avant
J'ai bien essayé de mettre la feuille en calcul manuel - rien changé - mais "scruter" n'est peut-être pas du calcul !

Par contre, si elle réagit aussitôt à une cellule ajoutée avec la palette, cela risque de mobiliser plus de mémoire - je vais peut-être devoir me passer de cette information du nombre de jaunes...
 

Pièces jointes

  • Compter les jaunes.xlsm
    15.8 KB · Affichages: 45

Discussions similaires

Réponses
4
Affichages
220

Statistiques des forums

Discussions
312 321
Messages
2 087 265
Membres
103 501
dernier inscrit
talebafia