2009-08-31 4 views
8

J'ai une feuille Excel avec des données et je veux l'exporter vers un nouveau document Word. Est-il possible de démarrer MAIL MERGE à partir d'une macro Excel en cliquant sur un bouton de la feuille?Exécution de Fusion et publipostage Word

Répondre

16

Si votre document Word est déjà configuré avec les champs de fusion, et que vous exécutez la macro du classeur qui contient les données que vous souhaitez fusionner dans le document Word, essayez ceci:

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 Votre document Word est déjà configuré avec la source de données et la mise en page des champs de fusion, alors cela devient beaucoup plus simple. Dans l'exemple ci-dessous, MailMergeLayout.doc est prêt à effectuer une fusion. Un bouton dans Excel est lié à RunMailMerge() comme ci-dessous. Tout le code est contenu dans un 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

Pour obtenir la solution de dendarii au travail, je devais déclarer des constantes Word dans Excel VBA comme suit:

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

Bon point, MattM. Si vous n'avez pas un ensemble de référence dans Excel VBA à l'objet Word (dans l'éditeur VBA, Outils> Références> Bibliothèque d'objets Microsoft Word [version]), les constantes Word ne fonctionneront pas, et vous devrez utiliser les valeurs de MattM au lieu. – 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 

code ci-dessus est d'ouvrir un document Word de mailmerge (avec le lien source et codes de mergefield tous les paramètres) tout ce que je veux est pour la boîte de message "Opening the document will run the following SQL command " être mis à la disposition de l'utilisateur, à partir de ce moment, l'utilisateur peut soit sélectionner 'Yes' ou '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

Ce n'est même pas proche d'une solution à la question. – robnick

Questions connexes