Вставьте диапазон Excel в текст электронной почты Outlook без структуры столбцов - PullRequest
1 голос
/ 17 марта 2020

Я хочу скопировать диапазон Excel в тело электронного письма Outlook.

Проблема заключается в том, что при наличии кода в теле письма Outlook сохраняется структура столбцов диапазона Excel, и я просто хочу текст (жирным шрифтом и курсивом c, как в файле Excel).

Мне просто нужен простой текст в теле письма Outlook.

Sub excelrange()

Dim rng As Range
Dim OutApp As Object
Dim OutMail As Object

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

With Sheets(Range("D3").Value)
    Set rng = Sheets("Gibraltar").Range("a16:d47")
End With

On Error Resume Next
With OutMail
    .To = ActiveSheet.Range("b13")
    .CC = ActiveSheet.Range("b14")
    .BCC = ""
    .Subject = ActiveSheet.Range("b11")
    .HTMLBody = RangetoHTML(rng)
    .Display
End With
On Error GoTo 0

Set OutMail = Nothing
Set OutApp = Nothing
End Sub


Function RangetoHTML(rng As Range)
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
End Function here

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Это скорее несколько идей, чем ответ, но он может помочь вам решить, что вы хотите.

Если вы хотите форматировать, например, жирный или итальянский c, тело письма должно быть Html. У вас может быть файл, содержащий что-то вроде:

<p>Dear %receiver%,<br>Good day.</p>    
<p>Please find following other request details:</p> 
<p>Name: %name%<br>I: <b>%id%</b><br>Flag: %flag%</p>
<p>Ammmmm: %xxx% %yyyyy%<br>Collection Date: <i>%colldate%</i></p> 

Это допустимо, если не полностью, Html. Если вы не знаете, Html:

  • - это абзац

  • - это разрыв строки
  • выделен жирным шрифтом
  • is itali c

Строки, такие как «% receive%» и «% colldate%» будут заменены во время выполнения со значениями из соответствующей ячейки диапазона. Вам потребуется другой файл, чтобы указать замену. Примерно так:

receiver   C15   
name       A4     
id         B3     
flag       B4
colldate   B6      m/dd/yyyy

Первый столбец - это строка кода (без знаков процента), которая появляется в шаблоне. Второй столбец - это ячейка в диапазоне, содержащая значение для замены кода. Если вы хотите, чтобы выходные числа и даты были отформатированы, у вас может быть третий столбец, определяющий формат чисел.

При вышеупомянутом подходе ваш VBA должен будет прочитать два файла, а затем l oop вниз Перечислите во втором файле замену строк значениями ячеек.

Поскольку вы используете Excel, эти два файла могут быть рабочими листами. Второй файл уже является таблицей, поэтому легко отображается в Excel. Первый файл должен быть преобразован в лист, например:

Row  Column A
  1  Dear %receiver%,
     Good day.  
  2  Please find following other request details:   
  3  Name: %name%
     I: <b>%id%</b>
     Flag: %flag%
  4  Ammmmm: %xxx% %yyyyy%
     Collection Date: <i>%colldate%</i> 

Я оставил жирный шрифт и выделил c в виде тегов Html на этом листе. Вы можете использовать форматирование Excel, но тогда вашему коду придется искать жирный и италийский символы c в каждой ячейке и генерировать необходимые Html. Это замедлит вашу рутину и будет более продвинутым и намного более хитрым VBA, который в противном случае был бы необходим. Я могу объяснить, что будет, если вы хотите знать.

Вам также необходимо заменить vbLF в ячейках на «
» и окружить значение «

» и «

”.

За одним объяснением, которое я объяснил, VBA добиться такого преобразования было бы довольно просто. Я ожидаю, что любой онлайн-учебник по Excel-VBA охватит необходимые утверждения.

0 голосов
/ 18 марта 2020

Просто удалите следующую строку из кода / функции Rangeto HTML (rng As Range)

.Cells(1).PasteSpecial xlPasteFormats, , False, False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...