Вставити в лист outlook таблицю excel з форматуванням, excel для всіх

Про створення листів в Outlook через Visual Basic for Applications (VBA) Excel я вже писав пару статей, в тому числі і про те, як вставити одну зі стандартних підписів в лист - Вставити в лист підпис з Outlook через VBA (за замовчуванням при створенні листів з VBA підпис не вставляється, навіть якщо це налаштоване параметрами пошти). Але тому що відправка відбувається з Excel, то часто виникає й інше питання - як в лист вставити не просто текст, а цілу таблицю? Та ще з усім форматуванням осередків? Якщо мова про ручної вставці, то тут все просто: скопіювали діапазон, перейшли в лист - вставили. Але якщо спробувати те ж саме кодом (через копіювати-вставити) - нічого не вийде (у Outlook просто немає методу Paste або щось на зразок того). Можна використовувати метод SendKeys, але він дуже нестабільний і я намагаюся його взагалі ніде не застосовувати, тільки в випадках, коли по-іншому ну взагалі ніяк. Якщо ж переносити таблицю кодом на кшталт такого:
.Body = Range ( "A1"). Value Range ( "A2"). Value
то це будуть тільки значення осередків, але не їх форматування і аж ніяк не таблиця.
Вся справа в тому, що таблиця в тілі листа це окремий об'єкт формату HTML. І при вставці через копіювати-вставити руками Excel і Outlook роблять за нас всю брудну роботу по перекодуванні скопійованого в потрібний формат HTML. А значить і нам треба якимось чином конвертувати потрібні осередки в цей формат, та ще врахувати все форматування. Наприклад, є така таблиця:

Вставити в лист outlook таблицю excel з форматуванням, excel для всіх


Тепер цю таблицю треба вставити в лист разом з іншим текстом, щоб було щось на кшталт:

Вставити в лист outlook таблицю excel з форматуванням, excel для всіх


Щоб конвертувати потрібні комірки в самостійну таблицю в форматі HTML я використовую таку функцію:

Function ConvertRngToHTM (rng As Range)

Dim fso As Object. ts As Object

Dim sF As String. resHTM As String

Dim wbTmp As Workbook

sF = Environ ( "temp") "/" Format (Now. "Dd-mm-yy h-mm-ss") ".htm"

'Переносимо вказаний діапазон в нову книгу

Set wbTmp = Workbooks. Add (1)

With wbTmp. Sheets (1)

'Вставляємо тільки ширину стовпців, значення і формати

Cells (1). PasteSpecial xlPasteColumnWidths

Cells (1). PasteSpecial xlPasteValues

Cells (1). PasteSpecial xlPasteFormats

Cells (1). Select

'Видаляємо всі об'єкти (фігури, малюнки та ін.)

'Якщо малюнки і об'єкти потрібні - видалити цей блок

On Error Resume Next

DrawingObjects. Visible = True

On Error GoTo 0

'Зберігаємо книгу як Веб-сторінку (щоб вміст конвертувати в HTML-код)

With wbTmp. PublishObjects. Add (_

SourceType. = XlSourceRange. Filename. = SF. _

Sheet. = WbTmp. Sheets (1). Name. Source. = WbTmp. Sheets (1). UsedRange. Address. _

'Відкриваємо створений файл як текстовий і зчитуємо вміст

Set fso = CreateObject ( "Scripting.FileSystemObject")

Set ts = fso. GetFile (sF). OpenAsTextStream (1. - 2)

resHTM = ts. ReadAll

'Вирівнюємо таблицю по лівому краю (якщо треба залишити по центру - видалити цей рядок)

ConvertRngToHTM = Replace (resHTM. "Align = center x: publishsource =". "Align = left x: publishsource =")

'Закриваємо тимчасову книгу і видаляємо

wbTmp. Close False

'Очищаємо об'єктні змінні


Його можна змінити на будь-який необхідний.
Що важливо пам'ятати: якщо крім вставки таблиці Ви плануєте форматувати лист іншими тегами HTML, то краще спочатку зробити все форматування і тільки в самому кінці, найостаннішим кроком, додавати таблицю в лист. Інакше розмітка таблиці може "попливти".

Сподіваюся тепер Вам не важко буде зробити свої повідомлення більш красивими і акуратними.

Розумію, що багато хто захоче зробити з цього масову розсилку. Для цього доведеться поєднати код з цієї статті з кодом зі статті Як відправити лист з Excel ?. Там є приклад відправки листів через Outlook списку одержувачів.

Вирішив доповнити статтю простенької функцією, яка зберігає ніяких файл, форматованих таблиць і практично не робить зайвих рухів. Вона просто в лист вкладає значення всіх осередків зазначеного діапазону простим текстом, без форматування (хіба що додав переноси рядки і табуляцію, щоб дотримувався хоч якийсь табличний вигляд і текст не був однією єдиною рядком):

Схожі статті