Вставити в лист 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. А значить і нам треба якимось чином конвертувати потрібні осередки в цей формат, та ще врахувати все форматування. Наприклад, є така таблиця:
Тепер цю таблицю треба вставити в лист разом з іншим текстом, щоб було щось на кшталт:
Щоб конвертувати потрібні комірки в самостійну таблицю в форматі 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 списку одержувачів.
Вирішив доповнити статтю простенької функцією, яка зберігає ніяких файл, форматованих таблиць і практично не робить зайвих рухів. Вона просто в лист вкладає значення всіх осередків зазначеного діапазону простим текстом, без форматування (хіба що додав переноси рядки і табуляцію, щоб дотримувався хоч якийсь табличний вигляд і текст не був однією єдиною рядком):