Deux couleurs de police dans une même cellule

Résolu/Fermé
Rémi - 23 nov. 2010 à 23:32
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 - 27 nov. 2010 à 09:34
Bonjour,

J'ai un problème que je n'arrive pas à résoudre depuis une journée. Dans une même cellule, j'ai une vingtaine de tirets identiques. Je veux pouvoir mettre en couleur les 5 premiers tirets en rouge puis les autres en bleu.
Actuellement j'arrive à sélectionner les 5 premiers tirets grâce à la fonction GAUCHE(K1;5). Je suis actuellement dans le gestionnaire des règles de mise en forme conditionnelle. Peut-on insérer la fonction gauche(K1;5) dans l'emplacement "S'applique à"? Merci d'avance


A voir également:

11 réponses

ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
24 nov. 2010 à 09:08
bonjour,

sans macro je ne sais pas mais peut etre avec une macro (a adapter) du type

For k = 1 To Len(Range("A1").Value)
  Range("A1").Characters(k,1).Font.ColorIndex = k Mod 16
Next k


bonne suite
0
j'ai presque réussi, mais dans une macro, apparement pour un tiret, il ne faut pas mettre Characters mais autre chose, je ne sais toujours pas.
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
Modifié par ccm81 le 24/11/2010 à 11:22
re

qui devrait répondre

Private Sub CommandButton1_Click() 
Const cellule = "A1" 
Const tiret = "-" 
Const nbrouge = 5 
Dim numtiret As Long 
Dim nbcar As Long 
Dim nucar As Long 
Dim c As String 
c = Range(cellule).Value 
nbcar = Len(c) 
numtiret = 0 
For nucar = 1 To nbcar 
  If Mid(c, nucar, 1) = tiret Then 
    nutiret = nutiret + 1 
    If nutiret <= nbrouge Then 
      Range(cellule).Characters(nucar, 1).Font.ColorIndex = 3 
    Else 
      Range(cellule).Characters(nucar, 1).Font.ColorIndex = 5 
    End If 
  End If 
Next nucar 
End Sub


en adaptant les valeurs des constantes bien sur

si tu as besoin de plus de détails n'hésites pa

bonne suite
0
Ce que tu met la, je doit le mettre dans une macro? J'ai essayer mais cela ne marche tjr pas.
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
Modifié par ccm81 le 24/11/2010 à 15:04
re

la procedure était attachée a un bouton CommandButton_1 (pris dans la boite a outils controles)

on peut faire autrement avec une macro applicable a la cellule selectionnée à mettre dans un module et a déclencher par un Ctrl+f
(modifier eventuellement les codes couleurs et le type/nb de tirets rouges)

Sub Macro1() 
' 
' Touche de raccourci du clavier: Ctrl+f 
' 
Const tiret = "-" 
Const nbrouge = 5 
Dim nutiret As Long 
Dim nbcar As Long 
Dim nucar As Long 
Dim c As String 

c = Selection.Value 
nbcar = Len(c) 
nutiret = 0 
For nucar = 1 To nbcar 
  If Mid(c, nucar, 1) = tiret Then 
    nutiret = nutiret + 1 
    If nutiret <= nbrouge Then 
      Selection.Characters(nucar, 1).Font.ColorIndex = 3 
    Else 
      Selection.Characters(nucar, 1).Font.ColorIndex = 5 
    End If 
  End If 
Next nucar 

End Sub


bonne suite
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
Modifié par ccm81 le 24/11/2010 à 15:08
re et excuses

1. modifier le nom de la variable nutiret au lieu de numtiret

2. j'en profite pour etendre la macro a une selection de cellules

Sub Macro3()
'
' Touche de raccourci du clavier: Ctrl+s
'
Const tiret = "-"
Const nbrouge = 5
Dim nutiret As Long
Dim nbcar As Long
Dim nucar As Long
Dim cc As Range
Dim c As String

For Each cc In Selection
  c = cc.Value
  nbcar = Len(c)
  nutiret = 0
  For nucar = 1 To nbcar
    If Mid(c, nucar, 1) = tiret Then
      nutiret = nutiret + 1
      If nutiret <= nbrouge Then
        cc.Characters(nucar, 1).Font.ColorIndex = 3
      Else
        cc.Characters(nucar, 1).Font.ColorIndex = 5
      End If
    End If
  Next nucar
Next cc

End Sub


ccm81
0
Désolé mais j'ai une dernière question, et après ca sera bon.La ligne" Const nbrouge = 5 ", je ne souhaite pas que cette valeur soit constante mais quelle soit la valeur d'une cellule. Comment faire? Merci d'avance
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
25 nov. 2010 à 10:37
re
remplacer const nbrouge = 5
par
dim nb rouge as long

puis avant for each ...

initialiser nbrouge avec par exemple la valeur de A1

nbrouge = Range("A1").Value

bonne suite
0
Cela ne fonctionne pas. Je te passe les modifications que j'ai apporter.

Sub Macro1()
'
' Touche de raccourci du clavier: Ctrl+f
'
Const tiret = "_"
dim nb rouge as long
Dim numtiret As Long
Dim nbcar As Long
Dim nucar As Long
Dim c As String

c = Selection.Value
nbcar = Len(c)
numtiret = 0
nbrouge = Range("E2").Value
For nucar = 1 To nbcar
If Mid(c, nucar, 1) = tiret Then
nutiret = nutiret + 1
If nutiret <= nbrouge Then
Selection.Characters(nucar, 1).Font.ColorIndex = 2
Else
Selection.Characters(nucar, 1).Font.ColorIndex = 5
End If
End If
Next nucar

End Sub
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
25 nov. 2010 à 11:01
RQ1. dans la déclaration de nbrouge, il faut enlever l'espace entre nb et rouge (ce que tu as fait dans le corps de la procedure)
RQ2. je ne vois pas pourquoi ça ne marche pas avec la dernière macro (For each cc ...) qui permet d'appliquer le format a un ensemble de cellules
Bon, l'essentiel est que tu aies trouvé quelque chose qui marche !!!
cordialement
0
Bonjour, cela fonctionne très bien mais quand je rentre manuellement les tiret dans la cellule en question. A l'heure actuelle, la cellule ou j'ai les tiret contient la fonction suivante : CONCATENER(REPT("_";B2);(REPT("_";H2)). Comment faire pour que la fonctionne avec la formule?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
25 nov. 2010 à 18:17
re

effectivement ce n'était pas prévu ...
RQ1. ceci concatene aussi bien mais ça ne résout pas ton problème
REPT("_";B2) & (REPT("_";H2)
RQ2. je n'ai pas trouvé de solution lorsque le résultat depend d'une formule
RQ3. Une solution (très mauvaise) consisterait a remplacer la formule par son resultat avant le traitement MAIS la formule est perdue et la cellule n'est plus du tout 'dynamique'

bonne suite quand même
0
Réellement je souhaite que REPT("_";B2) soit d'une couleur et REPT("_";H2) soit d'une autre couleur. Puis de concatener les deux afin d'avoir le résultat dans une meme cellule. Si tu n'y arrive pas, connais tu quelqu'un qui pourrais m'aider. Mais tu m'a déja été d'une très grande aide. Merci
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
26 nov. 2010 à 10:43
re

je n'ai pas la solution a ton problème
il y a sur le forum des personnes beaucoup plus compétentes que moi > Vaucluse, Michel_m, eriic, m@rina, raymond pentier, etc ... qui pourront peut être t'aider
je suivrai le problème avec attention !!!
bonne suite
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
26 nov. 2010 à 12:27
Bonjour,
Moi non plus je ne suis pas tellement compétant mais j'ai peut-être un début de solution.
Ne rien mettre dans la cellule K1
Dans le module de la feuille copier...
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Target.Column = 2 And Target.Offset(, 6) > 0 Then
        Application.EnableEvents = False
        Target.Offset(, 9) = String(Target + Target.Offset(, 6), "_")
    With Target.Offset(, 9)
        With .Characters(Start:=1, Length:=Target).Font
            .ColorIndex = 5
        End With
        With .Characters(Start:=Target + 1, Length:=Len(Target.Offset(, 9))).Font
            .ColorIndex = 3
        End With
    End With
        Application.EnableEvents = True
        
    ElseIf Target.Column = 8 Then
        If Target.Offset(, -6) > 0 Then
            Application.EnableEvents = False
            Target.Offset(, 3) = String(Target + Target.Offset(, -6), "_")
            With Target.Offset(, 3)
                With .Characters(Start:=1, Length:=Target.Offset(, -6)).Font
                    .ColorIndex = 5
                End With
                With .Characters(Start:=Target.Offset(, -6) + 1, Length:=Len(Target.Offset(, -3))).Font
                    .ColorIndex = 3
                End With
                Application.EnableEvents = True
            End With
        End If
    End If
End Sub

Quand tu met une valeur dans Bx et Hx la cellule Kx se rempli comme tu veux, du moins c'est ce que je pense. :-(
A+
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
26 nov. 2010 à 12:46
Maintenant, si tu a déjà beaucoup de lignes renseignées tu peu employé cette macro pour tout mettre à jour, et ensuite te servir du code ci-dessus
Private Sub ToutValider()
Dim Lig As Long
    Application.EnableEvents = False
    For Lig = 1 To Range("B65536").End(xlUp).Row
        If Cells(Lig, 2) > 0 And Cells(Lig, 8) > 0 Then
            Cells(Lig, 11) = String(Cells(Lig, 2) + Cells(Lig, 8), "_")
            With Cells(Lig, 11)
                With .Characters(Start:=1, Length:=Cells(Lig, 2)).Font
                    .ColorIndex = 5
                End With
                With .Characters(Start:=Cells(Lig, 2) + 1, Length:=Len(Cells(Lig, 11))).Font
                    .ColorIndex = 3
                End With
            End With
        End If
    Next Lig
    Application.EnableEvents = True
End Sub

A+
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
26 nov. 2010 à 18:25
re,
je viens de voir l'idée de lermite222, a vue de nez, je ne sais pas si elle modifie les couleurs dans la cellule contenant la formule, c'est à tester bien sur

mes dernières idées
je reprends ma RQ3, MAIS je ne supprime plus la formule.
je te propose de faire une copie conforme de la feuille (FF) qui contient les formules dans une feuille (FR) qui ne contiendra que les résultats (valeurs) que l'on pourra traiter cette fois, et qui sera mise a jour automatiquement avec Worksheets_Change

constantes a modifier
RQ. la cellule qui contient le nombre de rouges voulu a été nommé nbrouge

Option Explicit

Const plage_utile = "A1:C10" 
Const tiret = "_"
Const derli = 10
Const derco = 3

Private Sub MAJFR()
Dim li As Long
Dim co As Long
  Application.EnableEvents = False
  For li = 1 To derli
    For co = 1 To derco
      Worksheets("FR").Cells(li, co).Value = Worksheets("FF").Cells(li, co).Value
    Next co
  Next li
  Application.EnableEvents = True
End Sub

Private Sub formate(plage As String)
Dim c As Range
Dim nbcar As Long
Dim nucar As Long
Dim nutiret As Long
Dim nbrouge As Long
nbrouge = Worksheets("FF").Range("nbrouge").Value
  For Each c In Worksheets("FR").Range(plage)
    nbcar = Len(c)
    nutiret = 0
    For nucar = 1 To nbcar
      If Mid(c, nucar, 1) = tiret Then
        nutiret = nutiret + 1
        If nutiret <= nbrouge Then
          c.Characters(nucar, 1).Font.ColorIndex = 3
        Else
          c.Characters(nucar, 1).Font.ColorIndex = 5
        End If
      End If
    Next nucar
  Next c
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  Call MAJFR
  Call formate(plage_utile)
End Sub


le lien vers un exemple

http://www.cijoint.fr/cjlink.php?file=cj201011/cijxFA7yof.xls


bonne suite
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 26/11/2010 à 19:09
Hum,.. A vue de nez... essaye d'abord avant de tenter de faire des essais avec des portes déjà ouverte.
Et Humm.. Change un peu ta plage par..
Const plage_utile = "A1:C50000"
Tu verras le problème.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 27/11/2010 à 23:04
Un classeur démo il contient une autre fonction que j'ai fait pour un autre poste, mais occupe-toi des fonctions 2couleurs.
Tu dis
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
27 nov. 2010 à 09:34
> lermite222
pas dans mes intentions de vexer qui que ce soit ....
à vue ... de machine cette fois, ta solution permet de détouner de façon très efficace le problème du coloriage (et le nombre de couleurs pour à peu près le même prix).
je me suis acharné à tenter le modifier la couleur au niveau de la cellule qui contient la formule (=REPT ....) et je n'y suis pas arrivé, d'ailleurs est-ce possible? En fait ta solution supprime le problème en supprimant la formule de la feuille et en donnant le boulot a VBA, c'est tout simplement lumineux!
je vais voir de ce pas le classeur que tu mets à disposition
cordialement
0