Mettre en gras et souligner plusieurs mots dans une phrase

Bonjour à tous,

je pense que cette demande a déjà été traitée de multiples fois mais je ne comprends pas toujours les codes et réponses...

Mon problème : j'ai un tableau sur excel 2010 dans lequel j'ai la colonne Q qui contient les ingrédients des articles que je vend, s'agissant de produits pour les allergiques, je veux mettre en gras et souligner le mot "oeuf" s'il est présent dans la liste des ingrédients, ainsi que le mot "lait" ainsi que "soja" etc... et ce pour 13 allergènes sur les 1900 lignes que j'ai...

Sous mise en forme conditionnelle, lorsque j'ai le mot contenu dans ma phrase, toute la phrase se met en gras et souligné, je ne vois donc qu'une solution : le VBA auquel je ne comprends strictement rien !!!

Je ne poste pas le fichier Excel car il pèse 8 000 Ko mais si besoin, je peux en simuler un moins lourd au cas ou je n'ai pas été assez clair.

D'avance merci.

Hervé

si besoin, je peux en simuler un moins lourd au cas ou je n'ai pas été assez clair

Il vaudrait mieux si tu veux qu'on voit comment ça se présente et qu'on dispose d'un support pour tester et répondre...

Ce n'est pas seulement une question de clarté, illustrer ajoute toujours des informations.

Et pour ma part, si je n'ai pas de classeur pour répondre, je n'en fabriquerai pas et la réponse, si elle convient sera nécessairement moins facilement adaptable, voire plus difficilement...

Cordialement.

Bonjour,

tout d'abord merci pour la rapidité de votre réponse.

J'ai fait un mini tableur avec les 3 premières lignes de mon tableau pour expliquer ce que je recherche en colonne Q.

Si c'est pas clair, n'hésitez pas...

Merci Hervé

Bonsoir,

Tu as parlé d'une liste. Je ne la vois pas...

Pour explication : en voulant mettre en forme du texte en temps que tel, tu n'es plus dans des fonctionnalités relevant d'un tableur mais dans des fonctionnalités de type traitement de texte.

Les outils de tableur n'ont donc aucun effet... Dans la mesure où le texte en tant qu'objet Caractères peut être atteint on peut donc intervenir pour en modifier certaines caractéristiques, dans les même conditions ou tu opères manuellement.

NB- 8000 ko me paraît lourd, surtout pour du texte.

Cordialement.

Bonsoir,

dans mon langage de petit commerçant, la succession d'ingrédients contenu dans une recette est ce que j'appelle la liste des ingrédients (colonne Q) et c'est la dessus que je veux intervenir.

J'ai mis uniquement les 3 premières lignes du tableur pour synthétiser mais celui ci est la bible de mon commerce, j'y entre tous les produits, ingrédients, allergènes, prix d'achat, achat par mois, vente par semaine, marge calculée automatiquement, alerte sur les Dluo dépassées, commentaire divers, tarifs de la concurrence... Celui ci contient 428 colonnes sur 1999 lignes et oui il pèse 7.86 MO.

D'après ce que j'ai lu, ma solution se trouve dans la mise en place d'une macro, mais ne sachant pas faire, je demande de l'aide.

Merci quand même d'avoir regardé.

Cordialement,

Hervé

je veux mettre en gras et souligner le mot "oeuf" s'il est présent dans la liste des ingrédients, ainsi que le mot "lait" ainsi que "soja" etc... et ce pour 13 allergènes sur les 1900 lignes

Je n'ai pas rêvé ! Tu appeles "liste" ce que tu veux mais liste signifie généralement suite ou succession d'éléments ; dans un tableur pour pouvoir traiter une liste en tant que liste il faut pouvoir dissocier les éléments de la liste les uns des autres et donc de disposer d'un séparateur pour le faire.

Mais la question ne portait de toute façon pas là-dessus !

tu demandes de mettre en gras et souligné des mots, tu en annonces 13, je cherche donc cette liste de 13. Si elle est dans ta tête, elle ne sert à rien.

Sinon je peux toujours tenter de mettre en gras les espaces

Re bonsoir,

j'ai bien ri pour les espaces en gras... Pour le sens du mot liste, désolé je n'ai pas le langage tableur...

Quant à la fameuse liste de 13 allergènes, ils sont en fait 16 et se trouve dans le classeur que vous m'avez demandé au premier post ligne Q 13!!!

Vous m'aviez bien prévenu qu'il fallait un support il est dans mon deuxième Post, mais faut-il le lire

Encore merci de votre altruisme à cette heure.

Hervé

Salut RV13,

Bonsoir MFerrand,

RV13, j'adore ce genre de défi auquel je n'y connais rien en démarrant et qui m'oblige à explorer le no man's land de VBA!

Voici un premier début de solution qui traitera directement toute cellule en colonne Q dès sa validation après écriture, qui fonctionne très bien chez moi!

Private Sub Worksheet_Change(ByVal Target As Range)
'
Dim sFlag As String
Dim tCellule As Variant
Dim tAllergènes() As Variant
'
If Not Application.Intersect(Target, Range("Q:Q")) Is Nothing Then
    tAllergènes = Array("lait", "lait en poudre", "œuf", "soja", "arachide", "noisette", "noix", "noix de pécan", "amande", "sésame", "céleri", "crustacé", "poisson", "mollusque", "lupin", "moutarde", "sulfite")
    '
    sFlag = Target.Value
    tCellule = Split(sFlag, ", ")
    '
    iFlag = 0
    iFlag1 = 0
    iFlag2 = 0
    '
    For x = 0 To UBound(tCellule)
        If x > 0 Then
            iFlag = iFlag + Len(tCellule(x - 1)) + 2
        Else
            iFlag = 0
        End If
        '
        For y = 0 To UBound(tAllergènes)
            If LCase$(tCellule(x)) = LCase$(tAllergènes(y)) Then
                iFlag1 = iFlag + 1
                iFlag2 = Len(Trim(tCellule(x)))
                '
                With Target.Characters(Start:=iFlag1, Length:=iFlag2).Font
                    .FontStyle = "Bold"
                    .Underline = xlUnderlineStyleSingle
                End With
                '
            End If
        Next
    Next
End If
'
End Sub

Attention, j'utilise des fonctions qui (sauf erreur ou ignorance de ma part! Désolé!) exigent une certaine discipline de ta part dans l'écriture de tes ingrédients.

A savoir, une VIRGULE et un ESPACE après chaque ingrédient (comme tu l'écris toi-même) ET, dans un tableau de données inclus dans la macro, le détail de tous les ingrédients comportant un allergène (ex: lait, lait en poudre, lait ceci, lait cela,...).

Pour le reste, je vais compléter par une autre macro pour traiter tes 2000 lignes! J'y travaille!

Chaque chose en son temps à moins qu'un crack ne s'en mêle ce dont je l'en prie, d'ailleurs!

A+

Bonjour

@ curulis57

Tu as demandé une macro pour traiter toutes les lignes, j'espère que celle dans le fichier joint conviendra

wouah !!!

Impressionnant cette langue que je ne connais pas !!!

Le détail entre lait, lait en poudre, lait écrémé m'importe peu puisque c'est le lait l'allergène quelque soit sa forme et c'est donc ce mot "lait" qui sera en gras et souligné

Je pense par contre qu'il faudra donc que je distingue les mots au pluriel comme amande et amandes ???

Par contre les 2000 lignes sont dans la colonne Q ( lignes Q 6 à Q 1999) pour être précis...

Tiens question piège, lorsque je reçois de nouveaux produits je rentre une nouvelle ligne (Q 2000), est ce que ça marche aussi ?

Merci en tout cas pour cette formule, je vais tenter de l'appliquer immédiatement...

Je reviens très vite.

Hervé

Salut Curulis,

A vue d'oeil l'essentiel y est... Mais je ne sais pas si splitter est le mieux dans ce cas. InStr serait peut-être plus fiable, et doublant le tableau allergènes d'un autre indiquant de nb de caractères de chacun, le repérage de l'allergène (position du 1er caractère) suffit pour la suite.

Cordialement.


RV13, désolé pour les 13 allergènes de la ligne 13 !!! que je n'avais pas vu.

L'affaire étant réglée à quelques ajustement près, bonsoir à tous...

Bonsoir RV13, MFerrand, Banzaï,

@Banzaï : trop fort pour moi! Impec, évidemment!

Mais, j'apprends de toi tous les jours ! Merci ! (tu viens de me donner du boulot, là encore! )

Te souviens-tu de cette macro pour Sedwick? Toi, 9 sec., moi... 7'30 ! J'ai réduit l'écart à... 9 sec, grâce à ton code que j'ai épluché! Restent les FormulaRC..., comprends pas...

@MFerrand : effectivement, Instr serait plus indiqué dans cette situation qui éviterait à RV13 l'obligation de ne rien oublier!

Etant pour l'instant dans les SPLIT et autre affectation de Range dans des tableaux, je suis resté dans mon trip...

Le code de Banzaï a mis tout le monde d'accord, je pense!

Pour le plaisir du jeu, avec mes petites connaissances, voici ma macro pour traiter le fichier de RV13 :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
Dim sFlag As String
Dim tCellule As Variant
Dim tAllergènes() As Variant
'
tAllergènes = Array("lait", "lait en poudre", "œuf", "soja", "farine de soja", "lécithine de soja", "arachide", "noisette", "noix", "noix de pécan", "amande", "sésame", "céleri", "crustacé", "poisson", "mollusque", "lupin", "moutarde", "sulfite")
'
iRow = Range("Q" & Rows.Count).End(xlUp).Row
'
For Z = 5 To iRow
    sFlag = Cells(Z, 17)
    tCellule = Split(sFlag, ", ")
    '
    iFlag = 0
    iFlag1 = 0
    iFlag2 = 0
    '
    For x = 0 To UBound(tCellule)
        If x > 0 Then iFlag = iFlag + Len(tCellule(x - 1)) + 2
        '
        For y = 0 To UBound(tAllergènes)
            If LCase$(tCellule(x)) = LCase$(tAllergènes(y)) Then
                iFlag1 = iFlag + 1
                iFlag2 = Len(Trim(tCellule(x)))
                '
                With Cells(Z, 17).Characters(Start:=iFlag1, Length:=iFlag2).Font
                    .FontStyle = "Bold"
                    .Underline = xlUnderlineStyleSingle
                End With
                '
            End If
        Next
    Next
Next
'
End Sub

@RV13 : bon travail... La boucle for Z NEXT commence à 5 puisque les données de ton fichier, colonne Q démarraient en ligne 5.

moi ? , ben, je m'y remets... Merci, Banzaï!

Avec plaisir!

A+, tout le monde!

Bonsoir,

Curulis et MFerrand,

Merci pour le message de la ligne 13 MFerrand,

Merci pour ce travail de fou Curulis, c'est presque parfait, juste un léger défaut logique, lorsque j'ai "viande de boeuf" j'ai boeuf... Est ce qu'il y a une solution ???

Il en va de même pour la noix de coco qui n'est pas un allergène mais la noix oui...

En tout cas merci, vous venez de me faire faire une grande avancée.

La suite pour moi, c'est demain.

Hervé


OULALA,

je me suis perdu je sais plus de qui vient la solution, puisque je viens de voir qu'il y a Banzaï aussi...

Merci à tous.

Hervé

Salut Hervé,

à mon avis, tu as utilisé le code de Banzaï pour balayer ton fichier... mon code a ses limites et il n'aurait pas commis cela puisqu'il travaille sur des mots entiers!

Comme quoi, rien n'est de suite parfait en ce monde!

A chaque jour suffit sa peine! On verra plus clair demain!

A+

Oui effectivement, je crois que j'y verrais plus clair demain...

Merci encore.

Hervé

J'ai trouvé la solution pour te simplifier le travail à fond les manettes!

Je teste plus en profondeur et je te donne cela!

A+

Bon, ben, quasi 3h00 du mat'..., va être contente, madame, tiens!

Dernières élucubrations de Curulis pour cette nuit!

La viande de boeuf étant signalée comme allergène, à mon avis par le code de Banzaï, j'y ai mis mon grain de sel en splittant le splitté!

Je m'explique : le boeuf étant déclaré coupable par Instr (vraisemblablement!), j'ai splitté tCellule dans tIntCel pour contourner Instr!

Au secours, Banzaï! Dis-moi que tu as mieux!

En tout cas, ça fonctionne super... chez moi! A tester chez toi, Hervé!

Voici les deux codes : Worksheet_SelectionChange() -en cliquant n'importe où dans ta feuille1 - pour traiter ton fichier complet et Worksheet_change() pour tous les jours (neutralise alors la première macro avec "Application.EnableEvents=False") qui fonctionne dès que tu encodes (oui, même à la 1.048.000e ligne!) les ingrédients d'un nouveau produit.

On verra tout à l'heure les détails... hein, tu veux bien...

Private Sub Worksheet_Change(ByVal Target As Range)
'
Exit Sub
'
Dim sFlag As String
Dim tCellule As Variant
Dim tIntCel As Variant
Dim tAllergènes As Variant
'
If Not Application.Intersect(Target, Range("Q:Q")) Is Nothing Then
    tAllergènes = Array("lait", "laits", "œufs", "œuf", "oeuf", "oeufs", "soja", "sojas", "arachide", "arachides", _
                        "noisette", "noisettes", "noix", "amande", "amandes", "sésame", "sésames", "céleri", "céleris", _
                        "crustacé", "crustacés", "poisson", "poissons", "mollusque", "mollusques", "lupin", "lupins", _
                        "moutarde", "moutardes", "sulfite", "sulfites")

    tCellule = Split(Target.Value, ", ")
    '
    iFlag = 0
    iFlag1 = 0
    iFlag2 = 0
    '
    With Target.Font
        .ColorIndex = 1
        .Bold = False
        .Underline = False
    End With
    '
    For x = 0 To UBound(tCellule)
        If x > 0 Then iFlag = iFlag + Len(tCellule(x - 1)) + 2
        For y = 0 To UBound(tAllergènes)
            tIntCel = Split(tCellule(x), " ")
            For Z = 0 To UBound(tIntCel)
                If LCase$(tIntCel(Z)) = LCase$(tAllergènes(y)) Then
                    iFlag1 = iFlag + 1
                    iFlag2 = Len(Trim(tCellule(x)))
                    With Target.Characters(Start:=iFlag1, Length:=iFlag2).Font
                        .ColorIndex = 3
                        .Bold = True
                        .Underline = True
                    End With
                End If
            Next
        Next
    Next
End If
'
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
Dim sFlag As String
Dim tCellule As Variant
Dim tIntCel As Variant
Dim tAllergènes() As Variant
'
tAllergènes = Array("lait", "laits", "œufs", "œuf", "oeuf", "oeufs", "soja", "sojas", "arachide", "arachides", _
                        "noisette", "noisettes", "noix", "amande", "amandes", "sésame", "sésames", "céleri", "céleris", _
                        "crustacé", "crustacés", "poisson", "poissons", "mollusque", "mollusques", "lupin", "lupins", _
                        "moutarde", "moutardes", "sulfite", "sulfites")
'
With Columns("Q")
    With .Font
        .ColorIndex = 1
        .Bold = False
        .Underline = False
    End With
End With
'
iRow = Range("Q" & Rows.Count).End(xlUp).Row
'
For w = 5 To iRow
    '
    tCellule = Split(Cells(w, 17), ", ")
    '
    iFlag = 0
    iFlag1 = 0
    iFlag2 = 0
    '
    For x = 0 To UBound(tCellule)
        If x > 0 Then iFlag = iFlag + Len(tCellule(x - 1)) + 2
        For y = 0 To UBound(tAllergènes)
            tIntCel = Split(tCellule(x), " ")
            For Z = 0 To UBound(tIntCel)
                If LCase$(tIntCel(Z)) = LCase$(tAllergènes(y)) Then
                    iFlag1 = iFlag + 1
                    iFlag2 = Len(Trim(tCellule(x)))
                    With Cells(w, 17).Characters(Start:=iFlag1, Length:=iFlag2).Font
                        .ColorIndex = 3
                        .Bold = True
                        .Underline = True
                    End With
                End If
            Next
        Next
    Next
Next
'
End Sub

Je me suis super amusé sur ce coup-là! Merci les gars!

A+

Bonjour

Oui j'ai vu le problème de l’œuf dans le bœuf et je pensais avoir une parade (qui fonctionne à 99%) , je rajoute une espace en début de l'allergène à trouver

Le % de ratage c'est quand la phase commence par un allergène, celui-ci n'est pas détecter

Donc j'ai repris ma copie, qui devient un peu plus compliqué mais pas trop

Je teste la position de l'allergène dans la phrase

Si position = 1 on autorise la mise en valeur de l'allergène

Si position > 1 et le caractère à position -1 est égal à une espace alors on autorise la mise en valeur de l'allergène

Dans les autres cas on ne fait rien

A tester

Bonjour,

merci pour tous vos efforts.

Désolé pour mon silence mais j'ai eu beaucoup de monde en magasin hier (début de mois oblige) et malgré quelques tentatives, je n'ai pas réussi à regarder le dossier. Je tente de m'y afférer aujourd'hui, sinon demain dimanche et je reviens vers vous.

Hervé

Re bonjour,

vous êtes impressionnant de génie !!!

Curulis, merci pour tout par contre, je n'ai pas pu utiliser ta formule car j'ai tenté de tout sélectionner, copier coller dans une macro mais il ne veut pas, j'avais prévenu, je suis TRÈS incompétent en macro, VBA et langage informatique...

Banzaï, comment dire.... Merci, ça marche très bien, le fait de l'avoir mis en lien excel, j'ouvre la simulation avec mon classeur et j'exécute la macro, ça fonctionne très très bien l’œuf et le bœuf ne s'affrontent plus, j'ai ajouté les pluriels, avec et sans accent, le e dans l'o ou pas dans ma feuille liste et tout se met à jour, merveilleux !!!

Par contre, avant de cliquer sur résolu, je vais faire mon lourd pour un dernier défi... est il possible de créer de l’exception dans cette liste, c'est à dire que noix s'affiche rouge gras surligné sauf s'il s'agit du mot noix de coco ou noix de muscade, et lait s'affiche sauf s'il s'agit de "lait de riz" ou de "lait de coco" et attention, le pire en dernier, "lait de soja" sur lequel lait ne s'affiche pas car non allergène mais soja s'affiche car allergène !!!

Désolé je suis un peu lourd... ce sont les 5 seuls cas de figures qui sont contradictoires, si ce n'est pas possible, je peux les corriger manuellement.

D'avance merci.

Hervé

Rechercher des sujets similaires à "mettre gras souligner mots phrase"