经常使用邮件合并的都会发现,一旦邮件合并的数据源移动了位置,之前做好的邮件合并就需要重新选择数据源。
在VBA中可以使用如下的代码实现word邮件合并主文档与excel数据源的路径自动匹配:
Private Sub Document_Open() Call QQ1722187970 End Sub Private Sub Document_Close() Dim oMailMerge As MailMerge Dim oDoc As Document Dim oMailMergeDataSource As MailMergeDataSource Set oDoc = Word.ActiveDocument Set oMailMerge = oDoc.MailMerge '邮件合并对象 With oMailMerge .MainDocumentType = wdNotAMergeDocument End With End Sub Sub QQ1722187970() Const xlUp = -4162 Dim oMailMerge As MailMerge Dim oDoc As Document Dim oMailMergeDataSource As MailMergeDataSource Dim sPath As String Dim sName As String sPath = Word.ActiveDocument.Path & "\" sName = Dir(sPath & "*.xls*", vbNormal) Dim oExcel As Object Set oExcel = VBA.CreateObject("excel.application") Set oWB = oExcel.workbooks.Open(sPath & sName) Dim oWK Set oWK = oWB.worksheets(1) sTableName = oWK.Name iRow = oWK.Range("a65536").End(xlUp).Row '此处修改为excel文档的名称即可 Set oDoc = Word.ActiveDocument Set oMailMerge = oDoc.MailMerge '连接字符串 sConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPath & sName & ";Extended Properties='HDR=YES;IMEX=1'" sSQL = "SELECT * FROM [" & sTableName & "$a2:o" & iRow & "]" Debug.Print sSQL '邮件合并对象 With oMailMerge .MainDocumentType = wdNotAMergeDocument .MainDocumentType = wdFormLetters 'Name参数表示excel数据源的完整路径, LinkToSource参数表示是否每次打开word文档都执行sql命令,Revert表示如果数据源已经打开是否重新打开 .OpenDataSource Name:=sPath & sName, _ LinkToSource:=False, _ Revert:=True, _ Connection:=sConStr, _ SQLStatement:=sSQL End With End Sub
发表评论