2009-08-31 14 views
8

Mam arkusz programu Excel z danymi i chcę wyeksportować go do nowego dokumentu programu Word. Czy można uruchomić MAIL MERGE z poziomu programu Excel, klikając przycisk na arkuszu?Wykonywanie programu Word Mail Merge

Odpowiedz

16

Jeśli dokument programu Word jest już skonfigurowany z pól korespondencji seryjnej, a używasz makro ze skoroszytu, który zawiera dane, które chcesz scalić do dokumentu programu Word, a następnie spróbuj tego:

Sub RunMerge() 

    Dim wd As Object 
    Dim wdocSource As Object 

    Dim strWorkbookName As String 

    On Error Resume Next 
    Set wd = GetObject(, "Word.Application") 
    If wd Is Nothing Then 
     Set wd = CreateObject("Word.Application") 
    End If 
    On Error GoTo 0 

    Set wdocSource = wd.Documents.Open("c:\test\WordMerge.docx") 

    strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name 

    wdocSource.MailMerge.MainDocumentType = wdFormLetters 

    wdocSource.MailMerge.OpenDataSource _ 
      Name:=strWorkbookName, _ 
      AddToRecentFiles:=False, _ 
      Revert:=False, _ 
      Format:=wdOpenFormatAuto, _ 
      Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _ 
      SQLStatement:="SELECT * FROM `Sheet1$`" 

    With wdocSource.MailMerge 
     .Destination = wdSendToNewDocument 
     .SuppressBlankLines = True 
     With .DataSource 
      .FirstRecord = wdDefaultFirstRecord 
      .LastRecord = wdDefaultLastRecord 
     End With 
     .Execute Pause:=False 
    End With 

    wd.Visible = True 
    wdocSource.Close SaveChanges:=False 

    Set wdocSource = Nothing 
    Set wd = Nothing 

End Sub 
1

Jeśli Twój dokument słowny jest już skonfigurowany ze źródłem danych i scalony układ pól, wtedy staje się znacznie prostszy. W poniższym przykładzie MailMergeLayout.doc jest gotowy do przeprowadzenia scalenia. Przycisk w Excelu jest połączony z RunMailMerge() jak poniżej. Cały kod znajduje się w module Excel VBA.

Sub RunMailMerge() 

    Dim wdOutputName, wdInputName As String 
    wdOutputName = ThisWorkbook.Path & "\Reminder Letters " & Format(Date, "d mmm yyyy") 
    wdInputName = ThisWorkbook.Path & "\MailMergeLayout.doc" 

    ' open the mail merge layout file 
    Dim wdDoc As Object 
    Set wdDoc = GetObject(wdInputName, "Word.document") 
    wdDoc.Application.Visible = True 

    With wdDoc.MailMerge 
     .MainDocumentType = wdFormLetters 
     .Destination = wdSendToNewDocument 
     .SuppressBlankLines = True 
     .Execute Pause:=False 
    End With 

    ' show and save output file 
    wdDoc.Application.Visible = True 
    wdDoc.Application.ActiveDocument.SaveAs wdOutputName 

    ' cleanup 
    wdDoc.Close SaveChanges:=False 
    Set wdDoc = Nothing 

End Sub 
4

Aby uzyskać rozwiązanie Dendarianie do pracy musiałem zadeklarować stałe Worda w Excel VBA w następujący sposób:

' Word constants 
Const wdFormLetters = 0, wdOpenFormatAuto = 0 
Const wdSendToNewDocument = 0, wdDefaultFirstRecord = 1, wdDefaultLastRecord = -16 
+0

Dobra uwaga, MattM. Jeśli nie masz zestawu referencyjnego w programie Excel VBA do obiektu programu Word (w edytorze VBA, Narzędzia> Biblioteki referencyjne> Microsoft Word [wersja] Object Library), stałe programu Word nie będą działać, a będziesz musiał używać wartości Matta zamiast. – dendarii

0
Private Sub CommandButton1_Click() 

Set wordapp = CreateObject("word.Application") 

    wordapp.documents.Open "C:\Documents and Settings\User\Desktop\mergeletter.doc" 


    wordapp.Visible = True 

    wrddoc = wordapp.documents("C:\Users\User\Desktop\sourceofletters.xls") 


    wrddoc.mailmerge.maindocumenttype = wdformletters 

    With wrddoc.activedocument.mailmerge 

.OpenDataSource Name:="C:\Users\User\Desktop\sourceofletters.xls", _ 
      SQLStatement:="SELECT * FROM `Sheet1`" 



    End With 

End Sub 

Powyższy kod jest otwarcie dokumentu Word korespondencja seryjna (z linku źródłowym i kody wszystkich konfiguracji) wszystko, czego chcę, to udostępnienie użytkownikowi skrzynki komunikatów "Opening the document will run the following SQL command ". Od tego momentu użytkownik może wybrać: 'Yes' lub 'No'.

-1
Dim opt As String 
opt = MessageBox("Opening the document will run the following SQL command", vbYesNo) 
If opt = vbYes Then 
    'execute query 
End If 
+0

Nie jest to nawet bliskie rozwiązania danego problemu. – robnick

Powiązane problemy