2009-08-31 22 views
8

Tôi có một trang tính excel với dữ liệu và muốn xuất nó sang một tài liệu từ mới. Có thể bắt đầu MAIL MERGE từ macro excel bằng cách nhấp vào nút trên trang tính không?Thi hành Thư từ Hợp nhất

Trả lời

16

Nếu tài liệu Word của bạn đã được cấu hình với các trường hợp nhất, và bạn đang chạy vĩ mô từ bảng tính có chứa dữ liệu bạn muốn kết hợp vào tài liệu Word, sau đó thử này:

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

Nếu tài liệu từ của bạn đã được cấu hình với nguồn dữ liệu và bố cục các trường hợp nhất sau đó nó trở nên đơn giản hơn nhiều. Trong ví dụ bên dưới MailMergeLayout.doc là tất cả thiết lập sẵn sàng để thực hiện hợp nhất. Một nút trong Excel được liên kết với RunMailMerge() như dưới đây. Tất cả các mã được chứa trong một mô-đun VBA Excel.

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

Để có được giải pháp dendarii để làm việc tôi phải khai báo các hằng Word trong Excel VBA như sau:

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

Điểm tốt, MattM. Nếu bạn không có bộ tham chiếu trong Excel VBA đối tượng Word (trong VBA Editor, Công cụ> Tài liệu tham khảo> Microsoft Word [phiên bản] Thư viện đối tượng), hằng số Word sẽ không hoạt động và bạn sẽ phải sử dụng giá trị của MattM thay thế. – 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 

Trên mã này là để mở một tài liệu từ MailMerge (với liên kết nguồn của nó và tất cả những gì tôi muốn là cho hộp thư "Opening the document will run the following SQL command " được cung cấp cho người dùng, từ thời điểm đó, người dùng có thể chọn 'Yes' hoặc '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

Điều này thậm chí còn không gần với một giải pháp cho câu hỏi. – robnick

Các vấn đề liên quan