VBA : MeF une chaîne de caractère entre deux éléments

Bonjour

Je vous remercie d'avance pour tous vos précieux conseils.

J'ai besoin d'avoir une VBA simple me permettant de mettre en gras une chaîne de caractère "spécifique" dans le sens où elle est comprise entre deux chaînes de caractères.

Mon besoin est que pour toute la colonne (AR:AR) les chaines de caractères "ABDC254" ou "EFGX1458" ou "MNBPO1245" qui sont comprises entre les éléments (début) "mon texte : " et (fin) "/" soit en gras. Sachant que j'ai les trois cas suivant:

  • "blablabla; mon texte : ABDC254/ blablabla"
  • "Mon texte : EFGX1458/ blabla"
  • "Mon texte : MNBPO1245/"

Si les élements "Mon texte : " et "/" sont en gras ce n'est pas un soucis, je veux juste que le blablabla qui peut précéde et/ou qui succéde ne soit pas en gras

J'ai essayé de faire une macro pas à pas en dans l'espoir de modifier le code mais je suis complètement perdue.

Sub MettreEnGrasChaineCaractere()
'
' MettreEnGrasChaineCaractere Macro
' Mettre en gras une chaine de caractère
'

'
    ActiveCell.FormulaR1C1 = "Mon texte : ABCD/ blablabla"
    With ActiveCell.Characters(Start:=1, Length:=0).Font
        .Name = "Arial"
        .FontStyle = "Normal"
        .Size = 18
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
    With ActiveCell.Characters(Start:=1, Length:=15).Font
        .Name = "Arial"
        .FontStyle = "Gras"
        .Size = 18
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
    With ActiveCell.Characters(Start:=16, Length:=11).Font
        .Name = "Arial"
        .FontStyle = "Normal"
        .Size = 18
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
    Range("AR12").Select
End Sub

Je n'arrive pas à utiliser correctement "Characters".

Je vous remercie d'avance pour votre contribution.

Ps : je ne peux pas vous joindre le fichier.

Bonjour,

Essaie ainsi :

Sub MettreEnGrasChaineCaractere()
    Dim d%, f%, tx$
    tx = ActiveCell
    d = InStr(1, tx, "texte") + 8
    f = InStr(1, tx, "/") - d
    ActiveCell.Characters(d, f).Font.Bold = True
End Sub

Cordialement.

MFerrand a écrit :

Bonjour,

Essaie ainsi :

Sub MettreEnGrasChaineCaractere()
    Dim d%, f%, tx$
    tx = ActiveCell
    d = InStr(1, tx, "texte") + 8
    f = InStr(1, tx, "/") - d
    ActiveCell.Characters(d, f).Font.Bold = True
End Sub

Cordialement.

Bonjour MFerrand, je te remercie pour ton retour sur ce post, ton code fonctionne à merveille en toute simplicité, je ne pouvais rêver mieux !

je me suis permise d'enlever " +8" et "-d" comme mon tableau a des subtilités : disons que le texte que je dois mettre en gras n’apparaît pas à un point précis dans ma cellule.

Par contre j'ai une question est-ce qu'il est possible de changer ActiveCell par Range(AR:AR) j'ai plus de 180000 lignes et je souhaiterai que toutes les cellules soient prises en charge. Si ce n'est pas possible quels sont les opérations et autres modes raccourcis à appliquer.

Re,

Les deux paramètres de la méthode Characters pour délimiter un fragment de texte, c'est le rang du premier caractère concerné, et le nombre de caractères concernés...

Pour Range("AR:AR") il vaut déjà mieux mettre des guillemets, et Columns("AR") correspondra au même objet renvoyé.

Et pour bien faire il est préférable de qualifier (c'est à dire faire référence à la feuille) : Worksheets("xxx").Columns("AR")...

Délimiter aussi la plage serait aussi bien, si tu as 180000 lignes à parcourir, pas la peine d'en parcourir un million !

Sub MettreEnGras()
   Dim c As Range....
   With Worksheets("XXXX")
       For Each c In .Range("AR2:AR" & .Columns("AR").SpecialCells(xlCellTypeLastCell).Row)
           'c représente la cellule que tu traites (le traitement doit être le même pour toutes, sinon à différencier selon conditions
       Next c
    End With
End Sub

Cordialement.

MFerrand a écrit :

Re,

Les deux paramètres de la méthode Characters pour délimiter un fragment de texte, c'est le rang du premier caractère concerné, et le nombre de caractères concernés...

Pour Range("AR:AR") il vaut déjà mieux mettre des guillemets, et Columns("AR") correspondra au même objet renvoyé.

Et pour bien faire il est préférable de qualifier (c'est à dire faire référence à la feuille) : Worksheets("xxx").Columns("AR")...

Délimiter aussi la plage serait aussi bien, si tu as 180000 lignes à parcourir, pas la peine d'en parcourir un million !

Sub MettreEnGras()
   Dim c As Range....
   With Worksheets("XXXX")
       For Each c In .Range("AR2:AR" & .Columns("AR").SpecialCells(xlCellTypeLastCell).Row)
           'c représente la cellule que tu traites (le traitement doit être le même pour toutes, sinon à différencier selon conditions
       Next c
    End With
End Sub

Cordialement.

Super.

Merci pour ces explications.

Par contre je ne sais pas comment je combine les deux phases de code de ta première réponse et de ta deuxième réponse.

Voilà la combinaisons des deux que tu peux adapter comme tu l'entends...

Sub MettreEnGrasChaineCaractere()
    Dim c As Range, d%, f%, tx$
    Application.ScreenUpdating = False
    With Worksheets("XXXX")
        For Each c In .Range("AR2:AR" & .Columns("AR").SpecialCells(xlCellTypeLastCell).Row)
            tx = c
            d = InStr(1, tx, "texte") + 8
            f = InStr(1, tx, "/") - d
            c.Characters(d, f).Font.Bold = True
        Next c
    End With
End Sub

Le Application.ScreenUpdating = False a pour effet d'inhiber la mise à jour de l'affichage. Vu ce que tu as à faire (180000 lignes) c'est tout à fait indispensable pour réduire un peu la durée d'exécution...

Cordialement.

NB- Tu n'es pas obligé de citer... il suffit de cliquer sur Répondre... !

Super ce code fonctionne ! Je te remercie pour ta précieuse aide et tes conseils.

Oui effectivement j'aurai pu répondre au lieu de citer et alourdir les échanges.

Bonne continuation.

Rechercher des sujets similaires à "vba mef chaine caractere entre deux elements"