2009-08-31 16 views
8

Tengo una hoja de Excel con datos y quiero exportarla a un nuevo documento de Word. ¿Es posible iniciar MAIL MERGE desde excel macro haciendo clic en un botón de la hoja?Ejecutando Word Mail Merge

Respuesta

16

Si el documento de Word ya está configurado con los campos de combinación, y está ejecutando la macro desde el libro que contiene los datos que desea combinar en el documento de Word, a continuación, intente esto:

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

Si su documento de Word ya está configurado con el origen de datos y el diseño de los campos de fusión, entonces se vuelve mucho más simple. En el ejemplo siguiente MailMergeLayout.doc está todo listo para realizar una fusión. Un botón en Excel está vinculado a RunMailMerge() como se muestra a continuación. Todo el código está contenido en un módulo de 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

para obtener una solución de Dendarii a trabajar que tenía que declarar constantes de Word en Excel VBA de la siguiente manera:

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

Good point, MattM. Si no tiene un conjunto de referencia en Excel VBA para el objeto Word (en el Editor de VBA, Herramientas> Referencias> Biblioteca de objetos de Microsoft Word [versión]), las constantes de Word no funcionarán, y tendrá que usar los valores de MattM en lugar. – 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 

Por encima de código es abrir un documento de Word de combinación de correspondencia (con su enlace de la fuente y todos los ajustes de mergefield) todo lo que quiero es que el cuadro de mensaje "Opening the document will run the following SQL command " esté disponible para el usuario, a partir de ese momento el usuario podría seleccionar 'Yes' o '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

Esto no está ni remotamente cerca de una solución a la pregunta. – robnick