如何从Excel工作表打开Word MailMerge的OpenDataSource

问题描述 投票:0回答:1

我正在尝试使用OpenDataSource中的MailMerge并使用以前保存数据的工作表作为源来自动创建Word文档。

问题是每次调用wdocSource.MailMerge.OpenDataSource时excel都会在执行时暂停。进程WINWORD.EXE正在运行,但Excel无法继续,因为它正在等待某些事情发生,因此我必须终止进程以使其响应。

我检查了这些问题,但我无法使它起作用:

Mailmerge from Excel using Word template VBA

Executing Word Mail Merge

Running a MS Word mail merge from excel

Const sTempSourceSheet = "TempSourceSheet"

创建工作表源

Sub PrintArray(Data, SheetName, StartRow)
    Dim Destination As range
    Set Destination = range("A" & StartRow)
    Set Destination = Destination.Resize(1, UBound(Data))
    Destination.FormulaR1C1 = Data
End Sub

''''''''''''''''''''''''''''''''''''''''
' SaveSourceSheet
Public Sub SaveSourceSheet(cols() As String, arr() As String)
On Error GoTo error
    Dim ws As Worksheet

    With ActiveWorkbook
        .Sheets.Add(After:=.Sheets(.Sheets.count)).Name = sTempSourceSheet
    End With

    PrintArray cols, sTempSourceSheet, 1
    PrintArray arr, sTempSourceSheet, 2

done:
    Exit Sub

error:
    With ActiveWorkbook
        .Sheets(sTempSourceSheet).Delete
    End With

    Resume done
End Sub

以及用于运行MailMerge的代码

Sub Contract(wordfile As String)
    Dim wd As Object
    Dim wdocSource As Object
    Dim excelfile As String
    Dim strWorkbookName As String
    excelfile = ThisWorkbook.path & "\" & ThisWorkbook.Name
    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(wordfile)

    wdocSource.MailMerge.MainDocumentType = wdFormLetters

    wdocSource.MailMerge.OpenDataSource Name:= _
    excelfile, ConfirmConversions:=False, _
    ReadOnly:=False, LinkToSource:=True, AddToRecentFiles:=False, _
    PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
    WritePasswordTemplate:="", Revert:=False, format:=wdOpenFormatAuto, _
    Connection:= _
    "Provider=Microsoft.Jet.OLEDB.4.0;Password="""";" & _
    "User ID=Admin;" & _
    "Data Source=" & excelfile & ";" & _
    "Mode=Read;Extended Properties=" & _
    "HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";" _
    , SQLStatement:="SELECT * FROM `TempSourceSheet$`", SQLStatement1:="", SubType:= _
    wdMergeSubTypeAccess

    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

任何想法?

excel vba ms-word mailmerge
1个回答
0
投票

«问题在于,每次调用wdocSource.MailMerge.OpenDataSource时excel都会在执行时暂停。进程WINWORD.EXE正在运行,但Excel无法继续,因为它正在等待某些事情发生,因此我必须终止该进程以使其响应。»

这表明您要打开的文档已经是mailmerge主文档,并且代码正在等待您响应打开此类文档时Word产生的SQL查询。由于您的代码已经包含自己的SQL语句,因此简单的解决方案是插入:

wd.DisplayAlerts = 0 ' wdAlertsNone

之前:

Set wdocSource = wd.Documents.Open(wordfile)
© www.soinside.com 2019 - 2024. All rights reserved.