Changement de couleur

Bonjour,

Dans une macro, j'essaye de mettre le texte compris entre guillemets en bleu et je n'arrive pas à trouver exactement ce qu'il faut faire car soit je n'ai que les guillemets qui sont en bleu soit tout ce qui suit le premier guillemet.

Merci d'avance

For I = 1 To Len(Analyse)

C = InStr(1, Analyse, "'") 'Donne la position du début de commentaire

If C = 0 Then C = InStr(1, Analyse, "Rem ") ' Donne la position de début du commentaire

Select Case Mid(Analyse, I, 1)

Case "'"

If Mid(Analyse, I - 1, 2) = " '" Then

ActiveCell.Characters(I, Len(Analyse) + 1).Font.ColorIndex = 4 'Vert clair

End If

End Select

Select Case Mid(Analyse, I, 1)

Case """"

ActiveCell.Characters(I, Len(Analyse)).Font.ColorIndex = 5 'bleu

End Select

Bonjour,

Je ne comprends pas ce que tu fais avec ce début de boucle !

Colorer un fragment de texte c'est ...Characters(début, fin).Font.Color = ...

Si tu cherches un guillemet dans ton texte, cherche Chr(34). Ici apparemment tu cherches en fait le Chr(39) ?

Bonne continuation.

Au fait ce que je voudrais faire, c'est colorier seulement la partie comprise entre guillemets d'un texte contenu dans une cellule

si la macro rencontre un texte :

MonFichier = "C:\Test\MonFichier.txt" 'l'emplacement et le nom du fichier texte

je ne veux que cette partie "C:\Test\MonFichier.txt" colorié en bleu

Merci

Quelque chose comme ça, à vue de nez...

Sub test()
    Dim tx$, k, i%
    With ActiveSheet.Cells(x, y)
        tx = .Value
        For i = 1 To Len(tx)
            If Mid(tx, i, 1) = Chr(34) Then k = k & ";" & i
        Next i
        k = Split(k, ";")
        If UBound(k) = 2 Then
            .Characters(k(1) + 1, k(2) - 1).Font.Color = vbBlue
        End If
    End With
End Sub

Cordialement.

Il bloque sur cette ligne!!!

tx = .Value

Si tu l'exécutes avec .Cells(x, y), c'est pas étonnant !

Non je n'ai pas utilisé (X,y)

Merci

Sans fournir de fichier qui montre exactement ce que tu veux faire !?

Le bout de code pour colorier des bouts de textes ou symboles.

Function Coloriage()

Dim C, i As Integer

C = 0

For i = 1 To Len(Analyse)

C = InStr(1, Analyse, "'") 'Donne la position du début de commentaire

If C = 0 Then C = InStr(1, Analyse, "Rem ") ' Donne la position de début du commentaire

Select Case Mid(Analyse, i, 1)

Case "'"

If Mid(Analyse, i - 1, 2) = " '" Then

ActiveCell.Characters(i, Len(Analyse) + 1).Font.ColorIndex = 4 'Vert clair

End If

End Select

Select Case Mid(Analyse, i, 1)

Case """"

If Mid(Analyse, i, 1) = """" Then

ActiveCell.Characters(i, Len(Analyse)).Font.ColorIndex = 5 'Bleu

End If

End Select

Select Case Mid(Analyse, i, 1)

Case ":"

ActiveCell.Characters(i, 1).Font.ColorIndex = 7 'Violet

End Select

Select Case Mid(Analyse, i, 1)

Case "="

ActiveCell.Characters(i, 1).Font.ColorIndex = 3 'Rouge

End Select

Next

End Function

Dites moi, svp, s'il n y a pas de solution à ma requête.

Désolé, j'ai dormi un peu ! (un rattrapage à faire...) Il y a beaucoup de choses à dire mais je suis déjà en retard pour le repas (le préparer, le manger, le digérer...)

Ce sera après...

Bonsoir,

Laissons MFerrand se rassasier.

En attendant sa nouvelle contribution, essaie ceci ;

Public Sub TEST()
    ColorText [A1]
End Sub

Private Sub ColorText(Cell As Range)
Dim x As Long, y As Long, i As Long
    If IsEmpty(Cell) Then Exit Sub
    With ActiveCell
        x = InStr(1, .Value, Chr(34))
        y = InStr(x + 1, .Value, Chr(34))
        For i = x To y
            .Characters(i, 1).Font.ColorIndex = 3
        Next
    End With
End Sub

Merci beaucoup Jean Eric,

Un bon pas, cependant s'il y a un autre texte entre crochet dans la même cellule, ce n'est pas pris en charge. est ce que je peux mettre cela en boucle pour que la macro traite toutes les cellules de la colonne A ?

Bravo et merci encore

Désolé ! Je n'avais sûrement pas assez rattrapé... mais tu as pu ainsi bénéficier des variations attentionnées de Jean-Eric...

Je ne vais pas en ajouter d'autres, et ce n'était d'ailleurs pas mon intention, car entre ce que tu dis vouloir faire, qui d'une part n'est qu'un aspect partiel manquant cruellement de détails concrets et que d'autre part on ne retrouve pas exactement dans ton code qui tout en révélant d'autres directions ne permet pas plus de cibler exactement l'action à réaliser. Dans la mesure où tu ne fournis volontairement pas de fichier, c'est que tu entends nous laisser dériver dans des suggestions d'ambiance si j'ose dire , ce que je ne déteste pas en soi et il sera toujours temps de varier les plaisirs mais histoire de marcher sur un socle un peu plus consistant je vais commencer par revenir en arrière.

J'essaye d'apprendre le VBA en autodidacte et en développent des petites applications personnelles.

Très bien ! On va donc repartir de ton code, le plus basiquement possible.

Tout d'abord, quand tu donnes à lire du code, tu disposes sur le Forums de balises Code qui le font apparaître dans une fenêtre où il sera infiniment plus commode de le lire. Que quelqu'un qui en est à ses tous premiers messages (mettons jusqu'à 3 ! ) ait zappé cette faculté mise à sa disposition, le temps de trouver comment faire, mais au-delà... Dans l'ancienne présentation, le bouton ad-hoc portait la suscription Code, dans la nouvelle c'est </>, c'est peut-être moins immédiatement parlant mais il suffit de le repérer une fois et tu peux être assuré que quasiment tous les intervenants apprécient cette attention.

Pour pouvoir lire correctement ton code, je commence par l'indenter...

Le voilà donc, sans aucune modification, mais présenté de façon à pouvoir être lu intelligemment !

Function Coloriage()
    Dim C, i As Integer
    Dim Pa, Pb As Variant
    C = 0
    For i = 1 To Len(Analyse)
        C = InStr(1, Analyse, "'")
        If C = 0 Then C = InStr(1, Analyse, "Rem ")
        Select Case Mid(Analyse, i, 1)
            Case "'"
                If Mid(Analyse, i - 1, 2) = " '" Then
                    ActiveCell.Characters(i, Len(Analyse) + 1).Font.ColorIndex = 4
                End If
        End Select
        Select Case Mid(Analyse, i, 1)
            Case """"
                If Mid(Analyse, i, 1) = """" Then
                    ActiveCell.Characters(i, Len(Analyse)).Font.ColorIndex = 5
                End If
        End Select
        Select Case Mid(Analyse, i, 1)
            Case ":"
                ActiveCell.Characters(i, 1).Font.ColorIndex = 7
        End Select
        Select Case Mid(Analyse, i, 1)
            Case "="
                ActiveCell.Characters(i, 1).Font.ColorIndex = 3
        End Select
        Select Case Mid(Analyse, i, 3)
            Case " Do"
                If C > i Or C = 0 Then
                    If Mid(Analyse, i + 3, 1) = "" Or Mid(Analyse, i + 3, 1) = " " Then
                        ActiveCell.Characters(i + 1, 2).Font.ColorIndex = 3
                    End If
                End If
        End Select
    Next
 End Function

Ton intention étant d'apprendre, commençons par le commencement : tu présentes une procédure Function, donc une procédure qui ne peut être lancée directement mais ne peut être utilisée que par une autre procédure. Pourquoi un tel choix ?

En VBA tout le code exécutable (autre que déclarations et qui a donc en principe un effet lorsqu'il est exécuté) doit se trouver dans des procédures, et les deux principales procédures que l'on utilise sont des procédures Sub et des procédures Function. Les deux peuvent faire sensiblement les mêmes choses mais une procédures Sub peut être lancée directement par l'utilisateur (bouton, raccourci, boîte de dialogue macro...), dès lors qu'elle ne comporte pas d'argument obligatoire car dans ce cas elle ne pourra l'être que par une autre procédure susceptible de l'appeler en lui passant les arguments nécessaires pour qu'elle puisse s'exécuter). Avec une procédure Function on est toujours dans ce dernier cas, elle ne peut être appelée que par une autre procédure (Sub ou Function) même si elle est dépourvue d'arguments. Mais une autre différence tout de même essentielle intervient entre Sub et Function : une Function renvoie un résultat !

On s'attendrait donc à trouver, dans le cas le plus simple, dans ta fonction Coloriage, une ligne à la fin du type :

    Coloriage = valeur renvoyée

Comme tu sais rien de tel dans ta procédure, alors pourquoi une Function alors qu'il ne s'agit que de faire quelque chose...

La 2e chose qui saute aux yeux, c'est Analyse ! Quelque peu trompeur ou susceptible d'induire en erreur comme nom de variable... Mais Analyse ne peut être qu'une variable, et comme elle n'est pas initialisée, il faut qu'elle l'ait été auparavant, peut-être par la procédure qui appellera Coloriage, et pour que Coloriage puisse l'utiliser elle doit être déclarée au niveau Module, et éventuellement en variable publique si c'est dans un Module autre que celui qui contient Coloriage. Et ce doit naturellement être une variable de type String (rien ne l'empêche d'être non typée, donc de type Variant, mais ce ne serait pas vraiment cohérent avec son utilisation...)

On peut donc tout de suite établir que si toutes ces conditions ne sont pas réunies, cela n'a aucune chance de fonctionner ! Tes essais de nous dérouter ayant fait long feu, on va donc considérer que Analyse est une variable niveau Module initialisée avec la donnée de type String contenue dans une cellule.

Le matin s'approchant chez moi, je vais faire une pause déjeuner !

Poursuivons avec les déclarations de variables. C'est une erreur récurrente de débutant de penser en écrivant :

    Dim C, i As Integer

qu'il a déclaré 2 variables de type Integer, et certainement rares sont ceux qui n'ont jamais fait cette erreur à leurs débuts.

Mais non ! i sera bien de type Integer, mais C sera non typée, donc de type Variant. Car une variable se type individuellement. On ne peut définir un type pour tout un groupe de variables à la fois...

Cela tend à allonger les déclarations, certes, mais on peut les raccourcir par l'utilisation des caractères de déclaration de type existants pour les variables numériques et String.

    Dim C%, i%

Là j'aurai déclaré 2 variables de type Integer. Le caractère % accolé au nom de la variable signifie As Integer. Pour les plus utilisés, on aura & pour As Long et $ pour As String.

Pour Pa et Pb, elle seront bien de type Variant ! Mais on saisit mal le sens de la déclaration dans la mesure où ces variable ne sont nullement utilisées ensuite dans la procédure ! Il convient donc de les supprimer.

S'agissant du type Variant, c'est le type par défaut d'une variable non typée, et je conseilles volontiers, pour garder des idées claires à ce propos de ne pas typer les variables en Variant en gardant toujours l'assimilation : typé = type que j'indique, non typé = Variant.

L'accès à une variable de type Variant est moins rapide que pour une variable typée. On a donc intérêt à typer autant que possible mais il est des cas où il convient de ne pas typer : variable pouvant accueillir divers types de données, variable à utilisation multiple (ex : donnée String que l'on splitte pour obtenir un tableau), utilisation de particularités du type Variant lors de tests...

Par contre :

    C = 0

initialiser à 0 une variable de type Integer est totalement inutile. Toute variable numérique déclarée a la valeur 0 tant qu'elle n'est pas initialisée à une autre valeur, une variable String aura la valeur "" (texte vide) et une variable Variant la valeur Empty (vide) [valeur que seule une variable Variant peut prendre].

Après ces considérations sur les variables, entrons dans le coeur de la procédure. On initialise une boucle destinée à parcourir notre chaîne Analyse caractère par caractère.

Mais... (on ne voit pas bien pourquoi dans la boucle), on commence par utiliser la fonction InStr pour y rechercher "'" (le caractère 39) dont on affecte le rang à C. Bon !

Puis, si la recherche a été infructueuse (C = 0) on cherche de même l'expression "Rem ". Ok !

L'association "'" et "Rem " peut faire s'interroger sur la nature du texte, inséré dans une cellule... ! Mais on en a vu d'autres... Passons donc... et voyons la suite, soit : muni du rang de "'" ou de celui de "Rem " [si la 2e recherche a été fructueuse après la 1re infructueuse].

Mais on abandonne momentanément C pour se lancer dans une série de Select Case individualisés, chacun à un seul cas ! 5 ainsi, pour tester le caractère parcouru dans la boucle... Et dans le 5e cas on verra réapparaître C !

Bon ! D'abord le calcul de C devrait se trouver hors boucle, réalisé avant d'initialiser cette dernière, manifestement. Ensuite il y a une fort mauvaise utilisation de Select Case.

Select Case est une instruction décisionnelle permettant de diversifier les instructions selon le cas rencontré...

Ce qui implique une seule instruction Select Case dans laquelle tous les cas sont énumérés tour à tour.

A ce stade, notre procédure devrait donc se présenter ainsi :

Function Coloriage()
    Dim C%, i%
    C = InStr(1, Analyse, "'")
    If C = 0 Then C = InStr(1, Analyse, "Rem ")
    For i = 1 To Len(Analyse)
        Select Case Mid(Analyse, i, 1)
            Case "'"
                If Mid(Analyse, i - 1, 2) = " '" Then
                    ActiveCell.Characters(i, Len(Analyse) + 1).Font.ColorIndex = 4
                End If
            Case """"
                If Mid(Analyse, i, 1) = """" Then
                    ActiveCell.Characters(i, Len(Analyse)).Font.ColorIndex = 5
                End If
            Case ":"
                ActiveCell.Characters(i, 1).Font.ColorIndex = 7
            Case "="
                ActiveCell.Characters(i, 1).Font.ColorIndex = 3
            Case " "
                If Mid(Analyse, i, 3) = " Do" Then
                    If C > i Or C = 0 Then
                        If Mid(Analyse, i + 3, 1) = "" Or Mid(Analyse, i + 3, 1) = " " Then
                            ActiveCell.Characters(i + 1, 2).Font.ColorIndex = 3
                        End If
                    End If
                End If
        End Select
    Next i
 End Function

On a dû un peu modifier le 5e cas, pour le faire entre dans l'instruction ! et le mouler sur le 1er cas, ce qui change en rien le test effectué.

On va donc passer en revue chaque caractère et voir s'il répond à un des cas listés :

-1er cas : "'" (le caractère 39) - Là on teste encore si ce caractère est précédée d'une espace. On a donc intérêt à ce que i ne soit plus égal à 1, sinon le caractère 0 de la chaîne provoquera une erreur ! Il serait bon de le tester... Si le test est fructueux, on colore toute la chaîne à partir du caractère en vert... Mais pourquoi Len(Analyse) + 1 pour indiquer le nombre de caractères à colorer ? Cela ne déclenchera pas d'erreur, mais le nombre maximal de caractères à colorer ne saurait dépasser Len(Analyse)-1 ! On peut donc largement se dispenser d'ajouter +1...

-2e cas : """" (!) - Là on ne voit pas trop ! Le caractère i peut être constitué par un guillemet (caractère 34) mais pas deux. Supposons un guillemet : on colore la chaîne à partir de lui en bleu...

3e cas : ":" - On colore le caractère en magenta.

4e cas : "=" - On colore le caractère en rouge.

5e cas : " " (espace, caractère 32) - Ça se complique un peu : on teste la présence de l'expression " Do". Si c'est le cas, on voit alors réapparaître C ! Si C est supérieur à i ou égal à 0, on teste alors qui suit " Do" : si espace ou plus rien (fin de chaîne), alors on colore "Do" en rouge.

On exécute...

Un peu de modernisation, on élimine la répétition d'ActiveCell en mettant sous bloc With (ce que je conseille toujours systématiquement, car outre que cela réduit l'écriture, cela permet surtout d'accélérer l'exécution...)

Egalement, éliminons ColorIndex au profit de Color : il faut rappeler que le système de couleurs d'Excel a changé depuis 2007. Jusqu'à la version 2003, Excel ne pouvait afficher que les couleurs de la palette de 56 couleurs. On pouvait donc s'acharner à définir une couleur quelconque avec la propriété Color et la valeur RGB de la couleur. Pas de problème pour le faire mais la couleur affichée était forcément ramenée à une couleur de la palette. Pour fiabiliser le résultat il était donc recommandé de travailler avec la palette en utilisant ColorIndex.

Tout change avec 2007, toutes les couleurs de l'espace RGB sont affichables, il devient donc tout à fait préférable et recommandé de travailler avec Color et les valeurs RGB... La palette est maintenue pour raisons de compatibilité mais elle devient moins fiable : en modifiant la palette on modifie les couleurs (quoi que... qui se souvient encore des méthodes utilisées anciennement pour obtenir des couleurs hors palette par défaut en modifiant la palette... la majorité de ceux qui utilisent ColorIndex aujourd'hui ne savent vraisemblablement pas quel système ils utilisent, ils ne font que reproduire ce qu'ils ont trouvés ailleurs...) Je persiste à penser qu'il est éminemment souhaitable de savoir exactement ce que l'on fait et à quoi correspondent les outils que l'on utilise).

Ici, on reste d'ailleurs dans les 8 couleurs de base pour lesquelles VBA dispose de constantes...

7h30 : pause café !

Voilà donc à quoi l'on aboutit :

Function Coloriage()
    Dim C%, i%
    C = InStr(1, Analyse, "'")
    If C = 0 Then C = InStr(1, Analyse, "Rem ")
    With ActiveCell
        For i = 1 To Len(Analyse)
            Select Case Mid(Analyse, i, 1)
                Case "'"
                    If i > 1 Then
                        If Mid(Analyse, i - 1, 2) = " '" Then .Characters(i, Len(Analyse)) _
                         .Font.Color = vbGreen
                    End If
                Case """
                    .Characters(i, Len(Analyse)).Font.Color = vbBlue
                Case ":"
                    .Characters(i, 1).Font.Color = vbMagenta
                Case "="
                    .Characters(i, 1).Font.Color = vbRed
                Case " "
                    If Mid(Analyse, i, 3) = " Do" Then
                        If C > i Or C = 0 Then
                            If Mid(Analyse, i + 3, 1) = "" Or Mid(Analyse, i + 3, 1) = " " Then _
                             .Characters(i + 1, 2).Font.Color = vbRed
                        End If
                    End If
            End Select
        Next i
    End With
 End Function

Laissons de côté le problème posé par ActiveCell, le contexte d'exécution n'ayant pas été précisé...

Je serais toutefois curieux de voir le résultat sur cette chaîne (assez spéciale vu ce qu'on y fait ! ) notamment après chevauchement des colorations vert et rouge, et reste-t-il du bleu et magenta à la fin...

Cordialement et joyeux Noël.

Merci beaucoup pour toutes ces explications.

Ce que j'essaye de faire en m'inspirant de divers codes trouvés sur le net et que j'adapte au fur et à mesure est un système qui documente le code source d'une application VBA. Il commence par extraire le code, le copie sur une feuille excel puis le mets au format avec les indentations, le colorie et ensuite l'exporte sous word. Toutes ces opérations sont faite, là ou je bloque, c'est de pouvoir colorier uniquement le texte compris entre guillemets: par exemple : Case " If ", " Or ", " To ", " On ", les virgule ne seront pas coloriées.

Votre code fonctionne, mais j'obtiens toujours le même résultat qu'avec le mien c'est à dire la couleur commence au premier guillemet jusqu'à la fin de la ligne.

Encore merci et joyeux Noël à vous aussi.

Bon courage à toi alors ! Pour les guillemets, la méthode est qu'il faut chercher le second pour colorer entre les deux, et avait été indiqué (mis à part une erreur que j'avais machinalement faite en mettant le rang du caractère de fin, alors qu'il fallait en déduire encore le rang du premier guillemet pour obtenir le nombre de caractères, erreur que n'avait pas faite Jean-Eric qui colorait caractère par caractère).

Je dois avouer que si je ne méconnais pas l'utilité de pouvoir extraire du code par VBA ou en insérer, à l'occasion, je considère que cela reste marginal car tant que l'on peut se débrouiller autrement il vaut mieux procéder autrement, ce sera toujours plus simple et plus fiable. Quant aux commentaires, je n'en mets en général pas, ils ne m'apportent rien et me gênent à la lecture, me faisant perdre le bénéfice de l'indentation. Si des explications sont nécessaires, un texte explicatif hors code...

Cordialement et joyeux Noël.

Merci à vous deux et joyeux Noël.

Je viens juste de trouver la solution.

Bonne fêtes

Rechercher des sujets similaires à "changement couleur"