Mise en forme ds caractères d'une chaîne après concaténation

Bonjour,

Je cherche à modifier la mise en forme de certains caractères d'une chaine issue de la concaténation de différentes cellules.

Malheureusement, malgré tous mes essais, il semble que dès lors qu'on veut agir sur le résultat d'une fonction, il n'y a aucun effet sur la police de caractères.

Lors de mes différentes tentatives, j'ai d'abord concaténer les chaines à l'aide de la fonction =CONCATENER(chaine1, chaine2, chaine3) puis j'ai appliqué la propriété Characters(Début, Longueur).Font.color=RGB(255, 0, 0) à la chaine obtenue mais rien ne change.

J'ai ensuite fait la même opération mais uniquement en VBA ce qui n'a pas donné de meilleur résultat puis j'ai essayé en créant une fonction personnalisée mais cela ne fonctionne pas plus.

Je ne sais plus quoi essayer... Quelqu'un saurait-il comment réaliser cette opération?

Merci d'avance.

Characters va s'appliquer au contenu de la cellule, pas au résultat !

Il faudrait donc en VBA mettre dans la cellule non pas la fonction CONCATENER mais le résultat de celle-ci, et réactiver ce calcul+mise en forme à chaque changement des valeurs source.

Bonjour Steelson et merci d'avoir répondu à mon problème.

Juste après avoir exposé mon problème, je suis tombé sur la même problématique sous le titre "Mise en forme dans une cellule apres avoir concatener". J'ai donc chargé le fichier donné et je l'ai testé. Il fonctionne correctement.

...pour une raison qui m'est encore inconnue, le code donné fonctionne dans le fichier fourni mais ne fonctionne pas qd je l'adapte à mon fichier. Je continu a chercher et je te tiens au courant de mes avancées.

Merci beaucoup

Bonjour Steelson et à tous ceux qui voudront bien se pencher sur mon problème,

Je vais mieux expliquer mon problème.

Je souhaite concatener 1, 2 ou 3 chaines de façon a obtenir la(/les) ligne(s) suivante(s) en fonction du nombre de rendez-vous fixé et des délais.

Pour la première ligne, cela peut être (si il y a 2 ou 3 RdV):

"Votre 1er rendez-vous est dans 7 jours"

"Votre 1er rendez-vous est dans " & Délais1 & " jours"

ou (si il n'y a qu'un seul RdV):

"Votre dernier rendez-vous est dans 21 jours"

"Votre dernier rendez-vous est dans " & Délais_Dernier_RdV & " jours"

Pour la 2ème ligne et la 3ème ligne, j'applique le même principe.

Comme je souhaite que les lignes s'actualisent automatiquement en fonction de la modification du nb de RdV ou des modifications des délais, j'ai créé des fonctions personnalisées (une fonction pour chacune des ligne). J'avais dans un premier temps employé la fonction CONCATENER avec des conditions et cela fonctionne aussi.

Mon soucis est que dans un cas comme dans l'autre, les nombres représentants les délais ne passent pas en bleu automatiquement en employant la propriété "Characters.Font.color" alors que la propriété "Font.Color" appliquée à la même "range" modifie bien tout le texte.

Je ne sais plus sur quelle piste chercher donc si l'un de vous a une idée....


Voici le fichier test.

Bonjour,

Toujours le même problème : ta cellule s'affiche avec un résultat, mais elle contient en fait une fonction ! et donc tu ne pourras pas colorier le xième caractère de cette fonction ...

Il faut donc procéder non pas à une FUNCTION mais à une SUB qui mettre dans la cellule le résultat, et là tu pourras colorier une partie. Quitte à asservir la réactivation de cette SUB aux changements des valeurs entrées.

J'espère être assez clair !?

Bonjour Steelson,

Oui, oui ta réponse est claire, mais sais tu pourquoi la propriété "Characters" ne fonctionne pas alors que la propriété "Font" fonctionne? J'avais mis dans le code une ligne en commentaire pour faire le test "Range("XX").Font.color = RGB(255,0,0)".

J'ai utilisé des formules prédéfinies ou personnalisées afin que le rafraîchissement des cellules contenants les résultats se fasse uniquement sur modification des paramètres "Nb de RdV", "Délais 1er RdV", "Délais 2nd RdV" ou "Délais dernier RdV"; ceci pour éviter qu'à chaque modification d'une cellule quelconque de la feuille (-sur lévènement: Worksheet_SelectionChange-), je fasse un test du type "est ce que la cellule qui vient d'être modifiée fait partie de ma paramètres?".

Afin d'éviter la routine dont je parlais dans mon précédent message, je viens de faire un nouveau test en créant une Function qui est déclenchée sur modification d'un des "paramètres" et qui appelle une Sub.

Bein... ça marche pas !!!

RicDuL a écrit :

ceci pour éviter qu'à chaque modification d'une cellule quelconque de la feuille (-sur lévènement: Worksheet_SelectionChange-), je fasse un test du type "est ce que la cellule qui vient d'être modifiée fait partie de ma paramètres?".

tu peux limiter le calcul aux seules cellules concernées sans tout rebalayer ...

je vais regrader ton nouveau fichier ... mais ATTENTION : la SUB appelée par FUNCTION risque en effet de ne pas marcher dans ton cas ...

J'ai regardé ton exemple et en effet l'appel à la SUB ne peut pas fonctionner comme cela !!

Par ailleurs, comme je l'ai dit plus haut, la couleur ne peut être changée sur le résultat d'un calcul mais seulement sur le contenu textuel de la cellule.

1- soit tu fais un Private Sub Worksheet_Change(ByVal Target As Range) et tu ne traite que la cellule (target) modifiée, et là tu pourras inscrire en "dur" le résultat texte attendu et le mettre en peinture, c'est la solution que j'évoquais précédemment

2- soit tu fais une fonction un peu spéciale qui contourne le fait qu'une UDF ( User Defined Function ) ne puisse pas modifier des cellules voisines : on y arrive notamment en utilisant EVALUATE comme dans l'exemple joint simplissime que je t'ai fait pour montrer cette possibilité

23voisin.xlsm (14.91 Ko)
  • la fonction est appliquée sur une cellule et affiche n'importe quoi en résultat, ou ce que tu veux
  • la fonction génère une valeur dans la cellule voisine, et c'est sur cette valeur-texte que tu appliques ta mise en peinture
Function ChangeValeurVoisine(Cel As Range) As String
    Evaluate "Voisin(" & Application.Caller.Offset(0, 1).Address(False, False) & "," & Cel.Value & ")"
    ChangeValeurVoisine = ">>>"
End Function

Sub Voisin(MonVoisin As Range, age As Integer)
    MonVoisin.Value = "J'ai " & age & " ans !"
    MonVoisin.Characters(Start:=6, Length:=2).Font.ColorIndex = 3
End Sub

Comme tu te débrouilles bien en VBA je te laissés adapter ce code simple.

nelson mandela 2

@ RicDuL : quelles sont les nouvelles ? cela répond à ton problème ?

Bonjour Steelson,

Je n'ai pas encore eu le temps de d'étudier en détail la méthode que tu me proposes mais cela va me demander qques recherches puisque je ne connais ni la méthode "evaluate", ni la propriété "caller".

A la lecture de ton exemple, je comprends juste que la fonction appelle la "Sub" Voisin en placant le paramètre "Cel.Value" et que la Sub écrit dans la Range("MonVoisin").

Dès que j'ai effectué un peu plus de tests, je reviens t'informer des résultats.

Merci beaucoup pour ton aide.

A ton service si tu as besoin un coup de main...

Bsr Steelson,

...désolé, j'étais persuadé de t'avoir répondu.

Donc j'ai adapté la 2nde solution et je l'applique à 3 cellules simultanément. ça fonctionne très bien.

Merci à toi pour ton aide et au plaisir...

Rechercher des sujets similaires à "mise forme caracteres chaine concatenation"