仅为一行运行Word邮件合并

时间:2015-11-22 18:31:01

标签: excel forms vba excel-vba

首先让我先说我不知道​​自己在做什么。好吧,有些想法,但大多数情况下我只是想要它。我一直在研究一个Excel宏来运行Excel中的Word邮件合并几周,我拼凑了不同的代码来包含我需要它做的一切。我的问题是它第一次工作,但如果我不重置宏,它会在以后的每个时间卡住。

我制作的工作表的设计使宏可以从工作表中提取所需的所有信息(代码中不包含硬编码的位置)。这是因为包含Excel表单,字母模板和完成的字母的文件夹将被发送给多个用户,因此将保存在每个用户的计算机上的不同位置。用户在Excel表单中输入详细信息,最终将在Word文档中创建格式化的纪律信函,以发送给正在审阅的播放器。可能需要在字母中包含多个违规,因此Excel表单提供该选项,而Word表单将包含一堆不必要的空字段。 (我最初尝试将Word中的字母设置为一个表单,但我无法获得我需要一起工作的所有因素)Word表单也没有隐藏字段的能力而且不能支持依赖下拉列表或我需要的每个下拉列表中的文本数量。总之...

流程:

  1. 用户打开Excel文件并将信息输入到一个布局合理,用户友好的表单中,其中包含依赖的下拉列表等,以及隐藏和显示字段的按钮(如果用户需要包含多个违规行为)
  2. 当用户输入完信息后,他们会点击命令按钮来运行邮件合并(“创建纪律信件”)。
  3. 他们在表单中选择的信息链接到另一个名为“数据表”的工作表(同一工作簿),其中包含合并将从中提取的列。
  4. 工作簿还包含“控制表”工作表,该工作表提供宏将从中提取的文件和文件夹的位置。
  5. 宏应该:

    1. 打开Word合并模板(它根据用户在表单中的选择选择正确的模板)
    2. 运行合并
    3. 将合并的产品发送到新文档
    4. 关闭原始合并模板而不保存更改
    5. 使用特定文件名保存新文档(基于用户在原始Excel表单中所做的选择)
    6. 将其保存到“Final Documents”文件夹中,该文件夹位于我发送给用户的原始文件夹中。
    7. 新保存的文件/信件保持打开状态以供进一步编辑(如有必要)
    8. 新文档包含一个按钮,可以将完成的字母保存为.pdf(也可以保存到特定位置),但该宏位于Word中,因此不属于我的问题。
    9. 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
      

0 个答案:

没有答案