Пожалуйста, помогите закончить процедуру. Имеется word файл в котором существует таблица. Файл открываю, определяю таблицу, но не получается вставить таблицу ворд файла в текст письма.
Код
Sub Макрос1()
Dim objShell As Object
Dim objOutlookApp As Object, objMail As Object
Dim sTo As String, sCopy As String, sSubject As String, sBody As String
Dim WA As Word.Application, WDSaved As Word.Document, oTable As Word.Table
On Error Resume Next
Set objOutlookApp = CreateObject("Outlook.Application")
objOutlookApp.Session.Logon
Set objMail = objOutlookApp.CreateItem(0) 'создаем новое сообщение
'если не получилось создать приложение или экземпляр сообщения - выходим
If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
sTo = "" 'Кому
sCopy = "" 'Кому в копии
sSubject = "" ' Тема
sBody = "" 'Текст письма
sAttachment1 = "" 'Вложение(полный путь к файлу)
Set WA = New Word.Application
Set WDSaved = WA.Documents.Open("путь к ворд файлу")
Set oTable = WDSaved.Tables(1)
'создаем сообщение
With objMail
.To = sTo 'адрес получателя
.cc = sCopy 'адрес получателя в копии
.Subject = sSubject 'тема сообщения
.Body = sBody & ... вставить таблицу oTable 'текст сообщения
.Attachments.Add sAttachment1
.Display 'если необходимо просмотреть сообщение, а не отправлять без просмотра
'.Send 'отправлять без просмотра
End With
exit_:
Set objOutlookApp = Nothing: Set objMail = Nothing
WDSaved.Close False
WA.Quit
Set WA = Nothing
End Sub
Коллега, как бы MailItem.Body и предполагает только текст, как в Блокноте. Если нужно форматирование, то MailItem.HTMLBody. Для выделенного блока можно получить html-код форматирования через Document.MailEnvelope.Item.HTMLBody
Да этот вариант уже опробован, но к сожалению нужно вставить таблицу как есть. Если ручками открыть ворд файл и скопировать таблицу, а затем вставить ее в письмо outlook, то прекрасно получается. Вот и ломаю голову как это сделать кодом.
jfd написал: а если письмо создается из шаблона, который html?
В этом случае Outlook ведёт себя вполне лояльно, позволяя соединять разные фрагменты html-кода или даже html-коды страниц, посредством (применительно к варианту ac1-caesar)
jfd написал: а вставился весь документ и текст и таблица
Получается, что я ошибался (проверить смогу только в понедельник), что Document.MailEnvelope ведёт себя подобно Worksheet.MailEnvelope относительно выделения. Тогда есть следующие пути 1. Формировать html-код таблицы "ручками" 2. Получить html-код скопированной в буфер обмена таблицы через WinAPI. 3. Удалить всё в документе, не являющееся требуемой таблицей, получить html-код через Document.MailEnvelope и закрыть документ без сохранения. Вариант на этот случай, оставляет в заданном документе только таблицу по её индексу.
Код
Public Sub LeaveOneTableOnly(ByVal inDoc As Document, ByVal TableId As Long)
Dim oTable As Table, startId As Long, endId As Long
Dim delRange As Range, endId As Long
Set oTable = inDoc.Tables(TableId)
endId = oTable.Range.Start
inDoc.Range(0, endId).Delete
startId = oTable.Range.End
endId = inDoc.Range.End
inDoc.Range(startId, endId).Delete
End Sub
Цитата
ac1-caesar написал: У меня почему то этот вариант не работает, т.е. не вставляется ни текст, ни таблица.
Повторюсь, без примера ваших файлов с кодом - помощь видится затруднительной.
Андрей VG, спасибо и Вас с Рождеством Христовым! Нашел решение с помощью WordEditor, как ни странно, на youtube. Если кому интересно. Вставляет таблицу и с word файла, и excel таблицы. Необходимо подключить библиотеки word и outlook.
Код
Sub test()
Dim olApp As Outlook.Application
Dim olEmail As Outlook.MailItem
Dim olInsp As Outlook.Inspector
Dim WA As Word.Application
Dim wdDoc As Word.Document, WDSaved As Word.Document
Dim oTable As Word.Table
Dim TextMessage As String
TextMessage = "Dear Someone" & vbNewLine & " " & vbNewLine & "Please ..." 'текст сообщения
Set olApp = New Outlook.Application
Set olEmail = olApp.CreateItem(olMailItem)
Set WA = New Word.Application
With olEmail
.BodyFormat = olFormatHTML
.Display
.To = "someone@somewhere.com" 'кому
.Subject = "Test" ' тема
Set olInsp = .GetInspector
Set wdDoc = olInsp.WordEditor
wdDoc.Range.InsertBefore TextMessage ' вставить текст
Set WDSaved = WA.Documents.Open("C:\Users\ac1ma\Desktop\ITEM.docx") 'открыть word файл
Set oTable = WDSaved.Tables(1) 'выбрать таблицу
oTable.Range.Copy 'скопировать таблицу
wdDoc.Range(Len(TextMessage), Len(TextMessage)).Paste 'вставить таблицу после текста
WDSaved.Close False
WA.Quit
Set WA = Nothing
End With
End Sub