![]() |
#1
|
|||
|
|||
![]()
Hello,
Im trying to perform a mail merge through VBA. A problem that I encouter is that my datasource has a CRLF (carriage return line feed) in the last row of the datasource. This causes a mailmerge error log to pop up and say "Record X Was an Empty Record". Ultimately im trying to get this separate sheet to either go away or only show up when there is a real error on a record. Im having difficulty finding a solution on skipping or even deleting the last row of the datasource. Ive tried messing with Code:
ActiveDocument.MailMerge.DataSource.RecordCount Here is what I have so far. Any help on how I can merge all but the last row or even delete the last row is appreciated. Code:
ActiveDocument.MailMerge.MainDocumentType = wdFormLetters ActiveDocument.MailMerge.OpenDataSource Name:="FILEPATH", _ ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _ AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _ WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _ Format:=wdOpenFormatAuto, SubType:=wdMergeSubTypeOther With ActiveDocument.MailMerge .Destination = wdSendToNewDocument .SuppressBlankLines = True With .DataSource .FirstRecord = wdDefaultFirstRecord .LastRecord = wdDefaultLastRecord End With .Execute Pause:=False End With |
#2
|
||||
|
||||
![]()
You could apply a filter to the SQL (which you haven't included in your code) to exclude empty records.
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#3
|
|||
|
|||
![]()
Thanks for that Idea, I think it'll work but im kind of clueless in regards to how that sql qry works.
Code:
ActiveDocument.MailMerge.MainDocumentType = wdFormLetters ActiveDocument.MailMerge.OpenDataSource Name:="C:\DATA\" & Environ("USERNAME") & "\Word.txt", _ ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _ AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _ WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _ Format:=wdOpenFormatAuto, sqlstatement:="SELECT * FROM activedocument.MailMerge.DataSource WHERE ActiveDocument.MailMerge.DataSource.DataFields(2).Value IS NOT NULL", SubType:=wdMergeSubTypeOther With ActiveDocument.MailMerge .Destination = wdSendToNewDocument .SuppressBlankLines = True With .DataSource .FirstRecord = wdDefaultFirstRecord .LastRecord = wdDefaultLastRecord End With .Execute Pause:=False End With |
#4
|
||||
|
||||
![]()
To get the SQL query string, open up the document and connect it to the data source for a mailmerge if that hasn't already been done. Having done that, go to Mailings|Edit Recipient List>Filter and apply the requisite filter to the problematic field. The following macro will then tell you, in turn, what are the: Data Source Name; Connect String; and Query String. It's the last of these you need to incorporate into your code - be careful with the direction of any quote characters. You could, of course, output any of these to the end of the document so you can cut & paste any parts you need into your code.
Code:
Sub Test() With ActiveDocument.MailMerge If .MainDocumentType <> wdNotAMergeDocument Then MsgBox "Mail Merge Data Source Name:" & vbCr & .DataSource.Name MsgBox "Mail Merge Connect String:" & vbCr & .DataSource.ConnectString MsgBox "Mail Merge Query String:" & vbCr & .DataSource.QueryString Else MsgBox "Not A Merge Document" End If End With End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#5
|
|||
|
|||
![]()
You've been a great help but im still having issues with this.
Code:
Dim doc As String doc = "C:\MERGE\" & Environ("USERNAME") & "\word.txt" ActiveDocument.MailMerge.MainDocumentType = wdFormLetters ActiveDocument.MailMerge.OpenDataSource Name:=doc, _ ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _ AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _ WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _ Format:=wdOpenFormatAuto, sqlstatement:="SELECT * FROM doc WHERE [M_2] IS NOT NULL ", SubType:=wdMergeSubTypeOther With ActiveDocument.MailMerge .Destination = wdSendToNewDocument .SuppressBlankLines = True With .DataSource .FirstRecord = wdDefaultFirstRecord .LastRecord = wdDefaultLastRecord End With .Execute Pause:=False End With If I use SELECT * FROM doc WHERE M_2 IS NOT NULL then the file will still merge but It doesnt remove the empty row. If I use SELECT * FROM doc WHERE [M_2] IS NOT NULL then I get a "Run-Time Error 5922. Word was unable to open the data source." Im not sure what im doing wrong. I also tried using 'M_2' instead of [M_2]. any ideas on what im messing up here? |
#6
|
||||
|
||||
![]()
What did the SQL code returned by the macro I posted contain?
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#7
|
|||
|
|||
![]()
c:\MERGE\user\word.txt
Connection String returned nothing. SELECT * FROM c:\MERGE\user\word.txt Last edited by vincenzo345; 08-31-2017 at 03:04 PM. Reason: left out requested items |
#8
|
||||
|
||||
![]()
It'll have far more than that! It'll start with:
SELECT * FROM
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#9
|
|||
|
|||
![]()
I think I was editing that last post just as you were writing this
Here are the three results that popped up. c:\MERGE\user\word.txt The Connection String returned nothing. SELECT * FROM c:\MERGE\user\word.txt |
#10
|
||||
|
||||
![]()
Presumably, it was actually:
SELECT * FROM c:\MERGE\user\word.txt WHERE [M_2] IS NOT NULL Your VBA code should thus contain: SQLStatement:="SELECT * FROM " & doc & "WHERE [M_2] IS NOT NULL"
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
![]() |
Tags |
mailmerge omit lastrecord |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
how to get datasource element | ragesz | Mail Merge | 1 | 09-29-2013 07:12 PM |
![]() |
Baldeagle | Mail Merge | 8 | 02-11-2013 04:40 AM |
![]() |
Baldeagle | Mail Merge | 13 | 05-29-2012 02:04 PM |
Access MailMerge DataSource in VB | advin | Mail Merge | 1 | 01-04-2010 01:34 AM |
Changing DataSource | ntfirewall | Mail Merge | 0 | 03-30-2007 06:01 AM |