Changer de "Toile de Fond"

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Magic_Doctor

XLDnaute Barbatruc
Supporter XLD
Rebonsoir,

J'aime bien que le fond de ma feuille soit en couleur (d'une part on ne voit plus les lignes, mais surtout cela fatigue moins la vue).

Il y aurait-il un moyen (avec une macro par exemple) pour modifier uniquement ce fond sans altérer pour autant les couleurs des cellules où se trouvent les données ?
 
Bonjour,

Presque 15 ans après, je reviens sur ce fil.
Je voulais facilement pouvoir changer la couleur du fond de feuille de n'importe quelle feuille de n'importe quel classeur sans avoir à mettre dans chaque classeur tout l'armamentarium (UF + codes) permettant d'y arriver.
Mon idée était de reprendre l'élégante solution de job75 en l'adaptant à un classeur qui serait ni plus ni moins un outil à partir duquel je pourrai modifier la couleur du fond de n'importe quelle feuille d'un classeur quelconque.
La tâche était pour moi rude, alors je me suis aidé de ChatGPT (je sais, c'est pas bien, c'est pas bien du tout mais je m'en fous), et au terme de plusieurs heures d'échanges avec l'humanoïde, celui-ci m'a aidé à résoudre le problème. Je ne doute pas qu'on puisse faire plus simple (c'est le but d'un forum après tout), mais quoi qu'il en soit, ça marche très bien.
En pièces jointes j'ai mis 2 classeurs : "Changer Couleur Fond" & "Classeur Test".
- "Changer Couleur Fond" : l'outil (à conserver très précieusement) qui permet de modifier la couleur de fond de n'importe quelle feuille de n'importe quel classeur.
- "Classeur Test" : un classeur avec une feuille présentant quelques tableaux sommaires.

Les 2 classeurs doivent être évidemment dans un même dossier.
Les 2 classeurs doivent être ouverts.

Le classeur "Changer Couleur Fond" est très minimaliste :
- on rentre le nom (avec son extension) du classeur cible
- on rentre le nom de la feuille visée du classeur cible
- on indique à partir de quelle ligne de la feuille on veut que la coloration de la feuille se fasse (utile si en haut de la feuille il y a un bandeau avec une ou des lignes figées qui auraient une couleur différente de celle de la feuille pour se démarquer)
Enfin, une icône en forme de palette. Il suffit de cliquer dessus, on est dirigé vers le classeur cible et il n'y a plus qu'à cliquer sur le bouton "Palette" pour choisir une couleur. Et basta !

Essayez sans modération avec vos classeurs contenant des tableaux. Vous ne risquez rien !
Un conseil, choisissez des couleurs plutôt sombres, vous verrez que c'est nettement plus reposant pour la rétine quand on travaille pendant des plombes sur des documents qui finissent par fatiguer les yeux à cause de leur fond blanc qui devient rapidement éblouissant.
 

Pièces jointes

Bonjour Magic_Doctor, le forum,

L'idée de stocker les couleurs dans des tableaux VBA n'est pas inintéressante, mais l'ensemble est assez lourd.

De plus ta méthode ne permet pas de protéger des lignes entières (cf ligne 27) ou des colonnes entières (cf colonne N).

La solution que je préconise consiste à créer dans la feuille cible une zone multiple nommée ZONE avec cette macro :
VB:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim P As Range
If MsgBox("Voulez-vous ajouter la sélection à la plage nommée ZONE ?", vbQuestion + vbYesNo) = vbNo Then Exit Sub
Cancel = True
If TypeOf [ZONE] Is Range Then Set P = [ZONE]
Union(IIf(P Is Nothing, Target, P), Target).Name = "'" & Me.Name & "'!ZONE" 'nom défini dans la feuille
End Sub
Comme toute formule la formule du nom défini ZONE ne doit pas dépasser 8192 caractères.

On ne se préoccupe plus de savoir si les cellules sont pleines, vides, avec ou sans bordures.

Dans le fichier pilote la macro MiseEnFormeFond devient très simple :
VB:
Private Sub MiseEnFormeFond(ws As Worksheet, CouleurFond As Long, deb As Long)
'Colore le fond de la feuille sans toucher à la plage nommée ZONE ni aux lignes < deb
If Not TypeOf [ZONE] Is Range Then MsgBox "La plage ZONE n'est pas définie dans cette feuille !", 48: Exit Sub
Dim r As Range
Application.ScreenUpdating = False
ws.Copy 'document auxiliaire
If deb > 1 Then Set r = Union([ZONE], Rows("1:" & deb - 1)) Else Set r = [ZONE] 'plage à protéger
ws.Range(deb & ":" & ws.Rows.Count).Interior.Color = CouleurFond
For Each r In r.Areas
    r.Copy ws.Range(r.Address) 'copie chaque plage rectangulaire
Next r
ActiveWorkbook.Close False 'ferme le document auxiliaire
Application.ScreenUpdating = True
End Sub
A+
 

Pièces jointes

Dernière édition:
Bonjour job,

Merci pour ta réponse.

Têtu, de mon côté j'ai persévéré, avec l'aide, bien sûr, de l'humanoïde, pour améliorer cette histoire.
En effet, ça ne marchait convenablement que pour des classeurs dont l'extension est ".xlsm". Pas terrible avec les classeurs ".xlsx", lamentable avec les classeurs ".xls".
Après moult essais, je pense que ça fait l'affaire. Mais il peut toujours y avoir une surprise derrière les fagots...
Amélioration du classeur qui gère les opérations.
Finalement, c'est pratique si on veut relooker des classeurs.

Bonne journée
 

Pièces jointes

Bonsoir Magic_Doctor,
En effet, ça ne marchait convenablement que pour des classeurs dont l'extension est ".xlsm". Pas terrible avec les classeurs ".xlsx", lamentable avec les classeurs ".xls".
Avec le classeur xls la cellule ZZ666 n'existe pas, il faut donc utiliser IV666.

Surtout ton dernier fichier xlsx contient des cellules fusionnées et ma méthode de récupération des couleurs par copier-coller ne marche plus.

Il faut alors copier la couleur de chaque cellule :
VB:
Private Sub MiseEnFormeFond(ws As Worksheet, CouleurFond As Long, deb As Long)
'Colore le fond de la feuille sans toucher à la plage nommée ZONE ni aux lignes < deb
If Not TypeOf [ZONE] Is Range Then MsgBox "La plage ZONE n'est pas définie dans cette feuille !", 48: Exit Sub
Dim c As Range
Application.ScreenUpdating = False
ws.Copy 'document auxiliaire
ws.Range(deb & ":" & ws.Rows.Count).Interior.Color = CouleurFond
For Each c In Intersect([ZONE], Rows("1:" & ws.Rows.Count), Columns(1).Resize(, ws.Columns.Count)) 'sécurité si lignes ou colonnes entières
    ws.Range(c.Address).Interior.Color = c.Interior.Color 'copie la couleur de chaque cellule
Next c
ActiveWorkbook.Close False 'ferme le document auxiliaire
Application.ScreenUpdating = True
End Sub
Et éviter de sauvegarder des lignes ou colonnes entières...

A+
 

Pièces jointes

Dernière édition:
Bonjour Magic_Doctor, le forum,

En fait il suffit de discerner (via la variable fusion) les plages contenant des cellules fusionnées pour les traiter cellule par cellule :
VB:
Private Sub MiseEnFormeFond(ws As Worksheet, CouleurFond As Long, deb As Long)
'Colore le fond de la feuille sans toucher à la plage nommée ZONE ni aux lignes < deb
If Not TypeOf [ZONE] Is Range Then MsgBox "La plage ZONE n'est pas définie dans cette feuille !", 48: Exit Sub
Dim r As Range, fusion As Variant, c As Range
Application.ScreenUpdating = False
ws.Copy 'document auxiliaire
ws.Range(deb & ":" & ws.Rows.Count).Interior.Color = CouleurFond
For Each r In ws.Range("ZONE").Areas
    fusion = r.MergeCells: If IsNull(fusion) Then fusion = True
    If fusion Then
        For Each c In r
            c.Interior.Color = Range(c.Address).Interior.Color 'copie la couleur de chaque cellule
        Next c
    Else
        Range(r.Address).Copy r 'copier-coller de la plage
    End If
Next r
ActiveWorkbook.Close False 'ferme le document auxiliaire
Application.ScreenUpdating = True
End Sub
Les lignes ou colonnes entières (normalement sans cellules fusionnées) sont traitées par copier-coller donc très rapidement.

A+
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour