首先让我先说我不知道自己在做什么。好吧,有些想法,但大多数情况下我只是想要它。我一直在研究一个Excel宏来运行Excel中的Word邮件合并几周,我拼凑了不同的代码来包含我需要它做的一切。我的问题是它第一次工作,但如果我不重置宏,它会在以后的每个时间卡住。
我制作的工作表的设计使宏可以从工作表中提取所需的所有信息(代码中不包含硬编码的位置)。这是因为包含Excel表单,字母模板和完成的字母的文件夹将被发送给多个用户,因此将保存在每个用户的计算机上的不同位置。用户在Excel表单中输入详细信息,最终将在Word文档中创建格式化的纪律信函,以发送给正在审阅的播放器。可能需要在字母中包含多个违规,因此Excel表单提供该选项,而Word表单将包含一堆不必要的空字段。 (我最初尝试将Word中的字母设置为一个表单,但我无法获得我需要一起工作的所有因素)Word表单也没有隐藏字段的能力而且不能支持依赖下拉列表或我需要的每个下拉列表中的文本数量。总之...
流程:
宏应该:
Excel表单可能会在用户需要再次使用之前关闭并重新打开,在这种情况下,宏运行正常。但是很有可能,用户将在Word中看到完成的字母,意识到他们忘记了包含违规,返回打开的Excel表单添加违规,然后再次单击宏按钮。如果发生这种情况,宏将停留在宏进程#4(从上面的列表中)。我不知道导致这个问题的代码(或缺失)是什么,但我已经与它斗争了好几天,我找不到任何可以应用于我的问题的东西。或者也许我有,但我没有意识到,因为我认真地抓住它。
Sub RunMerge()
Dim bCreatedWordInstance As Boolean
Dim wdapp As Word.Application
Dim wddoc As Word.Document
Dim rng1 As Range
Dim wb As Workbook
Dim wsControl As Worksheet
Dim wsData As Worksheet
Dim strWorkbookName As String
Dim strTemplateFolder As String
Dim strTemplateName As String
Dim lngTemplateNameColumn As Long
Dim strFinalDocumentFolder As String
Dim strFinalDocumentName As String
Dim lngDocumentNameColumn As Long
Dim lngRecordKount As Long ' not used but retained for future use
Set wb = ThisWorkbook
Set wsControl = wb.Worksheets("Control Sheet")
wsControl.Activate
strTemplateFolder = wsControl.[Template_Folder].Value
strFinalDocumentFolder = wsControl.[Document_Folder].Value
Set wsData = wb.Worksheets(wsControl.[Data_Sheet].Value)
wsData.Activate
lngTemplateNameColumn = wsData.[Template_Name].Column
lngDocumentNameColumn = wsData.[Document_Name].Column
Set rng1 = wsData.Range("B1:B8")
strTemplateName = strTemplateFolder & "\" & wsData.Cells(2, lngTemplateNameColumn) & ".doc"
strFinalDocumentName = strFinalDocumentFolder & "\" & wsData.Cells(2, lngDocumentNameColumn)
strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name\
On Error Resume Next
' Create a Word Application instance
bCreatedWordInstance = False
Set wdapp = GetObject(, "Word.application")
If wdapp Is Nothing Then
Err.Clear
Set wdapp = CreateObject("Word.Application")
bCreatedWordInstance = True
End If
If wdapp Is Nothing Then
MsgBox "Could not start Word"
Err.Clear
On Error GoTo 0
Exit Sub
End If
' Let Word trap the errors
On Error GoTo 0
' Set to True if you want to see the Word Doc flash past during construction
wdapp.Visible = True
' check that template exists
If Dir(strTemplateName) = "" Then
MsgBox strTemplateName & " not found"
End If
Set wddoc = wdapp.Documents.Open(strTemplateName)
If wddoc Is Nothing Then Set wddoc = wdapp.Documents.Open(strTemplateName)
wddoc.Activate
With wddoc
.MailMerge.OpenDataSource Name:=strWorkbookName, SQLStatement:="SELECT * FROM `Data Sheet$`"
With wddoc.MailMerge 'With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
.Execute Pause:=False
End With
End With
' Save new file
ActiveDocument.SaveAs strFinalDocumentName
' Close the New Mail Merged Document
If bCreatedWordInstance Then
wddoc.Close savechanges:=wdDoNotSaveChanges
Set wddoc = Nothing
End If
0:
Set wdapp = Nothing
Set rng1 = Nothing
Set wsData = Nothing
Set wsControl = Nothing
Set wb = Nothing
End Sub
第二次陷入困境:
' Save new file
ActiveDocument.SaveAs strFinalDocumentName