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 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
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 ! 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.
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
!
On peut donc tout de suite établir que si toutes ces conditions ne sont pas réunies, cela n'a aucune chance de fonctionner !
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 !
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 !
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...
Mais on abandonne momentanément C
Bon !
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 Len(Analyse) + 1
pour indiquer le nombre de caractères à colorer ?
-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
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...
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 !
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 !
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