Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
DiscussionsAccessExcelInfoPathOutlookPowerPointPublisherWord
DirectoryUser Groups
Related Topics
Outlook ExpressInternet ExplorerWindowsMS Server ProductsMore Topics ...

MS Office Forum / Word / Mailmerge and Fax / December 2003

Tip: Looking for answers? Try searching our database.

faxing a merged document

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
AFREP - 05 Dec 2003 20:21 GMT
Is there a way to fax a merged document to each of the
records/clients.  I generate a 1 page letter to 20
people.  I want to have my PC to fax the personalized
letter to each person.  I am unable to get the fax
service to recognize the fax # for each person.
Peter Jamieson - 08 Dec 2003 23:39 GMT
If you are using Windows 2000 or later you could try the following macro,
which does a single merge for each record in a data source. The fax service
should recognise fax numbers in canonical format (e.. +44 161 555 5555 ), or
will attempt to dial whatever number you provide, so in particular you may
need to add code to deal with whatever fax number format you have.

If you're going to try it, please read the notes, modify the macro to suit
your needs, and test it (I have done a certain amount of testing here and it
seems to work with single- and multi-page documents with text and images,
with and without cover pages, but I have not done an awful lot of testing.
FWIW I've tested with Word 2000 SP2 on WIn2K and Word 2003 on WinXP but not
Word 2002). I would be interested in any feedback you may have, either in
here or despam my address and e-mail me.

If you're unfamiliar with VBA etc. getting this to work could be quite
difficult. A useful starting point is the Word MVPs site at
http://www.mvps.org/word , and specifically the following "get-you-started"
article

http://www.mvps.org/word/FAQs/MacrosVBA/CreateAMacro.htm

The macro code:

'-----------------------------------------------------
Sub MergeOneFaxPerSourceRec()

' Disclaimer: Use this macro at your own risk.
' Purpose:    Perform one Word mailmerge for each record in
'             a Word data source, sending the results of each
'             merge to a different fax number specified in a
'             column of the data source
' Author:     Peter J Jamieson
' Date:       November 2003
' Assumes:    Word 2000 or later (Word 97 might work)
'             Windows 2000 or later, with the standard
'             fax service software installed and
'             configured to use a working fax device
'             You have used Tools|References in the VBA
'             editor to add the appropriate type library
'             ("Faxcom 1.0 Type Library")
'             You correctly adapt the macro to your
'             environment
' Overview:   The routine performs one merge per record
'             in the data source. For each merge, the macro:
'              - creates a new Word document
'              - "prints" the document to the Fax printer,
'                but outputting the result to a .tif file
'                rather than allowing the fax printer to
'                send the fax directly. This allows us to
'                specify the fax number etc. in the macro
'                rather than having to respond to the fax
'                printer's dialog box.
'              - submits the tif file to the fax service
'              - discards the Word document
'
' Notes:      This does not use the Extended Fax client API
'             because it is not available in Windows 2000.
'
'             This macro relies on the fax service to deliver
'             the faxes once trhey have been submitted. You
'             should use the fax service to verify which faxes
'             have been sent and which, if any, failed. The fax
'             service should retain a copy of each fax submitted
'             so that retransmission should be feasible from
'             within the service, i.e. without re-running the
'             merge.

' NB, needs bettor error management and doubtless other
' things a VBA expert would point out.

' Specify the path for the .tif files saved by the Fax Printer
' This path must exist and the name should end with "\"
Const sTifFolder = "c:\tif\"
' Specify the name of the .tif file to output
Const sTifFile = "mergetif.tif"
' Specify the fax printer name that makes it all work
Const sFaxPrinter = "Fax"

Dim bFaxPortAvailable As Boolean
Dim bFaxServerAvailable As Boolean

Dim bTerminateMerge As Boolean

Dim lJobID As Long
Dim lSourceRecord As Long

Dim oApp As Word.Application
Dim oDataFields As Word.MailMergeDataFields
Dim oDoc As Word.Document
Dim oFaxDoc As FAXCOMLib.FaxDoc
Dim oFaxPort As FAXCOMLib.FaxPort
Dim oFaxPorts As FAXCOMLib.FaxPorts
Dim oFaxServer As FAXCOMLib.FaxServer
Dim oMerge As Word.MailMerge

Dim sActivePrinter As String
Dim sTifPath As String

' Phase 1.
' Connect to the Fax server
' and optionally see if a Port is available

Set oFaxServer = CreateObject("FaxServer.FaxServer")

If oFaxServer Is Nothing Then
 MsgBox "Could not create a fax server object"
 bFaxServerAvailable = False
Else
 ' This should connect us to the fax server on the current machine
 oFaxServer.Connect Servername:=Environ("computername")
 bFaxServerAvailable = True
 bFaxPortAvailable = True

 ' begin optional section
 ' - ensure that at least one output port is available
 ' - not essential but we will just see an error later
 '   if no output port is available
 Set oFaxPorts = oFaxServer.GetPorts
 If oFaxPorts.Count = 0 Then
   MsgBox "The fax server has no fax devices"
   bFaxPortAvailable = False
 Else
   ' look for a port that can send
   For i = 1 To oFaxPorts.Count
     Set oFaxPort = oFaxPorts.Item(i)
     If oFaxPort.Send = 0 Then
       Set oFaxPort = Nothing
     Else
       Exit For
     End If
   Next
   If oFaxPort Is Nothing Then
     MsgBox "The fax server has no ports configured to send faxes"
     bFaxPortAvailable = False
   Else
     ' at the moment we do not use the FaxPort object to get status
     ' info. so just get rid of it
     Set oFaxPort = Nothing
   End If
 End If
 ' we do not need this either
 Set oFaxPorts = Nothing
 ' end optional section

End If

' Phase 2.
' We can fax, so set up the printer
' and start the merges.

If bFaxServerAvailable And bFaxPortAvailable Then

 ' You may need to change this
 Set oApp = Application

 ' The mail merge main document is assumed
 ' to be the active document in the current
 ' instance of Word
 Set oDoc = oApp.ActiveDocument
 Set oMerge = oDoc.MailMerge
 Set oDataFields = oMerge.DataSource.DataFields

 ' save and set up the active printer
  sActivePrinter = oApp.ActivePrinter
 ' don't change the printer if it is already
 ' correctly set up
 ' (I had problems when I tried to switch
 ' to the fax printer in code)
 ' you may need to adjust this for your
 ' fax printer name
 If Left(sActivePrinter, 3) <> sFaxPrinter Then
   oApp.ActivePrinter = sFaxPrinter
 End If

 With oMerge

 ' If no data source has been defined,
 ' do it here using OpenDataSource.
 ' But if it is already defined in the document,
 ' you should not need to define it here.

 '  .OpenDataSource _
 '    Name:="whatever"

   lSourceRecord = 1
   bTerminateMerge = False

   Do Until bTerminateMerge
     .DataSource.ActiveRecord = lSourceRecord

     ' if we have gone past the end
     ' (and possibly, if there are no records)
     ' then the Activerecord will not be what
     ' we have just tried to set it to

     If .DataSource.ActiveRecord <> lSourceRecord Then
       bTerminateMerge = True
     Else
       .DataSource.FirstRecord = lSourceRecord
       .DataSource.LastRecord = lSourceRecord
       .Destination = wdSendToNewDocument
       .Execute

       ' Word always sets the output document produced
       ' by the merge to be the ActiveDocument

       ' Now print to the fax printer, specifying an
       ' OutputFileName.
       ' Specifying Background:=False is
       ' particularly important or the fax stage
       ' will fail later

       ' create the full path name for the file.
       ' (done separately so you can change the way
       ' you create the name and re-use the name later)

       sTifPath = sTifFolder + sTifFile
       oApp.PrintOut _
         Background:=False, _
         Append:=False, _
         Range:=wdPrintAllDocument, _
         OutputFileName:=sTifPath, _
         Item:=wdPrintDocumentContent, _
         Copies:=1, _
         PageType:=wdPrintAllPages, _
         PrintToFile:=True

       ' Don't need the document any more
       oApp.ActiveDocument.Close Savechanges:=False

       ' Now make a FaxDocument
       Set oFaxDoc = oFaxServer.CreateDocument(sTifPath)
       If oFaxDoc Is Nothing Then
         MsgBox "Could not create the fax document"
         ' you could consider finishing here by setting
         '  TerminateMerge = True
       Else
         ' fill in whatever details you need
         ' from the data source or elsewhere
         With oFaxDoc
           ' The number to send to. The only really essential
           ' piece of information. Here we get it from
           ' a field in the data source called "faxnumber"
           .FaxNumber = oDataFields("faxnumber")

           ' DisplayName is a "user-friendly" name used
           ' by the Fax Server when you e.g. inspect the
           ' current fax status

           ' here we get it from a field in the data source
           ' called ufname
           .DisplayName = oDataFields("ufname")
           ' here we just set it to ""
           '.DisplayName = ""

           ' If you want a cover page, set SendCoverPage
           ' to a nonzero value. You could define whether
           ' or not you want a cover page, and which
           ' page to use, in your data source. However,
           ' if you specify a cover page, you /must/
           ' provide a valid name for the page. This code
           ' does not verify whether you do or not.
           .SendCoverpage = 0

           ' If the cover page (.cov file) is a common
           ' cover page located on the server (i.e. in the
           ' default folder), set ServerCoverPage=-1
           ' and provide the name of the cover page
           ' If the cover page is somewhere else,
           ' set ServerCoverPage=0 and specify the
           ' full path name of the cover page
           .ServerCoverpage = 1
           .CoverpageName = ""

           ' The following items may be used in the coverpage
           ' or they may be displayed in fax service status
           ' dialog boxes. The items visible in the Win2000
           ' fax status are indicated by
           '** displayed in dialog

           .CoverpageNote = ""
           .CoverpageSubject = ""
           .EmailAddress = ""
           .RecipientAddress = ""
           .RecipientCity = ""
           .RecipientCompany = ""
           .RecipientCountry = ""
           .RecipientDepartment = ""
           .RecipientHomePhone = ""
           '** displayed in dialog
           .RecipientName = ""
           .RecipientOffice = ""
           .RecipientOfficePhone = ""
           .RecipientState = ""
           .RecipientTitle = ""
           .RecipientZip = ""
           .SenderAddress = ""
           '** displayed in dialog
           .SenderCompany = ""
           '** displayed in dialog
           .SenderDepartment = ""
           .SenderFax = ""
           .SenderHomePhone = ""
           '** displayed in dialog
           .SenderName = ""
           .SenderOffice = ""
           .SenderOfficePhone = ""
           .SenderTitle = ""

           '** displayed in dialog
           .BillingCode = ""

           ' DiscountSend = 0 means "send immediately
           ' If you have set up discount periods, setting
           ' DiscountSend to a nonzero value will make the
           ' fax service send in a discount period
           .DiscountSend = 0

           ' In theory, the TSID is the Fax sender ID printed
           ' on the fax, i.e. typically your contact fax number,
           ' but the value set up in the fax service appears to
           ' override any value set here.
           '.Tsid = ""
         End With

         ' Now send the thing. We don't actually do anything
         ' with the ID except check it is nonzero

         lJobID = oFaxDoc.Send()
         Set oFaxDoc = Nothing
       End If
     End If
     ' move to the next record
     lSourceRecord = lSourceRecord + 1
   Loop
 End With

 ' All done. Restore the previous printer
 ' if necessary. You may need to tweak this
 If Left(sActivePrinter, 3) <> sFaxPrinter Then
   oApp.ActivePrinter = sActivePrinter
 End If

 Set oDataFields = Nothing
 Set oMerge = Nothing
 Set oDoc = Nothing

 'Set oApp = Nothing

End If

If bFaxServerAvailable Then
 oFaxServer.Disconnect
 Set oFaxServer = Nothing
End If

End Sub

--
Peter Jamieson - Word MVP

> Is there a way to fax a merged document to each of the
> records/clients.  I generate a 1 page letter to 20
> people.  I want to have my PC to fax the personalized
> letter to each person.  I am unable to get the fax
> service to recognize the fax # for each person.
David Smith - 30 Dec 2003 22:51 GMT
Mr. Jamieson.

I am testing your macro for sending faxes from a mail merge.  So far it works perfectly.  I had only one small problem:  Upon reading your comments within the VBA code, I failed to realize I needed to change the "ufname" into a name of an actual field of my data.  After doing that, all works great so far.  Just thought I'd give you that feedback

A couple questions;

How many merged records have you tested this on?  I have over a thousand I need to send a fax to.

Do you think sending this many will lock up either WinFax, Word, or WinXP?

Hats off to you, this macro is great!

David Smith
Peter Jamieson - 30 Dec 2003 23:33 GMT
> Upon reading your comments within the VBA code, I failed to realize I needed to change the "ufname" into a name of
> an actual field of my data.  After doing that, all works great so far.  Just thought I'd give you that feedback.

OK, thanks very much.

> How many merged records have you tested this on?  I have over a thousand I need to send a fax to.

> Do you think sending this many will lock up either WinFax, Word, or WinXP?

Only small numbers. The feedback in this group concerning macros that
perform multiple merges /to output documents/ suggests that Word does
consume memory or other resources and will eventually hang, but typiclaly it
seems to take several thousand merges before that happens. However, there
are so many possible factors involved (reliability of the fax service
object, complexity of the merge document etc.) I suspect it is impossible to
judge.

IMO as long as you are able to see which record the /last/ successful merge
in the process corresponds to in the event of a failure (which may be
possible simply by checking the fax queue/log)
a. you should be able to restart at the correct point after a failure
b. you should be able to get some idea of how many records you can process
at a time.

That said, personally I would tend to go for an approach where I tried
processing  (say) 10 records, then 100 before leaving the thing going all on
its own.

The macro doesn't need to work via Winfax, although I think it should be
able to.

--
Peter Jamieson - Word MVP

> Mr. Jamieson.
>
> I am testing your macro for sending faxes from a mail merge.  So far it works perfectly.  I had only one small problem:  Upon reading your comments
within the VBA code, I failed to realize I needed to change the "ufname"
into a name of an actual field of my data.  After doing that, all works
great so far.  Just thought I'd give you that feedback.

> A couple questions;
>
[quoted text clipped - 5 lines]
>
> David Smith

Rate this thread:






 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.