我正在尝试使用OpenDataSource
中的MailMerge
并使用以前保存数据的工作表作为源来自动创建Word文档。
问题是每次调用wdocSource.MailMerge.OpenDataSource
时excel都会在执行时暂停。进程WINWORD.EXE
正在运行,但Excel无法继续,因为它正在等待某些事情发生,因此我必须终止进程以使其响应。
我检查了这些问题,但我无法使它起作用:
Mailmerge from Excel using Word template VBA
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
任何想法?
«问题在于,每次调用wdocSource.MailMerge.OpenDataSource时excel都会在执行时暂停。进程WINWORD.EXE正在运行,但Excel无法继续,因为它正在等待某些事情发生,因此我必须终止该进程以使其响应。»
这表明您要打开的文档已经是mailmerge主文档,并且代码正在等待您响应打开此类文档时Word产生的SQL查询。由于您的代码已经包含自己的SQL语句,因此简单的解决方案是插入:
wd.DisplayAlerts = 0 ' wdAlertsNone
之前:
Set wdocSource = wd.Documents.Open(wordfile)