I have a large merge done from a .dat file into word. I would like to save each record in the merge as a seperate file. This is easy to do manually. However, I have so many I'm wondering if there is a way to get a macro to do this. I was able to suceed in getting that to work except I don't know how to name the document as a field name contained in the merge.
For example...
Child ID: CnBio_ID
First Name: First_Name
Last Name: Last_Name
etc.......
How can I make the macro save the file as what is in the CNBio_ID merge field?
Sub SaveAsSeperateDocument()Dim x As LongDim i As Long With ActiveDocument.MailMerge .Destination = wdSendToNewDocument .SuppressBlankLines = True 'get the record count of the datasource With .DataSource .ActiveRecord = wdLastRecord x = .ActiveRecord 'set the activerecord back to the first .ActiveRecord = wdFirstRecord End With 'loop the datasource count and merge one record at a time For i = 1 To x .DataSource.FirstRecord = i .DataSource.LastRecord = i .Execute Pause:=True///////////////////////// PROBLEM IS HERE /////////////////////////////////////// ChildID = MERGEFIELD CnBio_ID ActiveDocument.SaveAs FileName:=ChildID///////////////////////////////////////////////////////////////////////////////////////////// ActiveDocument.Close Next i End WithEnd Sub
Sub MergeToSingles()Dim wrdMainDoc As Word.DocumentDim l As IntegerSet wrdMainDoc = ActiveDocumentWith wrdMainDoc.MailMerge For l = 1 To .DataSource.RecordCount .Destination = wdSendToNewDocument .DataSource.FirstRecord = l .DataSource.LastRecord = l .Execute .DataSource.ActiveRecord = l ActiveDocument.SaveAs .DataSource.DataFields("Last_Name") & ".doc" ActiveDocument.Close wdDoNotSaveChanges Next lEnd WithEnd Sub
I wasn't able to get that to work. Might it place the documents in some location? It didn't appear to do anything.
Taking what you did have there I was able to come up with the following that will save the first document but says "it cannot save the next document with the same name".
Sub MergeAllRecordsToPrinter()'' MergeAllRecordsToPrinter MacroDim x As LongDim i As Long With ActiveDocument.MailMerge .Destination = wdSendToNewDocument .SuppressBlankLines = True 'get the record count of the datasource With .DataSource .ActiveRecord = wdLastRecord x = .ActiveRecord 'set the activerecord back to the first .ActiveRecord = wdFirstRecord End With 'loop the datasource count and merge one record at a time For i = 1 To x .DataSource.FirstRecord = i .DataSource.LastRecord = i .Execute Pause:=True ActiveDocument.SaveAs .DataSource.DataFields("CnBio_ID") & ".doc" ActiveDocument.Close wdDoNotSaveChanges Next i End WithEnd Sub
By the way, I'm using Word 2003 if that makes a difference.
0
There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.
It seems like you are not getting the CnBio_ID value of the current record you are merging. Using the code you post along with that from GrahamSkan, try the following code to see if that corrects the issue.
Sub MergeAllRecordsToPrinter()'MergeAllRecordsToPrinter MacroDim x As LongDim i As LongWith ActiveDocument.MailMerge .Destination = wdSendToNewDocument .SuppressBlankLines = True 'get the record count of the datasource With .DataSource .ActiveRecord = wdLastRecord x = .ActiveRecord 'set the activerecord back to the first .ActiveRecord = wdFirstRecord End With 'loop the datasource count and merge one record at a time For i = 1 To x .DataSource.FirstRecord = i .DataSource.LastRecord = i .Execute Pause:=True 'set active record to the one that was just merged .DataSource.ActiveRecord = i ActiveDocument.SaveAs .DataSource.DataFields("CnBio_ID") & ".doc" ActiveDocument.Close wdDoNotSaveChanges Next iEnd WithEnd Sub
There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.
Open in new window