2016-06-16 4 views
0

Я никогда не использовал VBA для mailmerge до и недавно унаследовал документ, созданный несколько лет назад. Мои две проблемы: 1. Как я могу отправить электронное письмо в формате HTML? Попробовали wdMailFormatHTML, но он не работает. 2. Источник данных находится в файле excel с заголовками. Заголовок таблицы не соответствует приведенному ниже тексту. Я хочу, чтобы заголовок настраивал ширину, чтобы соответствовать данным ниже. Попробовали множество способов исправить выравнивание внутри документа, но безрезультатно. Также попытался добавить ширину столбца в код, но я, вероятно, ошибаюсь, поскольку ничего не работает.Mailmerge MailFormat and alinnment issues

Ниже приведен оригинальный код. Был бы признателен, если бы кто-то мог помочь.

Sub RunMerge() 
Application.ScreenUpdating = False 
Dim Doc1 As Document, Doc2 As Document, Doc3 As Document, StrDoc As String 
Set Doc1 = ThisDocument 
StrDoc = ThisDocument.Path & "\EmailDataSource.doc" 
If Dir(StrDoc) <> "" Then Kill StrDoc 
With Doc1.MailMerge 
    If .State = wdMainAndDataSource Then 
    .Destination = wdSendToNewDocument 
    .Execute 
    Set Doc2 = ActiveDocument 
    End If 
End With 
Call EmailMergeTableMaker(Doc2) 
With Doc2 
    .SaveAs FileName:=StrDoc, AddToRecentFiles:=False, FileFormat:=wdFormatDocument 
    StrDoc = .FullName 
    .Close 
End With 
Set Doc2 = Nothing 
Set Doc3 = Documents.Open(FileName:=Doc1.Path & "\Email Merge Main Document.doc", _ 
    AddToRecentFiles:=False) 
With Doc3.MailMerge 
    .MainDocumentType = wdEMail 
    .OpenDataSource Name:=StrDoc, ConfirmConversions:=False, ReadOnly:=False, _ 
LinkToSource:=True, AddToRecentFiles:=False, Connection:="", SQLStatement:="", _ 
SQLStatement1:="", SubType:=wdMergeSubTypeOther 
    If .State = wdMainAndDataSource Then 
    .Destination = wdSendToEmail 
    .MailAddressFieldName = "Recipient" 
    .MailSubject = "TrackView follow-up - Missing timesheets/approvals" 
.MailFormat = wdMailFormatPlainText 
.Execute 
    End If 
End With 
Doc3.Close SaveChanges:=False 
Set Doc3 = Nothing 
Application.ScreenUpdating = True 
End Sub 
Sub EmailMergeTableMaker(DocName As Document) 
Dim oTbl As Table, i As Integer, j As Integer, oRow As Row, oRng As Range, strTxt As String 
With DocName 
    .Paragraphs(1).Range.Delete 
    Call TableJoiner 
    For Each oTbl In .Tables 
    j = 2 
    With oTbl 
     i = .Columns.Count - j 
     For Each oRow In .Rows 
     Set oRng = oRow.Cells(j).Range 
     With oRng 
      .MoveEnd Unit:=wdCell, Count:=i 
      .Cells.Merge 
      strTxt = Replace(.Text, vbCr, vbTab) 
      On Error Resume Next 
      If Len(strTxt) > 1 Then .Text = Left(strTxt, Len(strTxt) - 2) 
     End With 
     Next 
    End With 
    Next 
    For Each oTbl In .Tables 
    For i = 1 To j 
     oTbl.Columns(i).Cells.Merge 
    Next 
    Next 
    With .Tables(1) 
    .Rows.Add BeforeRow:=.Rows(1) 
    .Cell(1, 1).Range.Text = "Recipient" 
    .Cell(1, 2).Range.Text = "Data" 
    End With 
    .Paragraphs(1).Range.Delete 
    Call TableJoiner 
    End With 
    Set oRng = Nothing 
    End Sub 
    Private Sub TableJoiner() 
Dim oTbl As Table 
For Each oTbl In ActiveDocument.Tables 
    With oTbl.Range.Next 
    If .Information(wdWithInTable) = False Then .Delete 
    End With 
Next 
End Sub 

ответ

0

Используйте свойство HTMLBody из MailItem

Dim OutMail As Object 
Set OutMail = OutApp.CreateItem(0) 
On Error Resume Next 
With OutMail 
    .Attachments.Add 
    .body = "" 
    .CC = "" 
    .HTMLBody = "" 
    .subject = "" 
    .to = emailTo 
    .Send 
End With 
On Error GoTo 0 
Set OutMail = Nothing 
+0

Благодарим вас за вход Thomas. Я попробую это. – Siew

0

Есть по крайней мере две проблемы здесь.

Первый заключается в том, что параметр wdMailFormatHTML будет работать только с полной версией Outlook, а не с Outlook Express и т. Д. И т. Д., Т. Е. Outlook должен быть почтовым клиентом по умолчанию в соответствующей системе, чтобы это работало. (Другие почтовые клиенты, очевидно, «делают» HTML-письма - это просто, что никто из них, как известно, не работает с механизмом, который Word использует для отправки HTML-писем).

Предполагая, что вы являются с помощью Outlook, вторая проблема заключается в том, что процесс слияния электронной почты только по электронной почте текст, который был помещен в колонку данных в EmailDataSource.doc, который является источником данных для слияния с Эл. адрес. Способ, которым в настоящее время работает процедура EmailMergeTableMaker, эти данные будут блоком текста, разделенным табуляцией. Word, вероятно, расширит вкладки в какое-то пустое пространство, но не будет генерировать HTML-таблицу. Таким образом, это , вероятно, происхождение проблемы выравнивания. Если это так, вам нужно убедиться, что каждая ячейка содержит таблицу.

Возможно, было бы лучше сделать это, переосмыслив, как работает EmailMergeTableMaker. Следующие «быстрые исправления» работали над некоторыми примерами данных здесь, но я не тестировал ситуации, когда, например, ячейка пуста.

После этого кода ...

With .Tables(1) 
    .Rows.Add BeforeRow:=.Rows(1) 
    .Cell(1, 1).Range.Text = "Recipient" 
    .Cell(1, 2).Range.Text = "Data" 
    End With 
    .Paragraphs(1).Range.Delete 
    Call TableJoiner 

... вставить следующее:

' you should really move this Dim statement to the top 
    ' of the Sub and merge it with the existing Dim 
    Dim oCellRng as Range 
    With .Tables(1) 
    For i = 2 To .Rows.Count 
     Set oCellRng = .Cell(i, 2).Range 
     oCellRng.MoveEnd wdCharacter, -1 
     oCellRng.ConvertToTable vbTab 
     Set oCellRng = Nothing 
    Next 
    End With 

Если вы не с помощью программы Outlook, то вы не сможете использовать MailMerge напрямую, чтобы создать сообщение в формате HTML, и вы, очевидно, не сможете использовать объектную модель Outlook для этого, поэтому я думаю, что вам следует подумать с точки зрения создания электронных писем в формате HTML и отправки им некоторых другим способом (например, напрямую через SMTP), но это совсем другая история.

Другой способ отправки электронной почты через Outlook - автоматизировать Outlook, как предлагает Томас Инзина. Однако это также потребует от вас внесения других изменений в способ работы слияния.

FWIW подпрограммы, которые вы используете, исходят от tutotial от «macropod». У меня нет ссылки на нее, но поиск «Макроподка Catalog MailMerge Tutorial» может привести вас к этому и другим путям решения этой проблемы тип проблемы.

+0

Спасибо, Бибадия! У нас есть Outlook, поэтому обязательно используйте ваше предложение. – Siew

 Смежные вопросы

  • Нет связанных вопросов^_^