Comment mettre en gras une partie du contenu d'une cellule ?

Bonjour à vous,

Nouvellement arrivée sur le forum et débutant en macro ...

Je souhaite mettre en gras une partie du contenu de plusieurs cellules, toutes concaténées de la manière suivante :

=I42&"

Gencod commande: "&F42&"

"&"Code interne: "&E42&"

DLC: "&G42 "

Pour exemple :

PAVE *** BF X2 280G

Gencod commande: 3265988885201

Code interne: 16880

DLC: 16

Les données que je souhaite mettre en gras sont issues de " l42 " ( il s'agit du libellé du produit, dans le cas présent "PAVE *** BF X2 280G ").

Comment procéder ?

J'ai essayé avec cette formule :

Sub testii()

With Range("N41")

Range("N41").Characters(InStr(1, Range("N41").Value, "Gencod"), Len("")).Font.Bold = True

End With

End Sub

Cependant, se met en gras :

=I42&"

Gencod commande: "&F42&"

"&"Code interne: "&E42&"

DLC: "&G42 "

Ou encore, avec l'exemple présenté :

PAVE *** BF X2 280G

Gencod commande: 3265988885201

Code interne: 16880

DLC: 16

Soit malheureusement, l'inverse de ce que je souhaite avoir ....

D'où vient l'erreur ? Ou auriez-vous une autre formule VBA à me proposer qui fonctionne ?

Je vous remercie grandement par avance.

Très bonne année 2018 à tous.

Violaine

Bonjour et bonne année

Il faudrait un fichier exemple pour bien voir comment sont structurées tes données

Merci

A+

Bonsoir ,

Sub testii()
     With Range("N41")
         Range("N41").Characters(InStr(1, Range("N41").Value, "Gencod"), Len("")).Font.Bold = True
     End With
 End Sub

Si tu mets ta cellule sous bloc With, tu ne la répètes plus après dans le reste du code à l'intérieur du bloc, sinon c'est incohérent.

Len("") ! La longueur d'une chaîne de longueur nulle étant nulle, cela équivaut à ne rien mettre, et donc le reste du texte est mis en gras.

Sub testii()
    With Range("N41")
        .Characters(InStr(1, .Value, "Gencod"), ???).Font.Bold = True
    End With
End Sub

Les points d'interrogation à remplacer par la longueur de chaîne (nombre de caractères) à laquelle appliquer la commande.

(NB- J'apprécie beaucoup le With, mais n'aime pas le Range non quelifié ne référant pas explicitement à une feuille précise...)

Cordialement.

Je vous remercie beaucoup pour vos réponses.

Le problème, c'est que le nombre de caractères varie (dans mon fichier source, j'ai plus de 500 produits où je dois mettre en gras le libéllé)

Je vous mets en pièce jointe une copie, de comment est construit le document

Peut-être faudrait-il définir le gras à partir des données qui entourent le libéllé : soit rien au départ et "Gencod", mais je ne sais absolument pas comment faire.

En fait tu souhaites mettre en gras le début de la chaîne !

C'est donc défini du 1er caractère à ta recherche de Gencod (-2 car précédée d'une espace et la longueur se termine au caractère précédent).

.Characters(1, InStr(1, .Value, "Gencod") - 2) : voilà comment définir...

Cordialement.

Je vous remercie pour l'explication, je ne suis pas du tout issue du monde de l'informatique ... J'ai essayé votre formule soit :

Sub mettre_en_gras()

'

' mettre_en_gras Macro

With Range("N41")

.Characters(InStr(1, .Value, "Gencod"), -2).Font.Bold = True

End With

End Sub

Mais le résultat que j'obtiens est le suivant :

"PAVE *** BF X2 280G

Gencod commande: 3265980165201

Code interne: 16520

DLC: 16"

Bonjour,

Salut MFerrand ...

Tu peux tester le code suivant :

Sub mettre_en_gras()
   With Range("N41")
     .Characters(Start:=1, Length:=(InStr(1, .Value, "Gencod")) - 2).Font.Bold = True
  End With
End Sub

En espérant que cela t'aide ...

Bonjour Violaine,

Salut MFerrand

Violaine, ne vois-tu pas une petite différence entre la proposition de MFerrand:

MFerrand a écrit :

.Characters(1, InStr(1, .Value, "Gencod") - 2)

... et la tienne:

Violaine a écrit :

.Characters(InStr(1, .Value, "Gencod"), -2)

Un indice? ... L'aide en ligne précise:

Utilisez Characters ( Start , Length ), où Start est le numéro du premier caractère et Length le nombre de caractères, pour renvoyer un objet Characters.

[Edit:] Ooops, désolé, James: pas rafraîchi!

Il faut ouvrir les yeux :

Tu écris : .Characters(InStr(1, .Value, "Gencod"), -2)

soit 1er caract. visé = InStr(1, .Value, "Gencod") soit le G de Gencod !!!

longueur : -2 !!! valeur incorrecte donc tout ce qui suit se met en gras !

J'avais écrit : .Characters(1, InStr(1, .Value, "Gencod") - 2)

1er caract visé : 1 soit le P de PAVE, ce qui fait une sacré différence !!!

longueur : InStr(1, .Value, "Gencod") - 2, soit le range du G, qui doit être 21 (ou 22 si présence d'un saut de ligne que je ne vois pas, mais c'est sans importance), et on retranche 2, ce qui fait 19

soit ordre de mettre en gras les 19 premiers caractères de la chaîne.

Merci MFerrand et U. Milité ! Autant pour moi...

Cela fonctionne !! Désolé de vous avoir fait perdre votre temps....

Je comprends mieux avec votre seconde explication.

(J'ai bien fait un saut à la ligne en faisant "Alt entrer", mais je viens de découvrir que Ch(10) faisait apparemment la même chose.)

Et si je souhaite répéter cette même opération sur plusieurs lignes. J'imagine qu'il ne faut pas simplement écrire

With Range("N41:N544")...

Merci également à James007 !

(J'ai bien fait un saut à la ligne en faisant "Alt entrer", mais je viens de découvrir que Ch(10) faisait apparemment la même chose.)

Le caractère 10 est le saut de ligne !

Je le prends en note sur mes fiches. Je vous remercie grandement pour vos aides. Comme vous pouvez le constater je débute vraiment ...

J'ai également une autre question. Cette macro qui vient d'être réalisée fonctionne sur une cellule où j'ai procédé à un copier/coller du contenu en valeurs. Cependant, si je souhaite réaliser cette formule directement sur la cellule où il y a la concatenation, je dois, j'imagine coder quelque-chose pour "rendre blanc" la concatenation et que ce soit comme si ce n'était que des valeurs. Mais là encore, je n'ai pas encore trouvé comment faire...

Et si je souhaite répéter cette même opération sur plusieurs lignes. J'imagine qu'il ne faut pas simplement écrire

With Range("N41:N544")...

Mais justement pourquoi pas ! ?

Je préfèrerais cependant très nettement :

    With Worksheets("Feuil1").Range("N41:N544")

J'espère que tu vois la différence ! Ici on n'a plus une plage qui se raccordera à la première feuille active venue, mais une plage qualifiée, explicitement rattachée à la feuille parente, plus d'erreur possible, et comme VBA n'aura pas à chercher quelle est la feuille active puisqu'on lui dit la feuille, c'est plus rapide !

Ensuite :

    With Worksheets("Feuil1").Range("N41:N544")
        For i = 1 To .Rows.Count
            .Cells(i, 1).Characters(....etc.
        Next i
    End With

Comme tu vois cela peut même te faciliter les choses, la plage mise sous bloc With, la parcourir ce sera toujours de sa ligne 1 jusqu'à son nombre de lignes, et elle n'a qu'une colonne, toujours sa colonne 1.

(Ne pas omettre déclarer les variables...)

Cordialement.

Cependant, si je souhaite réaliser cette formule directement sur la cellule où il y a la concatenation, je dois, j'imagine coder quelque-chose pour "rendre blanc" la concatenation et que ce soit comme si ce n'était que des valeurs.

Tu te doutes bien que tu peux traiter différemment des caractères insérées dans la cellule, mais si la cellule contient une formule, elle ne contient pas les caractères... Il convient d'écraser la formule pour la remplacer par sa valeur.

Ce qui se fait facilement en VBA, genre :

        .Cells(x, y).Value = .Cells(x, y).Value

Mais pourquoi alors mettre une formule, autant insérer directement le résultat de la concaténation par VBA, on gagnera du temps.

Merci également à James007 !

De rien ...

Il faut avouer qu'au tout début ... il est plus simple d'avoir Start et Length comme indicateurs...

Re-bonjour,

MFerrand a écrit :

Mais pourquoi alors mettre une formule, autant insérer directement le résultat de la concaténation par VBA, on gagnera du temps.

J'aurais tendance à être plutôt d'accord avec cette suggestion

On pourrait aussi imaginer que la concaténation et la mise en gras des caractères se fasse au fur et à mesure de l'encodage (soit au changement de valeur dans une cellule déterminée de la ligne en cours de modification, soit via un double-clic, par exemple, en colonne L) ... Je proposerai un bout de code, si la piste intéresse Violaine

On pourrait aussi imaginer que la concaténation et la mise en gras des caractères se fasse au fur et à mesure

Tout à fait, puisqu'à ce stade la partie à mettre en gras constitue un élément séparé !... Cela ne peut que faciliter !

Merci à vous MFerrand !!

U. Milité, je serais vraiment partante d'avoir par VBA la concaténation et la mise en gras des caractères se faisant au fur et à mesure de l'encodage au changement de valeur dans une cellule déterminée de la ligne en cours de modification. Ce serait en effet plus simple ... Je ne vois pas du tout comment faire par codage les deux à la fois...

Rechercher des sujets similaires à "comment mettre gras partie contenu"