Surligner une préselection

Bonjour.

Je suis tout débutant en VBA excel, je me permets de demander humblement votre aide...et votre patience :) .

Mon objectif :

1) Faire une sélection selon un critère

2) Colorer toutes les lignes

Ma méthodo :

J'utilise l'enregistreur de Macro et j'essaie de comprendre ce qui est créé comme VBA à chaque étape

Mon souci :

L'enregistreur de VBA fonctionne selon les exemples, et cela ne s'applique pas partout.

Concrètement, imaginons que je veux filtrer toutes les lignes dont la valeur de la colonne 6 est "Courchevel"

Etape 1 = Sélectionner la colonne :

Rows("1:1").Select

Selection.AutoFilter

ActiveSheet.Range("$A$1:$M$44").AutoFilter Field:=6, Criteria1:= _

"Courchevel"

Application.Goto Reference:="Macro5"

Etape 2 = Mettre une couleur sur cette sélection

Rows("3:3").Select

Range(Selection, Selection.End(xlDown)).Select

Selection.SpecialCells(xlCellTypeVisible).Select

With Selection.Interior

.Pattern = xlSolid

.PatternColorIndex = xlAutomatic

.ThemeColor = xlThemeColorAccent6

.TintAndShade = 0.799981688894314

.PatternTintAndShade = 0

End With

Application.Goto Reference:="Macro5"

Comme vous le constaterez, il me met '"3:3" car il s'avère que la première valeur "COurchevel" apparaît à la ligne 3...

Mais si la vois d'après, elle apparaissait à la ligne 2, ça ne collerait plus.

Quelle fonction pourrais-je utiliser pour qu'il prenne TOUTE MA SELECTION ?

Merci pour votre aide!!

Bonsoir Oujikun et bienvenu, bonsoir le forum,

Si j'ai bien compris, peut-être comme ça :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim PL1 As Range 'déclare la variable PL1 (Plage1)
Dim PL2 As Range 'déclare la variable PL2 (Plage2)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
Set PL1 = O.Range("A1").CurrentRegion 'définit la plage PL1
PL1.Interior.ColorIndex = xlNone 'supprime les couleurs dans la plage PL1
Set PL2 = PL1.Offset(1, 0).Resize(PL1.Rows.Count - 1, PL1.Columns.Count) 'définit la plage PL2 (PL1 sans les en-têtes)
PL1.CurrentRegion.AutoFilter 'supprime un éventuel filtre automatique
PL1.AutoFilter Field:=6, Criteria1:="Courchevel" 'filtre la plage PL1 avec "Courchevel comme critère dans la colonne 6
With PL2.SpecialCells(xlCellTypeVisible).Interior 'prend en comple l'intérieur des cellules visibles de la plage PL2
    .Pattern = xlSolid 'paramètre couleur
    .PatternColorIndex = xlAutomatic 'paramètre couleur
    .ThemeColor = xlThemeColorAccent6 'paramètre couleur
    .TintAndShade = 0.799981688894314 'paramètre couleur
    .PatternTintAndShade = 0 'paramètre couleur
End With 'fin de la prise ene compte...
PL1.AutoFilter 'supprime le filtre automatique
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub

Bonjour Thauthème.

Je testerai cela lundi, mais je tiens dors et déjà à vous remercier pour le temps que vous m'avez consacré ainsi que par la clarté de vos explications.

Bon week-end !

Bonjour,

J'ai testé et ça fonctionne bien sur un seul onglet! Merci

Je mets des couleurs différentes selon les valeurs trouvées, c'est top.

Mais j'aurais svp besoin de deux compléments d'information.

1) Comment faire si la valeur n'existe pas? Actuellement, il y a une erreur "Pas de cellules correspondantes". Je pense comprendre : la valeur n'existe pas (= je demande de colorer en jaune une valeur qui n'est pas dans l'onglet). Mais dans ce cas, j'aurais aimé qu'il ne fasse rien (plutôt que de bloquer).

2) Comment enchaîner ces fonctions sur plusieurs onglets? Comment se fait le lien? Il faut rédéclarer d'autres variables "Dim" ?

Ci-dessous mon VBA qui fonctionne bien sur un seul onglet (j'ai abandonné "COurchevel", j'ai mis la valeur que je voulais vraiment ;) ).

Sub Macro6()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim PL1 As Range 'déclare la variable PL1 (Plage1)
Dim PL2 As Range 'déclare la variable PL2 (Plage2)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Worksheets("4- Department") 'définit l'onglet O (à adapter à ton cas)
Set PL1 = O.Range("A1").CurrentRegion 'définit la plage PL1
'PL1.Interior.ColorIndex = xlNone 'supprime les couleurs dans la plage PL1
Set PL2 = PL1.Offset(1, 0).Resize(PL1.Rows.Count - 1, PL1.Columns.Count) 'définit la plage PL2 (PL1 sans les en-têtes)
PL1.CurrentRegion.AutoFilter 'supprime un éventuel filtre automatique
PL1.AutoFilter Field:=2, Criteria1:="Nouvelle modif par Interface" 'filtre la plage PL1 avec "Nouvelle modif par Interface" comme critère dans la colonne 6
With PL2.SpecialCells(xlCellTypeVisible).Interior 'prend en comple l'intérieur des cellules visibles de la plage PL2
    .Pattern = xlSolid 'paramètre couleur
    .PatternColorIndex = xlAutomatic 'paramètre couleur
    .ThemeColor = xlThemeColorAccent6 'paramètre couleur
    .TintAndShade = 0.799981688894314 'paramètre couleur
    .PatternTintAndShade = 0 'paramètre couleur
End With 'fin de la prise ene compte...
PL1.AutoFilter Field:=2, Criteria1:="Nouvelle modif HORS Interface" 'filtre la plage PL1 avec "Nouvelle modif HORS Interface" l comme critère dans la colonne 6
With PL2.SpecialCells(xlCellTypeVisible).Interior 'prend en comple l'intérieur des cellules visibles de la plage PL2
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
End With 'fin de la prise ene compte...
PL1.AutoFilter 'supprime le filtre automatique
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
End Sub
Un grand merci pour votre aide!

Pas moyen d'éditer mon message précédent, mais j'ai facilement réussi à déployer le VBA aux autres onglets en fait !

Par contre, je suis toujours bloqué pour les cas où la valeur que je veux colorer n'existe pas (ce qui peut arriver dans des onglets).

Ci-dessous ma méthodo pour l'enchaînement des onglets (rien à faire en fait...je ne sais pas pourquoi j'étais bloqué ce matin).

Sub Macro6()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim PL1 As Range 'déclare la variable PL1 (Plage1)
Dim PL2 As Range 'déclare la variable PL2 (Plage2)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Worksheets("3- Location") 'définit l'onglet O (à adapter à ton cas)
Set PL1 = O.Range("A1").CurrentRegion 'définit la plage PL1
'PL1.Interior.ColorIndex = xlNone 'supprime les couleurs dans la plage PL1
Set PL2 = PL1.Offset(1, 0).Resize(PL1.Rows.Count - 1, PL1.Columns.Count) 'définit la plage PL2 (PL1 sans les en-têtes)
PL1.CurrentRegion.AutoFilter 'supprime un éventuel filtre automatique
PL1.AutoFilter Field:=2, Criteria1:="Nouvelle modif par Interface" 'filtre la plage PL1 avec "Nouvelle modif par Interface" comme critère dans la colonne 6
With PL2.SpecialCells(xlCellTypeVisible).Interior 'prend en comple l'intérieur des cellules visibles de la plage PL2
    .Pattern = xlSolid 'paramètre couleur
    .PatternColorIndex = xlAutomatic 'paramètre couleur
    .ThemeColor = xlThemeColorAccent6 'paramètre couleur
    .TintAndShade = 0.799981688894314 'paramètre couleur
    .PatternTintAndShade = 0 'paramètre couleur
End With 'fin de la prise ene compte...
PL1.AutoFilter Field:=2, Criteria1:="Nouvelle modif HORS Interface" 'filtre la plage PL1 avec "Nouvelle modif HORS Interface" l comme critère dans la colonne 6
With PL2.SpecialCells(xlCellTypeVisible).Interior 'prend en comple l'intérieur des cellules visibles de la plage PL2
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
End With 'fin de la prise ene compte...
PL1.AutoFilter 'supprime le filtre automatique
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Worksheets("4- Department") 'définit l'onglet O (à adapter à ton cas)
Set PL1 = O.Range("A1").CurrentRegion 'définit la plage PL1
'PL1.Interior.ColorIndex = xlNone 'supprime les couleurs dans la plage PL1
Set PL2 = PL1.Offset(1, 0).Resize(PL1.Rows.Count - 1, PL1.Columns.Count) 'définit la plage PL2 (PL1 sans les en-têtes)
PL1.CurrentRegion.AutoFilter 'supprime un éventuel filtre automatique
PL1.AutoFilter Field:=2, Criteria1:="Nouvelle modif par Interface" 'filtre la plage PL1 avec "Nouvelle modif par Interface" comme critère dans la colonne 6
With PL2.SpecialCells(xlCellTypeVisible).Interior 'prend en comple l'intérieur des cellules visibles de la plage PL2
    .Pattern = xlSolid 'paramètre couleur
    .PatternColorIndex = xlAutomatic 'paramètre couleur
    .ThemeColor = xlThemeColorAccent6 'paramètre couleur
    .TintAndShade = 0.799981688894314 'paramètre couleur
    .PatternTintAndShade = 0 'paramètre couleur
End With 'fin de la prise ene compte...
PL1.AutoFilter Field:=2, Criteria1:="Nouvelle modif HORS Interface" 'filtre la plage PL1 avec "Nouvelle modif HORS Interface" l comme critère dans la colonne 6
With PL2.SpecialCells(xlCellTypeVisible).Interior 'prend en comple l'intérieur des cellules visibles de la plage PL2
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
End With 'fin de la prise ene compte...
PL1.AutoFilter 'supprime le filtre automatique
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
End Sub

Bonjour Oujikun, bonjour le forum,

Un simple On Error Resume Next permet de corriger le bug. En revanche, si tu n'effaces pas les couleurs au départ et s'il y a des modification dans la colonne B, tu risques d'avoir les lignes colorées qui ne correspondent pas...

Sub Macro6()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim PL1 As Range 'déclare la variable PL1 (Plage1)
Dim PL2 As Range 'déclare la variable PL2 (Plage2)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Worksheets("3- Location") 'définit l'onglet O
Set PL1 = O.Range("A1").CurrentRegion 'définit la plage PL1
PL1.Interior.ColorIndex = xlNone 'supprime les couleurs dans la plage PL1
Set PL2 = PL1.Offset(1, 0).Resize(PL1.Rows.Count - 1, PL1.Columns.Count) 'définit la plage PL2 (PL1 sans les en-têtes)
PL1.CurrentRegion.AutoFilter 'supprime un éventuel filtre automatique
PL1.AutoFilter Field:=2, Criteria1:="Nouvelle modif par Interface" 'filtre la plage PL1 avec "Nouvelle modif par Interface" comme critère dans la colonne 2
On Error Resume Next 'gestion des erreurs, en cas d'erreur passe à la ligne suivante
With PL2.SpecialCells(xlCellTypeVisible).Interior 'prend en compte l'intérieur des cellules visibles de la plage PL2
    .Pattern = xlSolid 'paramètre couleur
    .PatternColorIndex = xlAutomatic 'paramètre couleur
    .ThemeColor = xlThemeColorAccent6 'paramètre couleur
    .TintAndShade = 0.799981688894314 'paramètre couleur
    .PatternTintAndShade = 0 'paramètre couleur
End With 'fin de la prise en compte...
PL1.AutoFilter Field:=2, Criteria1:="Nouvelle modif HORS Interface" 'filtre la plage PL1 avec "Nouvelle modif HORS Interface" l comme critère dans la colonne 2
With PL2.SpecialCells(xlCellTypeVisible).Interior 'prend en compte l'intérieur des cellules visibles de la plage PL2
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
End With 'fin de la prise en compte...
PL1.AutoFilter 'supprime le filtre automatique
Set O = Worksheets("4- Department") 'redéfinit l'onglet O
Set PL1 = O.Range("A1").CurrentRegion 'définit la plage PL1
PL1.Interior.ColorIndex = xlNone 'supprime les couleurs dans la plage PL1
Set PL2 = PL1.Offset(1, 0).Resize(PL1.Rows.Count - 1, PL1.Columns.Count) 'définit la plage PL2 (PL1 sans les en-têtes)
PL1.CurrentRegion.AutoFilter 'supprime un éventuel filtre automatique
PL1.AutoFilter Field:=2, Criteria1:="Nouvelle modif par Interface" 'filtre la plage PL1 avec "Nouvelle modif par Interface" comme critère dans la colonne 2
With PL2.SpecialCells(xlCellTypeVisible).Interior 'prend en compte l'intérieur des cellules visibles de la plage PL2
    .Pattern = xlSolid 'paramètre couleur
    .PatternColorIndex = xlAutomatic 'paramètre couleur
    .ThemeColor = xlThemeColorAccent6 'paramètre couleur
    .TintAndShade = 0.799981688894314 'paramètre couleur
    .PatternTintAndShade = 0 'paramètre couleur
End With 'fin de la prise ene compte...
PL1.AutoFilter Field:=2, Criteria1:="Nouvelle modif HORS Interface" 'filtre la plage PL1 avec "Nouvelle modif HORS Interface" l comme critère dans la colonne 2
With PL2.SpecialCells(xlCellTypeVisible).Interior 'prend en comple l'intérieur des cellules visibles de la plage PL2
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
End With 'fin de la prise en compte...
PL1.AutoFilter 'supprime le filtre automatique
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub

Super Thautheme.
Ca fonctionne merci.

Ce qui me dérangeait avec le fait d'enlever la couleur, c'est que, justement, je souhaitais que la première colonne soit colorée.

Mais ce n'est pas grave, je vais recolorer après.

Rechercher des sujets similaires à "surligner preselection"