Многострочный текст в Excel неправильно вставлен в Outlook HTML - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть пользовательская форма VBA с TextBox, которая принимает несколько строк с помощью Enter.После этого мой код скопирует вставленные данные из этого TextBox в ячейку Excel, где текст WordWrap (допускается несколько строк).В конце, используя код «Рон де Брюин» с RangetoHTML, форма Excel копируется в электронное письмо в формате HTML (https://www.rondebruin.nl/win/s1/outlook/bmail2.htm). Все ячейки Excel с одной строкой правильно копируются в электронное письмо в формате HTML, за исключением этого TextBox, потому что я заметил, чтоон содержит многострочный или WordWrap, а код CrLf добавляется в конце каждой строки (см. ниже).

TextBox value:

line1
line2

line3
line4


Excel Cell result where TextBox is copied:

line1
line2

line3
line4


Excel Cell copied into HTML email:

line1

        <===== Cr+Lf are automatically added
line2

        <===== Cr+Lf are automatically added
line3

        <===== Cr+Lf are automatically added
line4

        <===== Cr+Lf are automatically added

Как видно из вышеизложенного, когда ячейка Excel с WordWrap копируется в электронную почту HTML, Cr + Lfдобавил каждую строку. Как можно удалить ТОЛЬКО добавленный Cr + Lf, чтобы иметь исходный форматированный текст?

Я уже пытался использовать все различные опции из «Специальная вставка», присутствующие в Outlook, но всене работают. Единственное, что работает правильно, это Paste Special «Picture Enhanced Metafile», но после того, как мне нужно скопировать и вставить данные Excel, присутствующие в электронное письмо, и использование этой опции невозможно.

Не могли бы вы, пожалуйстапредложить какие-то другие хитрости?

Уже пробовал все опции "Специальная вставка" в Outlook, безцель.

Чтобы скопированная многострочная ячейка WordWrap скопировалась правильно в HTML-сообщение электронной почты, без добавления новых символов Cr + Lf в каждой строке.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

@ Сэмюэль, ниже кода, используемого для копирования данных из пользовательской формы TextBox «Description» в ячейку Excel «Desc_Main» и использования для создания электронного письма в формате HTML

ThisWorkbook.Names("desc_main").RefersToRange.Cells(1, 1).Value = description.Value

Sub Mail_Sheet_Outlook_Body()
On Error GoTo CodeError

    Dim OutApp As Object
    Dim OutMail As Object
    Dim data As Date
    Dim risultato As String
    Dim rng As Range
    Dim area As Range
    Set area = ThisWorkbook.Names("Print_Area").RefersToRange

    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With

    Set rng = Nothing
    Set rng = area

    Set OutApp = CreateObject("Outlook.Application")
    OutApp.Session.Logon
    Set OutMail = OutApp.CreateItem(0)

    data = Now()
    data = Format(data, "dd/mm/yyyy")

    On Error Resume Next
    With OutMail
    .to = ThisWorkbook.Names("address1").RefersToRange.Cells(1, 1).Value & "; " & ThisWorkbook.Names("address2").RefersToRange.Cells(1, 1).Value
    .CC = ThisWorkbook.Names("address3").RefersToRange.Cells(1, 1).Value & "; " & ThisWorkbook.Names("address4").RefersToRange.Cells(1, 1).Value & "; " & email_address.Value


' Subject Email creation

Dim campo1 As String

    .Subject = "New ticket request - " & service_type.Value

    .HTMLBody = "<font size=""2"" face=""Tahoma"">" _
                & "Hi, please raise the following ticket:" _
                & "<p>" _
                & RangetoHTML(rng) _
                & "<p>" _
                & "Best Regards" _
                & Chr(10)

    .Display

    End With
    On Error GoTo 0

    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With

    Set OutMail = Nothing
    Set OutApp = Nothing


CodeError:
If Err <> 0 Then
MsgBox "Error: (" & Err.Number & ") " & Err & Error(Err) & Err.description, vbCritical
End If

End Sub

Function RangetoHTML(rng As Range)

On Error GoTo CodeError

    Dim fso As Object
    Dim ts As Object
    Dim TempFile As String
    Dim TempWB As Workbook

    TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"

 'Copy the range and create a new workbook to past the data in
    rng.Copy
    Set TempWB = Workbooks.Add(1)
    With TempWB.Sheets(1)
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues, , False, False
        .Cells(1).PasteSpecial xlPasteFormats, , False, False
        .Cells(1).Select

        Application.CutCopyMode = False
        On Error Resume Next
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
        On Error GoTo 0
    End With


    'Publish the sheet to a htm file
    With TempWB.PublishObjects.Add( _
         SourceType:=xlSourceRange, _
         Filename:=TempFile, _
         Sheet:=TempWB.Sheets(1).Name, _
         Source:=TempWB.Sheets(1).UsedRange.Address, _
         HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With


    'Read all data from the htm file into RangetoHTML
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangetoHTML = ts.readall
    ts.Close
    RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")


    'Close TempWB
    TempWB.Close savechanges:=False

    'Delete the htm file we used in this function
    Kill TempFile

    Set ts = Nothing
    Set fso = Nothing
    Set TempWB = Nothing

CodeError:
If Err <> 0 Then
MsgBox "Error: (" & Err.Number & ") " & Err & Error(Err) & Err.description, vbCritical
End If


End Function
0 голосов
/ 04 апреля 2019

@ Сэмюэл, я могу поделиться кодом, но он очень длинный. VBA основан на UferForm, где клиент вставляет свои данные в простой oneline TextBox, вынужден использовать ListBox и, в конце, TexBox (многострочный), где он может добавить описание без ограничений символов. После этого данные ПРАВИЛЬНО копируются в Excel (потому что мне это нужно), и в случае, если клиент выберет, он напрямую ВСТАВЛЯЕТСЯ в электронную почту HTML Outlook и отправляет. Из Excel в электронную почту HTML я использовал метод RangetoHTML, используя код Рона де Брюина https://www.rondebruin.nl/win/s1/outlook/bmail2.htm Вы можете легко воспроизвести мою проблему, создав простую ячейку Excel с многострочными записями (Alt + Enter) и скопировать и вставить в электронную почту Outlook HTML. Все возвраты каретки (Alt + Enter) интерпретируются программой Outlook Paste как двойная каретка, поэтому первоначальное форматирование пропало. Другие специальные методы вставки бесполезны, потому что мне нужно скопировать и вставить данные из этой ячейки в электронное письмо.

Вот пример из электронной почты Excel в HTM при копировании и вставке многострочного текста:

Данные ввода, вставленные в пользовательскую форму

Данные, скопированные из пользовательской формы в Excel

Специальная вставка из Excel неправильно в электронную почту HTML

...