XL 2019 colorer les différents aliments avec un code VB pour macro de ce genre ?

  • Initiateur de la discussion Initiateur de la discussion anthoYS
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

anthoYS

XLDnaute Barbatruc
bonjour


les instructions sont dans le fichier (2 onglets).
Le second ce qui est attendu. Il sera sans doute nécessaire de le transformer en *.xlsm.
Le code VB n'est pas adapté, il est utile pour un autre fichier et onglet..
Donc il sera nécessaire de changer PlageOmega par PlageProteines, etc. etc.

A minima, une piste de départ, surtout les couleur, code couleur RGB(XXX, YYY, ZZZ) je ne sais pas à quoi correspond quoi...


Merci 🙂
VB:
Sub ColorerMotsRepas()

    Dim ws As Worksheet
    Dim cell As Range, mot As Range
    Dim PlageOmega As Range, PlageLegum As Range, PlageCheat As Range, PlageAutres As Range
    Dim startPos As Long

    Set ws = ThisWorkbook.Sheets("plg") ' <<< adapter si nécessaire

    ' Définir les plages des listes
    Set PlageOmega = ws.Range("AQ2:AQ20")
    Set PlageLegum = ws.Range("AR2:AR20")
    Set PlageCheat = ws.Range("AS2:AS20")
    Set PlageAutres = ws.Range("AT2:AT20")
  
    ' Parcourir toutes les lignes utilisées en colonne B
    For Each cell In ws.Range("B2:B" & ws.Cells(ws.Rows.Count, "B").End(xlUp).Row)
        If Not IsEmpty(cell.Value) Then
          
            ' Nettoyer d’abord la mise en forme
            cell.Font.Bold = False
            cell.Font.color = vbBlack

            ' Recherche dans chaque liste
            Call AppliquerCouleur(cell, PlageOmega, RGB(148, 0, 211)) ' Violet
            Call AppliquerCouleur(cell, PlageLegum, RGB(0, 112, 192)) ' Bleu
            Call AppliquerCouleur(cell, PlageCheat, RGB(255, 0, 0))   ' Rouge
            Call AppliquerCouleur(cell, PlageAutres, RGB(0, 176, 80)) ' Vert
        End If
    Next cell

    MsgBox "Coloration terminée !", vbInformation

End Sub


Private Sub AppliquerCouleur(ByVal cell As Range, ByVal liste As Range, ByVal couleur As Long)
    Dim mot As Range
    Dim startPos As Long
  
    For Each mot In liste
        If Trim(mot.Value) <> "" Then
            startPos = InStr(1, cell.Value, mot.Value, vbTextCompare)
            Do While startPos > 0
                ' Mise en forme partielle du mot trouvé
                cell.Characters(startPos, Len(mot.Value)).Font.color = couleur
                cell.Characters(startPos, Len(mot.Value)).Font.Bold = True
              
                ' Continuer la recherche (si plusieurs occurrences)
                startPos = InStr(startPos + Len(mot.Value), cell.Value, mot.Value, vbTextCompare)
            Loop
        End If
    Next mot
End Sub
 

Pièces jointes

Dernière édition:
Solution
C'est mieux ainsi :
Code:
    '--- 3. Définir les plages dynamiquement
    With ws
        Dim PlageProteines As Range, PlageGraisses As Range, PlageGlucides As Range, PlageFibres As Range, PlageBoissons As Range
        Set PlageProteines = .Range("J2:J" & .Cells(.Rows.Count, "J").End(xlUp).Row)
        Set PlageGraisses = .Range("K2:K" & .Cells(.Rows.Count, "K").End(xlUp).Row)
        Set PlageGlucides = .Range("L2:L" & .Cells(.Rows.Count, "L").End(xlUp).Row)
        Set PlageFibres = .Range("M2:M" & .Cells(.Rows.Count, "M").End(xlUp).Row)
        Set PlageBoissons = .Range("N2:N" & .Cells(.Rows.Count, "N").End(xlUp).Row)
    End With
Chaque plage prend en compte l'ensemble de ses éléments.
que penser de ce code (ébauche, modifié et assisté) ?

VB:
Option Explicit

'=====================================================================
'  Macro : ColorerMotsRepas
'  Objectif : mettre en couleur les mots-clés présents dans les
'            colonnes AQ-AT (Omega 3, Légumineuses, Cheat-Meal, …)
'            pour chaque ligne de la colonne B (repas).
'=====================================================================

Public Sub ColorerMotsRepas()

    Dim ws As Worksheet
    Dim cell As Range
    Dim lastRow As Long
  
    Dim PlageProteines As Range      ' J2:J29  ? Prot
    Dim PlageGraisses As Range      ' K2:K29  ? Graisses
    Dim PlageGlucides As Range      ' L2:L29  ? Glucides
    Dim PlageFibres As Range     ' M2:M29  ? Fibres
    Dim PlageBoissons As Range     ' N2:N29  ? Boissons

    '--- 1??  Feuille cible -------------------------------------------------
    Set ws = ThisWorkbook.Sheets("plg")   ' ? adapte si ton onglet porte un autre nom
  
    '--- 2??  Définition des listes -----------------------------------------
    With ws
        Set PlageProteines = .Range("J2:J29")
        Set PlageGraisses = .Range("K2:K29")
        Set PlageGlucides = .Range("L2:L29")
        Set PlageFibres = .Range("M2:M29")
        Set PlageBoissons = .Range("N2:N29")
    End With
  
    '--- 3??  Dernière ligne réellement remplie en colonne B ---------------
    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
  
    '--- 4??  Parcours de chaque cellule de la colonne B --------------------
    For Each cell In ws.Range("B2:B" & lastRow)
        If Len(Trim(cell.Value)) = 0 Then GoTo ProchaineCellule   'ligne vide ? on passe
  
        '--- 4.1??  Remise à zéro du format ---------------------------------
        With cell.Font
            .Bold = False
            .Color = vbBlack
        End With
      
        '--- 4.2??  Recherche et coloration ---------------------------------
        Call AppliquerCouleur(cell, PlageProteines, RGB(148, 0, 211))   ' violet
        Call AppliquerCouleur(cell, PlageGraisses, RGB(0, 112, 192))   ' bleu
        Call AppliquerCouleur(cell, PlageGlucides, RGB(255, 0, 0))     ' rouge
        Call AppliquerCouleur(cell, PlageFibres, RGB(0, 176, 80))   ' vert
        Call AppliquerCouleur(cell, PlageBoissons, RGB(255, 116, 100))   ' ???
ProchaineCellule:
    Next cell
  
    MsgBox "Coloration terminée !", vbInformation
End Sub

'=====================================================================
'  Sous-procédure qui colore chaque occurrence d’un mot trouvé
'=====================================================================
Private Sub AppliquerCouleur(ByVal cell As Range, ByVal liste As Range, ByVal couleur As Long)

    Dim mot As Range
    Dim startPos As Long
    Dim texteCell As String
  
    texteCell = cell.Value
  
    For Each mot In liste
        If Len(Trim(mot.Value)) = 0 Then GoTo MotSuivant   'ignore les cellules vides de la liste
      
        startPos = InStr(1, texteCell, mot.Value, vbTextCompare)
        Do While startPos > 0
            With cell.Characters(startPos, Len(mot.Value)).Font
                .Color = couleur
                .Bold = True
            End With
            'recherche la prochaine occurrence du même mot
            startPos = InStr(startPos + Len(mot.Value), texteCell, mot.Value, vbTextCompare)
        Loop
MotSuivant:
    Next mot
End Sub

'=====================================================================
'  (Optionnel) Conversion du texte de date en vraie date Excel
'=====================================================================
Public Function ParseDate(txt As String) As Date
    'Exemple d’entrée :  Tue Oct 10 2017 02:00:00 GMT+0200 (heure d’été d’Europe centrale)
    Dim parts() As String, d As Date, hh As Long, mm As Long, ss As Long
  
    On Error GoTo ErrHandler
    parts = Split(txt, " ")
    'parts(1)=Oct, parts(2)=10, parts(3)=2017, parts(4)=02:00:00
    d = DateSerial(CLng(parts(3)), MonthNameToNumber(parts(1)), CLng(parts(2)))
    hh = CLng(Split(parts(4), ":")(0))
    mm = CLng(Split(parts(4), ":")(1))
    ss = CLng(Split(parts(4), ":")(2))
    ParseDate = DateAdd("h", hh, DateAdd("n", mm, DateAdd("s", ss, d)))
    Exit Function
ErrHandler:
    ParseDate = 0   'renvoie 0 si la conversion échoue
End Function

Private Function MonthNameToNumber(m As String) As Integer
    Select Case LCase(m)
        Case "jan": MonthNameToNumber = 1
        Case "feb": MonthNameToNumber = 2
        Case "mar": MonthNameToNumber = 3
        Case "apr": MonthNameToNumber = 4
        Case "may": MonthNameToNumber = 5
        Case "jun": MonthNameToNumber = 6
        Case "jul": MonthNameToNumber = 7
        Case "aug": MonthNameToNumber = 8
        Case "sep": MonthNameToNumber = 9
        Case "oct": MonthNameToNumber = 10
        Case "nov": MonthNameToNumber = 11
        Case "dec": MonthNameToNumber = 12
        Case Else: MonthNameToNumber = 0
    End Select
End Function
EXCEL_oWI1lXzzR5.png
 

Pièces jointes

VB:
Option Explicit

Public Sub ColorerMotsRepas()
    Dim ws As Worksheet
    Dim cell As Range
    Dim lastRow As Long

    '--- 1. Définition de la feuille cible
    Set ws = ThisWorkbook.Sheets("Feuil1")   ' Change si ton onglet a un autre nom

    '--- 2. Trouver la dernière ligne remplie en colonne C
    lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row

    '--- 3. Définir les plages dynamiquement
    With ws
        Dim PlageProteines As Range, PlageGraisses As Range, PlageGlucides As Range, PlageFibres As Range, PlageBoissons As Range
        Set PlageProteines = .Range("J2:J" & lastRow)
        Set PlageGraisses = .Range("K2:K" & lastRow)
        Set PlageGlucides = .Range("L2:L" & lastRow)
        Set PlageFibres = .Range("M2:M" & lastRow)
        Set PlageBoissons = .Range("N2:N" & lastRow)
    End With

    '--- 4. Parcours de chaque cellule de la colonne C
    For Each cell In ws.Range("C2:B" & lastRow)
        If Len(Trim(cell.Value)) = 0 Then GoTo ProchaineCellule   ' Ignore les cellules vides

        '--- 4.1. Remise à zéro du format
        With cell.Font
            .Bold = False
            .Color = vbBlack
        End With

        '--- 4.2. Recherche et coloration
        Call AppliquerCouleur(cell, PlageProteines, RGB(148, 0, 211))   ' Violet
        Call AppliquerCouleur(cell, PlageGraisses, RGB(0, 112, 192))   ' Bleu
        Call AppliquerCouleur(cell, PlageGlucides, RGB(255, 0, 0))     ' Rouge
        Call AppliquerCouleur(cell, PlageFibres, RGB(0, 176, 80))      ' Vert
        Call AppliquerCouleur(cell, PlageBoissons, RGB(255, 116, 100)) ' Orange clair

ProchaineCellule:
    Next cell

    MsgBox "Coloration terminée !", vbInformation
End Sub

'=====================================================================
'  Sous-procédure qui colore chaque occurrence d’un mot trouvé
'=====================================================================
Private Sub AppliquerCouleur(ByVal cell As Range, ByVal liste As Range, ByVal couleur As Long)
    Dim mot As Range
    Dim startPos As Long
    Dim texteCell As String

    texteCell = cell.Value

    For Each mot In liste
        If Len(Trim(mot.Value)) = 0 Then GoTo MotSuivant   ' Ignore les cellules vides

        startPos = InStr(1, texteCell, Trim(mot.Value), vbTextCompare)
        Do While startPos > 0 And startPos < Len(texteCell)
            With cell.Characters(startPos, Len(Trim(mot.Value))).Font
                .Color = couleur
                .Bold = True
            End With
            ' Chercher la prochaine occurrence du même mot
            startPos = InStr(startPos + Len(Trim(mot.Value)), texteCell, Trim(mot.Value), vbTextCompare)
        Loop
MotSuivant:
    Next mot
End Sub

Colorer les mots de C à F (contre C uniquement dans ce fichier) et avec les bonnes couleurs. Est-ce possible d'avoir ça s'il vous plaît ?


Merci !
 

Pièces jointes

Re,
Il est facile de capturer la couleur de la colonne utilisée en ligne 1, et la prendre en référence dans la macro, avec :
VB:
        '--- 4.2. Recherche et coloration
        Call AppliquerCouleur(cell, PlageProteines, [J1].Interior.Color)
        Call AppliquerCouleur(cell, PlageGraisses, [K1].Interior.Color)
        Call AppliquerCouleur(cell, PlageGlucides, [L1].Interior.Color)
        Call AppliquerCouleur(cell, PlageFibres, [M1].Interior.Color)
        Call AppliquerCouleur(cell, PlageBoissons, [N1].Interior.Color)
L'avantage, si on change une couleur en J1:N1 c'est automatiquement répercuté.
 

Pièces jointes

Re,
Mais j'ai un doute. Il me semble qu'il y ait un bug.
Vous faites :
VB:
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
Donc vous cherchez la dernière ligne de la colonne C.
Puis vous faites :
Code:
Set PlageProteines = .Range("J2:J" & lastRow)
Qui vous dit que la colonne J a la même taille que la colonne C ?

D'ailleurs dans votre fichier ce n'est pas le cas.
Mettez donc "fèves" en colonne C, vous verrez que "fèves" n'est pas colorée.
( normal puisque la colonne C s'arrête en 18 et la colonne J en 21. )

Je regarde une solution.
 
C'est mieux ainsi :
Code:
    '--- 3. Définir les plages dynamiquement
    With ws
        Dim PlageProteines As Range, PlageGraisses As Range, PlageGlucides As Range, PlageFibres As Range, PlageBoissons As Range
        Set PlageProteines = .Range("J2:J" & .Cells(.Rows.Count, "J").End(xlUp).Row)
        Set PlageGraisses = .Range("K2:K" & .Cells(.Rows.Count, "K").End(xlUp).Row)
        Set PlageGlucides = .Range("L2:L" & .Cells(.Rows.Count, "L").End(xlUp).Row)
        Set PlageFibres = .Range("M2:M" & .Cells(.Rows.Count, "M").End(xlUp).Row)
        Set PlageBoissons = .Range("N2:N" & .Cells(.Rows.Count, "N").End(xlUp).Row)
    End With
Chaque plage prend en compte l'ensemble de ses éléments.
 

Pièces jointes

ça colore le mot "eau" en bleu (logique) et le début de "maquereau" en marron...
Vicieux ça. 😟

Peut être une solution, mais je ne sais pas si ça couvrira toutes les possibilités.
Avant de colorer on vérifie si c'est en noir. Si le mot est en noir on colore, si c'est déjà coloré on passe. Avec :
VB:
        Do While startPos > 0 And startPos < Len(texteCell)
            With cell.Characters(startPos, Len(Trim(mot.Value))).Font
                If .Color = vbBlack Then
                    .Color = couleur
                    .Bold = True
                End If
            End With
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Probléme VBA
Réponses
8
Affichages
430
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
994
Réponses
5
Affichages
688
Réponses
4
Affichages
541
Réponses
4
Affichages
383
Retour