Страницы: 1
RSS
Из excel скопировать в word файле таблицу и вставить в текст письма в outlook
 
Уважаемые форумчане!

Пожалуйста, помогите закончить процедуру.
Имеется 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
Изменено: ac1-caesar - 06.01.2016 13:00:03
 
Кросс - http://www.programmersforum.ru/showthread.php?t=287925
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Вроде бы задача не сложная, но пока результатов нет.
 
Доброе время суток
Да не проблема
Код
.Body = sBody & oTable.Range.Text

Успехов.
 
Не, не работает. Вообще ничего не вставляет.
 
Цитата
ac1-caesar написал: Вообще ничего не вставляет.
И вы можете это доказать, приложив соответствующие файлы? У меня добавляет текст содержимого таблицы в конец тела письма.
 
Код
Set oTable = WDSaved.Tables(1)
     
sBody = "" & oTable.Range
но не сохраняет форматирование
Изменено: jfd - 06.01.2016 15:06:20
 
Цитата
jfd написал: но не сохраняет форматирование
Коллега, как бы MailItem.Body и предполагает только текст, как в Блокноте. Если нужно форматирование, то MailItem.HTMLBody.
Для выделенного блока можно получить html-код форматирования через Document.MailEnvelope.Item.HTMLBody
 
Андрей VG, да, такая мысль у меня возникала. а если письмо создается из шаблона, который html?
 
Цитата
jfd написал: но не сохраняет форматирование
Да этот вариант уже опробован, но к сожалению нужно вставить таблицу как есть.
Если ручками открыть ворд файл и скопировать таблицу, а затем вставить ее в письмо outlook, то прекрасно получается.
Вот и ломаю голову как это сделать кодом.
 
Цитата
Андрей VG написал:
Для выделенного блока можно получить html-код форматирования через Document.MailEnvelope.Item.HTMLBody
Как можно реализовать на моем примере?
 
Цитата
jfd написал: а если письмо создается из шаблона, который html?
В этом случае Outlook ведёт себя вполне лояльно, позволяя соединять разные фрагменты html-кода или даже html-коды страниц, посредством (применительно к варианту ac1-caesar)
Код
MailItem.HTMLBody = MailItem.HTMLBody & Document.MailEnvelope.Item.HTMLBody

Можно, конечно, подобным маневром модифицировать и Document.MailEnvelope.Item.HTMLBody, ругаться код не будет, только и изменений не будет.  ;)
Цитата
ac1-caesar написал: Как можно реализовать на моем примере?
Думаю, примера, вам хватит, чтобы разобраться. Найти же как выделить таблицу вам поможет Object Browser и справка по объектной модели Word.
Успехов.
Изменено: Андрей VG - 06.01.2016 15:25:42 (Пропустил вопрос)
 
Андрей VG, пробую вставить
Код
.HTMLBody = sBody & oTable.Range & .HTMLBody

не помогает
 
Андрей VG,а гляньте плиз
копировал только таблицу (по идее)
Код
WDSaved.Tables(1).Select
        WA.Selection.Copy
вставлял вроде тоже только скопированное
Код
.HTMLBody = WA.Documents.Item(1).MailEnvelope.Item.HTMLBody
или
.HTMLBody = WA.Selection.Document.MailEnvelope.Item.HTMLBody

а вставился весь документ и текст и таблица

где не так?
Изменено: jfd - 06.01.2016 16:35:02
 
У меня почему то этот вариант не работает, т.е. не вставляется ни текст, ни таблица.
 
Доброе время суток.
Цитата
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 - 07.01.2016 09:18:27
 
Андрей 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
Страницы: 1
Наверх