2016-06-16 10 views
0

Ich habe noch nie VBA für Mailmerge verwendet und vor kurzem einen vor einigen Jahren erstellten Dokument geerbt. Meine zwei Ausgaben sind: 1. Wie bekomme ich die E-Mail als HTML gesendet werden? Habe versucht, wdMailFormatHTML, aber es funktioniert nicht. 2. Die Datenquelle befindet sich in einer Excel-Datei mit Kopfzeilen. Die Überschrift "Tabelle" stimmt nicht mit dem folgenden Text überein. Ich möchte, dass die Kopfzeile die Breite so anpasst, dass sie mit den darunter liegenden Daten übereinstimmt. Habe versucht, die Ausrichtung innerhalb des Dokuments auf verschiedene Arten zu beheben, aber ohne Erfolg. Ich habe auch versucht, Spaltenbreite zum Code hinzuzufügen, aber ich mache es wahrscheinlich falsch, da nichts zu funktionieren scheint.Mailmerge MailFormat und Alignment Ausgaben

Unten ist der Original-Code. Würde mich freuen, wenn jemand helfen könnte.

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 

Antwort

0

Verwenden Sie die Htmlbody-Eigenschaft des 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

Vielen Dank für den Eingang Thomas. Ich werde das versuchen. – Siew

0

Hier gibt es mindestens zwei mögliche Probleme sind.

Einer davon ist, dass der Parameter wdMailFormatHTML nur mit der Vollversion von Outlook funktioniert, nicht mit Outlook Express usw., d. H. Outlook muss der Standard-E-Mail-Client auf dem entsprechenden System sein, damit dies funktioniert. (Andere E-Mail-Clients "tun" offensichtlich HTML-E-Mails - es ist einfach so, dass keiner von ihnen dafür bekannt ist, mit dem Mechanismus zu arbeiten, den Word zum Senden von HTML-E-Mails verwendet).

Unter der Annahme, dass Sie sind Outlook verwenden, das zweite Problem ist, dass die E-Mail-Merge-Verfahren nur den Text per E-Mail, die in der Datenspalte in der EmailDataSource.doc platziert wurde, die die Datenquelle für die Zusammenführung zu Email. Die Art und Weise, wie die EmailMergeTableMaker-Routine derzeit funktioniert, ist ein durch Tabulatoren getrennter Textblock. Word wird wahrscheinlich die Registerkarten in einigen Leerraum erweitern, aber es wird keine HTML-Tabelle generieren. Das ist also wahrscheinlich der Ursprung des Ausrichtungsproblems. Wenn dies der Fall ist, müssen Sie sicherstellen, dass jede Zelle stattdessen eine Tabelle enthält.

Es wäre wahrscheinlich besser, dies zu tun, indem Sie die Funktionsweise von EmailMergeTableMaker überdenken. Die folgende "Schnellkorrektur" hat hier einige Beispieldaten bearbeitet, aber ich habe keine Situationen getestet, in denen zum Beispiel die Zelle leer ist.

Nach diesem Code ...

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 

... folgendes einfügen:

' 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 

Wenn Sie nicht mit Outlook sind, dann werden Sie nicht in der Lage sein MailMerge verwenden direkt HTML-Format Nachricht zu erstellen, und Sie werden offensichtlich nicht in der Lage sein, das Outlook-Objektmodell zu tun, so denke ich, dass Sie dann in Bezug auf das Generieren von HTML-Format-E-Mails und senden sie einige denken müssen anderer Weg (z.B. direkt über SMTP), aber das ist eine ganz andere Geschichte.

Die andere Möglichkeit zum Senden von E-Mails über Outlook ist Outlook zu automatisieren, wie Thomas Inzina vorschlägt. Dies erfordert jedoch auch andere Änderungen an der Funktionsweise der Zusammenführung.

FWIW die Routinen, die Sie verwenden, stammen von einem Tutotials von "Macropod" - Ich habe keinen Link dafür, aber eine Suche nach "MacroPod Catalog MailMerge Tutorial" führt Sie möglicherweise zu diesem und zu anderen Möglichkeiten, dies zu lösen Art des Problems.

+0

Danke Bibadia! Wir haben Outlook, so wird definitiv Ihren Vorschlag verwenden. – Siew