Autres problème sous excel 2007. changer la couleur du texte en couleur de fond de cellule

goeland31

XLDnaute Nouveau
Bonjour,



Je dois refaire une mise en forme sur un tableau dont le texte un "X" a été mis soit en rouge, soit en jaune, soit en vert dans chaque cellule.

Par souci de lisibilité, je préfèrerais que le fond de la cellule soit en rouge, jaune, vert (de la même couleur que le texte de départ donc ...)



j'ai regardé au niveau de la mise en forme conditionnelle mais je ne vois pas comment faire...

je ne me vois pas faire les 600 cases une par une



qui a une idée? merci par avance
 
Solution
@goeland31

Je te propose une solution générale, car :

a) la dernière colonne utilisée est détectée automatiquement selon la ligne 4
➯ ça marchera même pour un tableau qui a plus de colonnes.

b) pour chaque colonne, la dernière ligne utilisée est détectée ➯ ça marchera
même si la dernière cellule d'une colonne est vide ; et même s'il y a plusieurs
cellules vides en fin de colonne
.

fais Ctrl e ➯ travail effectué

Tu verras que ça met pour la couleur du fond la même que celle du texte,
puis ça met le texte en blanc ; les cellules vides sont ignorées ; en fait, ça
fait le job pour toute cellule non vide, donc...

soan

XLDnaute Barbatruc
Inactif
ben c'est simple : nlm = Rows.Count ➯ la variable nlm contient
le nb de lignes maxi (ou le n° de ligne maxi au choix) :

* c'est 1 048 576 avec Excel 2007 (ou version ultérieure)
* c'est 65 535 avec Excel 2003 (ou version antérieure)

c'est aussi pour ça que j'appelle ma variable nlm :
nb de lignes maxi ou n° ligne maxi (au choix, bis)

maintenant, la question est : pourquoi je passe par une variable ?
car ça évite de le « recalculer » de nombreuses fois à l'intérieur
de la boucle For col : dlig = Cells(nlm, col).End(3).Row


-----------------------------------------------------------------------

Pour Application.ScreenUpdating = 0, c'est la même chose que
Application.ScreenUpdating = False : ça désactive la mise à
jour de l'écran ➯ l'exécution est plus rapide


soan
 

patricktoulon

XLDnaute Barbatruc
re


re
ben oui!! ça j'avais compris mais faut pas faire ca :eek:!!!!
il a 34 lignes a travailler pour quoi travailler sur la B:U complète ?????!!!!:oops:



tiens un petit Kado' pour toi ;)

VB:
'************************************************************************************
'              FONCTION FIND(LAST) ROW,COLUMN,CELL ON <<<defined range>>>
'Autor:patricktoulon
'version beta
'date version 29/03/2020
'************************************************************************************
Function UsedrangeOnRangeDef(tableau As Range) As Range
    Dim lig&, col&, cel1 As Range, cel2 As Range
    With tableau
        Set cel1 = .Cells(1)
        col = .Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
        lig = .Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
        Set cel2 = Cells(lig, col)
        Set UsedrangeOnRangeDef = .Parent.Range(cel1, cel2)
    End With
End Function

'sub de test
Sub testusedRangedef()
    Dim plage As Range
    Set plage = [B:U]
    MsgBox UsedrangeOnRangeDef(plage).Address
End Sub

a noter que si j'avais ecrit
Set plage = [B:Z]
j'aurais eu la même réponse

;)
 

soan

XLDnaute Barbatruc
Inactif
Oui, mais si tu relis attentivement mon post #14, j'ai voulu donner une solution plus
générale, qui marche aussi pour un tableau qui a plus de colonnes et plus de lignes ;
d'autre part, si une colonne a une ou plusieurs cellules vides (y compris la colonne A),
ça oblige à « calculer » pour chaque colonne quelle est la dernière ligne utilisée, car
si tu trouves par exemple qu'en colonne A la dernière ligne utilisée est la n° 30, rien
ne te dit que ça sera pareil pour les autres : ça pourra peut-être être aussi 30, mais ça
pourra aussi être plus court (ligne n° 20) ou plus long (ligne n° 50)
; enfin, comme
il peut y avoir des cellules vides dans le coin inférieur gauche ou le coin supérieur
droit (par exemple), ça peut gêner la détection de plage automatique faite par le
UsedRange ; j'ai déjà eu un demandeur qui avait préféré ma méthode justement
parce que celle avec UsedRange n'avait pas su détecter la bonne plage. ;)

Le demandeur goeland31 a un gros avantage avec mon code VBA : si un de ses
collègues lui passe un autre tableau du même genre, mais avec plus de colonnes
et / ou plus de lignes, ça marchera tout aussi bien puisque ma macro s'y adapte
automatiquement.

(merci quand même pour ton Kado :))


soan
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re

hoh!! que si j'ai bien lu le #14:D
mais je te le redis c'est pas bon (tu prend un tractopelle pour ramasser la balayure) :D:D:D



tu vois usedrange dans mon code mais ca n'est pas la fonction usedrange comme tu le crois :D :p :D :cool:

prend le temps, ne te précipite pas
analyse ce que je t'ai donné et tu comprendra ;)


en tout cas (et là tout le monde sera d'accords avec moi )ta solution n'est pas bonne du tout

prends le temps et essaie de comprendre ce que je fais dans la fonction
 

soan

XLDnaute Barbatruc
Inactif
Si, si, j'avais bien vu que ton code VBA n'utilise pas UsedRange : c'est seulement tes noms
UsedrangeOnRangeDef et testusedRangedef qui peuvent le laisser croire, mais j'ai quand
même parlé de UsedRange car j'en ai parlé de façon générale : je me méfie toujours de
certains automatismes, comme par exemple celui de UsedRange ; et à raison puisqu'en
cas de cellules vides, ça lui gêne la détection de la bonne plage.

Tu as écrit : « c'est pas bon » et « tout le monde sera d'accord avec moi que ta solution
n'est pas bonne du tout »
; je trouve ton affirmation plutôt catégorique et négative,
alors que pourtant, dans le fichier joint, ma macro fonctionne tout à fait correctement !
et je répète : elle a le très gros avantage de s'adapter automatiquement à un nombre
de lignes et de colonnes plus important ; maintenant, je ne fais que proposer une
solution : libre à chacun de la prendre ou non. :)


soan
 

patricktoulon

XLDnaute Barbatruc
re
oui elle fonctionne mais a quel prix
le prix ben un passage en revue de toutes les cells de B:U même si le if .value<>"" veille ,tu passe toutes les cells quand même dans l'annalyse
soit [B:U]= 20971520 cellules

et je répète : elle a le très gros avantage de s'adapter automatiquement à un nombre
de lignes et de colonnes plus important

elle ne s'adapte pas elle fonctionne pour toutes les cells de la plage concernée+ ce qui suis en dessous jusqu'au rows.count

quand tu travaille ,modifie ,alimente directement sur des cellule ,veille toujours!!!!!!!!!!!! a travailler juste le nombre de cellules qu'il faut sinon tes app excel seront des vrais boucans de lenteurs(ça!!! oui c'est négatif voir même rédhibitoire)

et pour info si tu ajoute des "X" de couleur en dessous 34 et après U
ben teste ma fonction avec set plage=cells et tu aura la réponse ;)

et je te dis ça en toute bienveillance
 

soan

XLDnaute Barbatruc
Inactif
J'ai écrit « s'adapter automatiquement » : pour moi, cette formulation
est comme « fonctionne pour toutes les cells de la plage concernée » :
c'est juste une question de formulation, je ne vais pas « chipoter »
pour l'emploi d'une expression plutôt qu'une autre. ;)

D'autre part, je n'ai jamais dit que mon code VBA ou mes macros sont
la perfection absolue ! :p il y a toujours matière à amélioration, et
cela surtout si tu cherches la perfection extrême, avec aussi un temps
d'exécution le plus court possible ; j'aime bien faire des codes assez
optimisés, mais quand même pas à ce point-là : je ne cherche pas
« la petite bête », lollll ! :D


soan
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 810
dernier inscrit
mohammedaminelahbali