Deux couleurs de police dans une même cellule

Résolu
Rémi -  
ccm81 Messages postés 11033 Statut Membre -
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

11 réponses

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. Rémi
       
      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
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. Rémi
       
      Ce que tu met la, je doit le mettre dans une macro? J'ai essayer mais cela ne marche tjr pas.
      0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. ccm81 Messages postés 11033 Statut Membre 2 434
       
      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
    2. Rémi
       
      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
  4. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. Rémi
       
      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
    2. ccm81 Messages postés 11033 Statut Membre 2 434
       
      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
    3. Rémi
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. Rémi
       
      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
  7. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
  8. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  9. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  10. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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
  11. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  12. ccm81 Messages postés 11033 Statut Membre 2 434
     
    > 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