Microsoft 365 Mailing mise en forme HTML : revenir à la ligne automatique si trop de texte saisie

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 !

spike29

XLDnaute Occasionnel
Bonjour le forum,

J'utilise un formulaire permettant de générer un mailing. J'utilise dans le code VBA une mise en forme via HTML afin d'obtenir une mise en forme optimisée du mail.
En cellule G7 et H7 l'utilisateur saisit le contenu de sa demande ainsi qu'un éventuel commentaire.

Ma problématique est la suivante :
Lorsqu'un texte trop long est saisi en colonne G7 ou H7 il n'y a pas de retour à la ligne automatique dans le mail qui est généré. Cela donne alors une ligne à rallonge ce qui n'est pas très esthétique pour le lecteur.

Mon besoin :
Passé un certain nombre de caractère ou peut-être de mots (pour éviter de cutter un mot en plein milieu) j'aimerai qu'il y ai un retour à la ligne automatique.
Sur ce site très détaillé (https://laurent-ott.developpez.com/tutoriels/excel-mail-outlook/#LIII-B) traitant de l'utilisation de l'HTML dans du code VBA je n'ai pas trouvé de solution à mon problème.
Peut-être en utilisant la fonction "Mail_SautDeLigne", mais je ne vois pas comment faire.

Code utilisé :

VB:
Sub MAILING()

'Genere le mail de requête

    Dim OutlookApp As Object
    Dim OutlookMail As Object
    Dim Signature As String
    Dim CorpsDuMessage As String
    Dim Texte As String

    ' Créer une instance d'Outlook
    Set OutlookApp = CreateObject("Outlook.Application")
    Set OutlookMail = OutlookApp.CreateItem(0)

    ' Afficher l'e-mail pour récupérer la signature par défaut
    With OutlookMail
        .Display
        Signature = .HTMLBody
    End With
   

Sheets("TEST").Activate


Num = " TEST2025 N° " & Range("B7").Value
Emetteur = Range("E2").Value
Dest = Range("E3").Value

'LD Test
Destrequête = ""
    With Sheets("Données")
        For idest = 1 To .[B2].End(xlDown).Row
            Destrequête = Destrequête & .Cells(idest, "B").Value & ";"
        Next idest
    End With

  Set OutObj = CreateObject("Outlook.Application")
  Set Email = OutObj.CreateItem(0)
           
'****** Liste diffusion en destinataire ******
     
LD1 = Destrequête

LDcc = Destrequête

' ****** Construction du mail avec mise en forme HTML ******

  Set OutObj = CreateObject("Outlook.Application")
  Set Email = OutObj.CreateItem(0)
  ' Afficher l'objet mail pour avoir la signature
  Email.Display
  ' Mémoriser la signature qui s'affiche
  Signature = Email.HTMLBody
  Email.To = LD1
  Email.CC = LDcc
  ' Sujet de l'eMail
  Email.Subject = "#Requête" & " " & Num & " " & " De " & " " & Emeteur & " " & "Pour" & " " & Dest
  ' Corps de mon mail
  Email.HTMLBody = "Bonjour,<BR><BR>" _
 & "Vous trouverez ci-dessous une nouvelle requête :<BR><BR>" _
 & "Type de requête  : <b>" & Sheets("TEST").Range("C7").Value & " </b> <p>" _
 & "Périmètre  : <b>" & Sheets("TEST").Range("D7").Value & " </b> <p>" _
 & "Période concernée : <b>" & " " & "De S" & Sheets("TEST").Range("E7").Value & " " & "à S" & Sheets("TEST").Range("F7").Value & " </b> <p>" _
 & "Contenu de la requête  : <b>" & Sheets("TEST").Range("G7").Value & " </b> <p>" _
 & "<u> Commentaire(s) éventuel(s) : </u>  <b>" & Sheets("TEST").Range("H7").Value & " </b> <p>" _
 & "<u> Lien d'accès au fichier : </u>  <b>" & "<a href=" & " " & Sheets("Données").Range("A1").Value & " <ICI</a> " & " </b> <p>" _
 & "Cordialement," & Signature


  Email.Display
    ' Effacer les objets
  Set Email = Nothing
  Set OutObj = Nothing


Application.ScreenUpdating = True
Application.EnableEvents = True
 
MsgBox " Message correctement transmis", vbInformation

End Sub


En PJ vous trouverez un fichier avec mon formulaire et mon code actuellement utilisé.

Merci d'avance et bonne journée
 

Pièces jointes

Solution
Quand tu a généré ton script HTM tu l'as écrit au filing et tu n'as pas respecté le sens des balises.

Le HTML, hormis la BR/, dispose d'une balise<ouvrante> et d'une balise <\fermante> . Tu ne prendras jamais de risques en écrivant les deux balise l'une sous l'autre avant d'insérer le contenu qu'elle gère.

VB:
Email.HTMLBody = "Bonjour,<BR><BR>" _
    & "Vous trouverez ci-dessous une nouvelle requête :<BR><BR>" _
    & "<div style='width: 50%; word-wrap: break-word; white-space: normal; text-align: justify; text-justify: inter-word;'>" _
    & "Type de requête  : <P><b>" & Sheets("TEST").Range("C7").Value & "<\b></P>" _
    & "Périmètre  : <P><b>" & Sheets("TEST").Range("D7").Value & " </b> </p>" _
    & "Période concernée : <P><b>...
Bonjour,

Je n'ai pas testé
VB:
Sub MAILING()

'Genere le mail de requête

    Dim OutlookApp As Object
    Dim OutlookMail As Object
    Dim Signature As String
    Dim CorpsDuMessage As String
    Dim Texte As String

    ' Créer une instance d'Outlook
    Set OutlookApp = CreateObject("Outlook.Application")
    Set OutlookMail = OutlookApp.CreateItem(0)

    ' Afficher l'e-mail pour récupérer la signature par défaut
    With OutlookMail
        .Display
        Signature = .HTMLBody
    End With
 
    Sheets("TEST").Activate
    Num = " TEST2025 N° " & Range("B7").Value
    Emetteur = Range("E2").Value
    Dest = Range("E3").Value

    'LD Test
    Destrequête = ""
    With Sheets("Données")
        For idest = 1 To .[B2].End(xlDown).Row
            Destrequête = Destrequête & .Cells(idest, "B").Value & ";"
        Next idest
    End With

    Set OutObj = CreateObject("Outlook.Application")
    Set Email = OutObj.CreateItem(0)
          
    '****** Liste diffusion en destinataire ******
    
    LD1 = Destrequête
    LDcc = Destrequête

    ' ****** Construction du mail avec mise en forme HTML ******

    Set OutObj = CreateObject("Outlook.Application")
    Set Email = OutObj.CreateItem(0)
    ' Afficher l'objet mail pour avoir la signature
    Email.Display
    ' Mémoriser la signature qui s'affiche
    Signature = Email.HTMLBody
    Email.To = LD1
    Email.CC = LDcc
    ' Sujet de l'eMail
    Email.Subject = "#Requête" & " " & Num & " " & " De " & " " & Emetteur & " " & "Pour" & " " & Dest
    ' Corps de mon mail
    Email.HTMLBody = "Bonjour,<br><br>" _
    & "Vous trouverez ci-dessous une nouvelle requête :<br><br>" _
    & "Type de requête  : <b>" & Sheets("TEST").Range("C7").Value & " </b><br>" _
    & "Périmètre  : <b>" & Sheets("TEST").Range("D7").Value & " </b><br>" _
    & "Période concernée : <b>" & " " & "De S" & Sheets("TEST").Range("E7").Value & " " & "à S" & Sheets("TEST").Range("F7").Value & " </b><br>" _
    & "Contenu de la requête  : <b>" & Sheets("TEST").Range("G7").Value & " </b><br>" _
    & "<u> Commentaire(s) éventuel(s) : </u>  <b>" & Sheets("TEST").Range("H7").Value & " </b><br>" _
    & "<u> Lien d'accès au fichier : </u>  <b>" & "<a href=" & " " & Sheets("Données").Range("A1").Value & ">ICI</a></b><br>" _
    & "Cordialement," & Signature

    Email.Display
    ' Effacer les objets
    Set Email = Nothing
    Set OutObj = Nothing

    Application.ScreenUpdating = True
    Application.EnableEvents = True
 
    MsgBox " Message correctement transmis", vbInformation

End Sub
 
Bonjour,

Ma problématique est la suivante :
Lorsqu'un texte trop long est saisi en colonne G7 ou H7 il n'y a pas de retour à la ligne automatique dans le mail qui est généré. Cela donne alors une ligne à rallonge ce qui n'est pas très esthétique pour le lecteur.
Si tu veux découper ta ligne au bout d'un certain nombre de mots, il faut peut-être compter les espaces et ajouter un <br>.
Mais normalement c'est le principe même du html que de taper du texte au kilomètre et qu'il soit formaté lors de l'affichage en fonction des contraintes du moment.



En ce qui concerne le code que tu as posté, est-ce normal que tu aies plein de débuts de paragraphes (en fin de ligne) mais que tu n'aies aucune fin de paragraphe ?
 
Bonjour,
Code:
<p>Texte long qui va automatiquement passer à la ligne si nécessaire.</p>
 <P>Les Paragraphe gèrent les retours lignes automatique et c'est plus joli que les br</P>

Avec largeur en % de la fenêtre
Code:
<p style="width: 75%; word-wrap: break-word; white-space: normal;">
    Texte long qui s'adapte et revient à la ligne automatiquement si nécessaire.
</p>
Largeur fixe
Code:
<p style="width: 400px; word-wrap: break-word; white-space: normal;">
    Texte long qui s’adapte et revient à la ligne automatiquement si nécessaire.
</p>
 
Dernière édition:
Bonjour,


Si tu veux découper ta ligne au bout d'un certain nombre de mots, il faut peut-être compter les espaces et ajouter un <br>.
Mais normalement c'est le principe même du html que de taper du texte au kilomètre et qu'il soit formaté lors de l'affichage en fonction des contraintes du moment.



En ce qui concerne le code que tu as posté, est-ce normal que tu aies plein de débuts de paragraphes (en fin de ligne) mais que tu n'aies aucune fin de paragraphe ?
Bonjour,

Je suis parfaitement d'accord sur le principe du HTML, raison pour laquelle je l'introduit dans mon code VBA. Etant donné que la quantité de texte que l'utilisateur va saisir en G7 et H7 est variable, si je souhaite maintenir une mise en forme lisible du mail je dois pouvoir forcer des retours à la ligne.

Concernant les débuts de paragraphe en fin de ligne, non ça n'est pas normal ^^ Je suppose que je les ai laissé pour avoir des sauts de ligne entre chaque paragraphe; Certains codes que j'ai pu copier l'utilisaient et ça fonctionnait plutôt bien.
Cela n'est pas propre du tout j'en convient.
Je précise que je découvre totalement la partie HTML
 
Bonjour,
Code:
<p>Texte long qui va automatiquement passer à la ligne si nécessaire.</p>
 <P>Les Paragraphe gèrent les retours lignes automatique et c'est plus joli que les br</P>

Avec largeur en % de la fenêtre
Code:
<p style="width: 75%; word-wrap: break-word; white-space: normal;">
    Texte long qui s'adapte et revient à la ligne automatiquement si nécessaire.
</p>
Largeur fixe
Code:
<p style="width: 400px; word-wrap: break-word; white-space: normal;">
    Texte long qui s’adapte et revient à la ligne automatiquement si nécessaire.
</p>
Bonjour et merci de votre retour,

Débutant complet en html j'ai essayé d'intégrer vos réponses dans mon code. Cela donne ça (voir la dernière ligne) :

Cependant aucun changement par rapport à mon code actuel, le retour à la ligne automatique n'intervient qu'après 1 km de texte.

J'ai très certainement mal inséré votre code

Set OutObj = CreateObject("Outlook.Application")
Set Email = OutObj.CreateItem(0)
' Afficher l'objet mail pour avoir la signature
Email.Display
' Mémoriser la signature qui s'affiche
Signature = Email.HTMLBody
Email.To = LD1
Email.CC = LDcc
' Sujet de l'eMail
Email.Subject = "#Requête" & " " & Num & " " & " De " & " " & Emetteur & " " & "Pour" & " " & Dest
' Corps de mon mail
Email.HTMLBody = "Bonjour,<br><br>" _
& "Vous trouverez ci-dessous une nouvelle requête :<br><br>" _
& "Type de requête : <b>" & Sheets("TEST").Range("C7").Value & " </b><br>" _
& "Périmètre : <b>" & Sheets("TEST").Range("D7").Value & " </b><br>" _
& "Période concernée : <b>" & " " & "De S" & Sheets("TEST").Range("E7").Value & " " & "à S" & Sheets("TEST").Range("F7").Value & " </b><br>" _
& "Contenu de la requête : <p style=width: 400px word-wrap: break-word; white-space: normal;" > Sheets("TEST").Range("G7").Value & " </p>"
 
Bonjour,

Je n'ai pas testé
VB:
Sub MAILING()

'Genere le mail de requête

    Dim OutlookApp As Object
    Dim OutlookMail As Object
    Dim Signature As String
    Dim CorpsDuMessage As String
    Dim Texte As String

    ' Créer une instance d'Outlook
    Set OutlookApp = CreateObject("Outlook.Application")
    Set OutlookMail = OutlookApp.CreateItem(0)

    ' Afficher l'e-mail pour récupérer la signature par défaut
    With OutlookMail
        .Display
        Signature = .HTMLBody
    End With
 
    Sheets("TEST").Activate
    Num = " TEST2025 N° " & Range("B7").Value
    Emetteur = Range("E2").Value
    Dest = Range("E3").Value

    'LD Test
    Destrequête = ""
    With Sheets("Données")
        For idest = 1 To .[B2].End(xlDown).Row
            Destrequête = Destrequête & .Cells(idest, "B").Value & ";"
        Next idest
    End With

    Set OutObj = CreateObject("Outlook.Application")
    Set Email = OutObj.CreateItem(0)
         
    '****** Liste diffusion en destinataire ******
   
    LD1 = Destrequête
    LDcc = Destrequête

    ' ****** Construction du mail avec mise en forme HTML ******

    Set OutObj = CreateObject("Outlook.Application")
    Set Email = OutObj.CreateItem(0)
    ' Afficher l'objet mail pour avoir la signature
    Email.Display
    ' Mémoriser la signature qui s'affiche
    Signature = Email.HTMLBody
    Email.To = LD1
    Email.CC = LDcc
    ' Sujet de l'eMail
    Email.Subject = "#Requête" & " " & Num & " " & " De " & " " & Emetteur & " " & "Pour" & " " & Dest
    ' Corps de mon mail
    Email.HTMLBody = "Bonjour,<br><br>" _
    & "Vous trouverez ci-dessous une nouvelle requête :<br><br>" _
    & "Type de requête  : <b>" & Sheets("TEST").Range("C7").Value & " </b><br>" _
    & "Périmètre  : <b>" & Sheets("TEST").Range("D7").Value & " </b><br>" _
    & "Période concernée : <b>" & " " & "De S" & Sheets("TEST").Range("E7").Value & " " & "à S" & Sheets("TEST").Range("F7").Value & " </b><br>" _
    & "Contenu de la requête  : <b>" & Sheets("TEST").Range("G7").Value & " </b><br>" _
    & "<u> Commentaire(s) éventuel(s) : </u>  <b>" & Sheets("TEST").Range("H7").Value & " </b><br>" _
    & "<u> Lien d'accès au fichier : </u>  <b>" & "<a href=" & " " & Sheets("Données").Range("A1").Value & ">ICI</a></b><br>" _
    & "Cordialement," & Signature

    Email.Display
    ' Effacer les objets
    Set Email = Nothing
    Set OutObj = Nothing

    Application.ScreenUpdating = True
    Application.EnableEvents = True
 
    MsgBox " Message correctement transmis", vbInformation

End Sub
Merci pour votre retour. Pas de changement par rapport à mon code initial. Le retour à la ligne automatique se fait au même endroit et après une important quantité de mots.
Quantité que j'aimerai réduire.
 
Le texte peut potentiellement être sur plusieurs lignes au sein de la cellule G7 en fonction des besoins de l'utilisateur (saisie libre dans la cellule G7).
Ca n'a aucune incidence. 😉
Ca a une incidence : il faut remplacer les CHR(10) par des "<br>", voire encadrer les morceaux de textes par "<p>" et "</p>"...
VB:
Contenu = Replace(Sheets("TEST").Range("G7").Value, Chr(10), "<br>")
Commentaire = Replace(Sheets("TEST").Range("H7").Value, Chr(10), "<br>")



Pardon mais, comme dit plus haut le HTML étant justement prévu pour adapter l'affichage des textes en fonction des contraintes au moment de l'affichage, je n'ai toujours pas compris à quel moment c'est gênant d'avoir des paragraphes longs.
Peux-tu m'en dire plus à ce sujet, s'il te plait ?
 

Pièces jointes

Dernière édition:
HTML:
<div style="width: 15%; word-wrap: break-word; white-space: normal; text-align: justify; text-justify: inter-word;">
<P>
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
</P>
<P>
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
</P>
</div>
 
Ca n'a aucune incidence. 😉
Ca a une incidence : il faut remplacer les CHR(10) par des "<br>", voire encadrer les morceaux de textes par "<p>" et "</p>"...
VB:
Contenu = Replace(Sheets("TEST").Range("G7").Value, Chr(10), "<br>")
Commentaire = Replace(Sheets("TEST").Range("H7").Value, Chr(10), "<br>")



Pardon mais, comme dit plus haut le HTML étant justement prévu pour adapter l'affichage des textes en fonction des contraintes au moment de l'affichage, je n'ai toujours pas compris à quel moment c'est gênant d'avoir des paragraphes longs.
Peux-tu m'en dire plus à ce sujet, s'il te plait ?
Merci pour le retour. J'ai changé mon code initial pour le suivant (voir ci-dessous). Plus propre à mon goût. J'y utilise comme pour le premier les balises <p>.
Comme vous l'avez tous affirmé, effectivement l'affichage du texte dans le mail s'adapte automatiquement en fonction des contraintes d'affichage du moment et c'est également le cas avec mon premier code.
Il n'y a rien de bloquant a avoir des paragraphes longs à partir du moment ou il l'affichage se met à jour automatiquement ce qui est bien le cas chez moi.
Mon besoin qui est le même depuis le début est de savoir s'il existe une méthode permettant de forcer le retour à la ligne en fonction d'un critère (nombre de mot, format etc....).

On parle là purement et simplement d'esthétique. Je ne souhaite pas avoir des paragraphes trop longs (selon moi bien entendu).
Je tente d'intégrer le code de dysorthographie au mien mais malheureusement sans succès pour le moment.


VB:
  Texte = Texte & "<p>Bonjour,</p>"
    Texte = Texte & "Vous trouverez ci-dessous une nouvelle requête : <p>"
    Texte = Texte & "Périmètre  : <b>" & Sheets("TEST").Range("D7").Value & " </b> <p>"
    Texte = Texte & "Période concernée : <b>" & " " & "De S" & Sheets("TEST").Range("E7").Value & " " & "à S" & Sheets("TEST").Range("F7").Value & " </b> <p>"
    Texte = Texte & "Contenu de la requête  : <b>" & Sheets("TEST").Range("G7").Value & " </b> <p>"
    Texte = Texte & "<u> Commentaire(s) éventuel(s) : </u>  <b>" & Sheets("TEST").Range("H7").Value & " </b> <p>"
    Texte = Texte & "<u> Lien d'accès au fichier de pilotage : </u>  <b>" & "<a href=" & " " & Sheets("Données").Range("A1").Value & " <ICI</a> " & " </b> <p>"
    Texte = Texte & "Cordialement"
   
    ' Ajouter le corps du message et la signature
    With OutlookMail
        .To = LD1
        .CC = LDcc
        .Subject = "#Requête" & " " & Num & " " & " De " & " " & Emeteur & " " & "Pour" & " " & dest
        .HTMLBody = Texte & Signature
        .Display
    End With
 
Merci pour le retour. J'ai changé mon code initial pour le suivant (voir ci-dessous). Plus propre à mon goût. J'y utilise comme pour le premier les balises <p>.
OK, donc tu n'as pas utilisé ma proposition. Probablement était-elle en fait inutile dans ton cas. Désolé.
Il me semble que tu as toujours ces ouvertures de paragraphes sans aucune fermeture. Du coup, je ne suis pas certain que ce soit "plus propre". 😉



Mon besoin qui est le même depuis le début est de savoir s'il existe une méthode permettant de forcer le retour à la ligne en fonction d'un critère (nombre de mot, format etc....).
Dans ce cas, ma réponse reste la même. 😉
 
Dernière édition:
HTML:
<div style="width: 15%; word-wrap: break-word; white-space: normal; text-align: justify; text-justify: inter-word;">
<P>
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
</P>
<P>
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
</P>
</div>
Merci pour le code.

Malheureusement je n'arrive pas à l'intégrer au mien. J'ai un un message bloquant "erreur de compilation attendu fin d'instruction sur le "width".

Voir le code ci-dessous.

Code:
    Texte = Texte & "<p>Bonjour,</p>"
    Texte = Texte & "Vous trouverez ci-dessous une nouvelle requête : <p>"
    Texte = Texte & "Périmètre  : <b>" & Sheets("TEST").Range("D7").Value & " </b> <p>"
    Texte = Texte & "Période concernée : <b>" & " " & "De S" & Sheets("TEST").Range("E7").Value & " " & "à S" & Sheets("TEST").Range("F7").Value & " </b> <p>"
    Texte = Texte & "<div style="width: 15%; word-wrap: break-word; white-space: normal; text-align: justify; text-justify: inter-word;"<
    Texte = Texte & "Contenu de la requête  : <b>" & Sheets("TEST").Range("G7").Value & " </b> <p>"
    Texte = Texte & "<u> Commentaire(s) éventuel(s) : </u>  <b>" & Sheets("TEST").Range("H7").Value & " </b> <p>"
    Texte = Texte & "<u> Lien d'accès au fichier de pilotage : </u>  <b>" & "<a href=" & " " & Sheets("Données").Range("A1").Value & " <ICI</a> " & " </b> <p>"
    Texte = Texte & "Cordialement"

Pourriez vous m'indiquer comment l'intégrer ? Merci d'avance.
 
- 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
Retour