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
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
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
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
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'
.
Dim opt As String
opt = MessageBox("Opening the document will run the following SQL command", vbYesNo)
If opt = vbYes Then
'execute query
End If
Esto no está ni remotamente cerca de una solución a la pregunta. – robnick
- 1. Autenticación php mail
- 2. Mail to MySQL Database
- 3. Mail video cargado
- 4. $ mail-> addAddress() parámetros
- 5. PHP E-Mail Encoding?
- 6. PHP: mail() vs SendMail
- 7. mail vs sendmail
- 8. Zend Mail Gmail SMTP
- 9. asp.net mail add ReplyTo
- 10. java mail gmail
- 11. PHP Mail, CC Field
- 12. PHP mail() no funciona
- 13. PHP mail() y Outlook
- 14. commit-pull-merge-push o pull-merge-commit-push?
- 15. Subversion: Merge, Revert, Merge nuevamente. ¿Por qué falla silenciosamente?
- 16. PHP mail function 'from' address
- 17. descargar archivos utilizando Java Mail
- 18. Java Mail timeout & connectiontimeout handling
- 19. exim configuration - accept all mail
- 20. Leyendo Outlook Mail con C#
- 21. Problema con PHP PEAR Mail
- 22. Php mail: cómo enviar html?
- 23. iOS Mail Composer no rechazará
- 24. cómo probar mail() usando PHPUnit
- 25. Zend Mail 2.0 Archivos adjuntos
- 26. Cómo resolver javax/mail/MessagingException?
- 27. MERGE en Entity Framework
- 28. Array Merge (Unión)
- 29. NSIS - Merge Modules
- 30. Merge multiple cv :: Mat?
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