如何拆分邮件合并并使用合并字段作为名称保存文件 [英] How to split a mail merge and save files with a merge field as the name
问题描述
我设置了一堆邮件合并模板,当我合并文档时,我想将结果拆分为单独的文件,每个文件的名称基于合并字段FileNumber".
I have a bunch of mail merge templates setup, when I merge the documents I want to split the results into separate files each one with a name based on the merge field "FileNumber".
我目前拥有的代码是:
Sub splitter()
' Based on a macro by Doug Robbins to save each letter created by a mailmerge as a separate file.
' With help from http://www.productivitytalk.com/forums/topic/3927-visual-basic-question-for-merge-fields/
Dim i As Integer
Dim Source As Document
Dim Target As Document
Dim Letter As Range
Dim oField As Field
Dim FileNum As String
Set Source = ActiveDocument
For i = 1 To Source.Sections.Count
Set Letter = Source.Sections(i).Range
Letter.End = Letter.End - 1
For Each oField In Letter.Fields
If oField.Type = wdFieldMergeField Then
If InStr(oField.Code.Text, "FileNumber") > 0 Then
'get the result and store it the FileNum variable
FileNum = oField.Result
End If
End If
Next oField
Set Target = Documents.Add
Target.Range = Letter
Target.SaveAs FileName:="C:\Temp\Letter" & FileNum
Target.Close
Next i
End Sub
问题是,如果我合并到新文档",那么FileNumber"字段不再存在,所以它无法选择,但如果我只是去预览结果"并运行宏,它只会保存当前预览的记录,而不是其余的字母.
我假设我需要将代码更改为类似
I’m assuming I need to change the code to something like
For i = 1 To Source.MergedRecord.Count
Set Letter = Source.MergedRecord(i).Range
但我无法计算出正确的语法.
but I can't work out the correct syntax.
我知道 http://www.gmayor.com/individual_merge_letters.htm 但我不想要对话框,我只想要一个单击按钮.
I am aware of http://www.gmayor.com/individual_merge_letters.htm but I don't want the dialog boxes I just want a one click button.
推荐答案
有一个不涉及拆分结果文档的简单解决方案:准备合并并留在模板文档中.在合并一条记录时录制宏,然后保存并关闭生成的文件,最终前进到下一条记录.
There is a simple solution not involving splitting the resulting document: Prepare the merge and staying in the template document.Record a macro as you merge one record, then save and close the resulting file, eventuallye advance to the next record.
见下面生成的宏.我添加了很少的代码,只是为了从数据源(可在模板文档中访问)的字段中提取文件名.
See the generated macro below. I have added very little code just to extract the filename from a field in the datasource (which is accessible in the template document).
将宏分配给快捷键或在 VBA 中实现循环.请注意字段名区分大小写.
Assign the macro to a shortcut key or implement a loop in VBA. Observe that the fieldnames are casesensitive.
问候,索伦
Sub flet1()
'
' flet1 Makro
' 1) Merges active record and saves the resulting document named by the datafield FileName"
' 2) Closes the resulting document, and (assuming that we return to the template)
' 3) advances to the next record in the datasource
'
'Søren Francis 6/7-2013
Dim DokName As String 'ADDED CODE
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
.LastRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
' Remember the wanted documentname
DokName = .DataFields("FileName").Value ' ADDED CODE
End With
' Merge the active record
.Execute Pause:=False
End With
' Save then resulting document. NOTICE MODIFIED filename
ActiveDocument.SaveAs2 FileName:="C:\Temp\" + DokName + ".docx", FileFormat:= _
wdFormatXMLDocument, LockComments:=False, Password:="", AddToRecentFiles _
:=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts _
:=False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
SaveAsAOCELetter:=False, CompatibilityMode:=14
' Close the resulting document
ActiveWindow.Close
' Now, back in the template document, advance to next record
ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
End Sub
这篇关于如何拆分邮件合并并使用合并字段作为名称保存文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!