Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Mike Lewis on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Word Template Merge

Status
Not open for further replies.

Revolution1200

Programmer
Sep 29, 2005
143
GB
Hi All,

The problem is my current code is very slow.

We have multiple word document templates that we use for merging purposes - this is due to people being assigned different letters in the database depending on processing.

We need to merge these into one final document for mailing.

The data for this comes from an excel spreadsheet which has the following format

Field 1 - Letter Identifier to use IE template
Field 2 - Title
Field 3 - Initials
Field 4 - Surname
Field 5 - Address details

An example of the records could be

identifier name address details
template1 test name some address
template2 test name some address 2
template1 test name some address 3

The final merged document will be made up of Template1, template2 and a final template1.

The order has to be the same as the file as this is in UK Royal Mail Mailsort order.

Current Code I have is

Code:
Dim oSR As Word.Range
    Dim oFld As Word.Field
    Dim oRange As Word.Range
    Dim szField() As String
    Dim lState As Long
    Dim mainApplication As Excel.Application
    Dim path As String
    Dim ado, rs
    Dim numLetters As Integer
    Dim loadedLetters As Integer
    Dim change As Boolean
    Dim newData As String
    Dim oMySR As Word.Range
    Dim oMyField As Word.Field
    Dim currRecord As Long
    Dim i As Integer
        
    'open our spreadsheet and get a count of distinct letters used
    path = "C:\N_LET0304_356.xls"
    Set ado = CreateObject("ADODB.Connection")
    ado.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path & ";Extended Properties=Excel 8.0;Persist Security Info=False"
    ado.Open
    Set rs = ado.Execute("SELECT Distinct LETTER FROM [N_LET0304_356$]")
    numLetters = 0
    While Not rs.EOF
        numLetters = numLetters + 1
        rs.MoveNext
    Wend
    rs.Close
    
    'create our word application
    Set wordapp = New Word.Application
    Do While wordapp = ""
        Set wordapp = New Word.Application
        i = i + 1
        If i = 5 Then
            MsgBox "Error creating word object - form will close"
        End If
    Loop
    
    'for testing
    wordapp.Visible = False
    wordapp.ScreenUpdating = False
    
    'now load our letter templates that we require
    ReDim doc2(numLetters)
    loadedLetters = 0
    Set rs = ado.Execute("SELECT DISTINCT LETTER FROM [N_LET0304_356$]")
    While Not rs.EOF
        Set doc2(loadedLetters) = wordapp.Documents.Open(fileName:="C:\Dayend Letters\" & rs.Fields(0) & ".doc", _
            ConfirmConversions:=False, ReadOnly:=False, AddToRecentFiles:=False, _
            PasswordDocument:="", PasswordTemplate:="", Revert:=False, _
            WritePasswordDocument:="", WritePasswordTemplate:="", Format:= _
            wdOpenFormatAuto)
            
        rs.MoveNext
    Wend
    rs.Close
    Set rs = Nothing
    
    'for testing
    wordapp.Visible = False
    
    Set doc1 = wordapp.Documents.Add
    Set doc3 = wordapp.Documents.Add
    currRecord = 1
    Label4.Caption = CStr(currRecord)
    
    'ok our main loop - run through the records
    Set rs = ado.Execute("SELECT * FROM [N_LET0304_356$]")
    While Not rs.EOF
            
        'delete any text currently in our working document
        wordapp.Windows("Document2").Activate
        wordapp.Selection.WholeStory
        wordapp.Selection.TypeBackspace
        wordapp.Selection.TypeBackspace
        wordapp.Selection.Delete Unit:=wdCharacter, count:=1
        
        'now we need to select the correct template and copy the details to Doc3 ready to setup the merge
        wordapp.Windows(CStr(Trim(rs.Fields(0)) & ".doc")).Activate
        wordapp.Selection.WholeStory
        wordapp.Selection.Copy
        wordapp.Windows("Document2").Activate
        wordapp.Selection.PasteAndFormat (wdPasteDefault)
        wordapp.Selection.TypeBackspace

        'this section adds our details
        'For Each oSR In doc3.StoryRanges
        Set oSR = doc3.StoryRanges(1)
        
            For Each oFld In oSR.Fields
                  
            ' the "wordfield.code" is in the format "MERGEFIELD fieldname". Use the
            ' SPLIT command (with space as the field delimeter) to put the two or more values
            ' into an array, and the merge field name will be in element 2 of the
            ' array.
            
            If (Left(oFld.Code, Len(" MERGEFIELD")) = " MERGEFIELD") Then
                szField = Split(oFld.Code, " ")
                change = False
                newData = ""
                szField(2) = Replace(szField(2), Chr(34), "", , , vbBinaryCompare)
                Select Case LCase(szField(2))
                    Case "title"
                        change = True
                        newData = rs.Fields(1) & vbNullString
                    Case "initials"
                        change = True
                        newData = rs.Fields(2) & vbNullString
                    Case "surname"
                        change = True
                        newData = rs.Fields(3) & vbNullString
                    Case "a1"
                        change = True
                        newData = rs.Fields(4) & vbNullString
                    Case "a2"
                        change = True
                        newData = rs.Fields(5) & vbNullString
                    Case "a3"
                        change = True
                        newData = rs.Fields(6) & vbNullString
                    Case "a4"
                        change = True
                        newData = rs.Fields(7) & vbNullString
                    Case "a5"
                        change = True
                        newData = rs.Fields(8) & vbNullString
                    Case "a6"
                        change = True
                        newData = rs.Fields(9) & vbNullString
                    Case "a7"
                        change = True
                        newData = rs.Fields(10) & vbNullString
                    Case "ref1"
                        change = True
                        newData = rs.Fields(11) & vbNullString
                    Case "ref2"
                        change = True
                        newData = rs.Fields(12) & vbNullString
                    Case "ref3"
                        change = True
                        newData = rs.Fields(13) & vbNullString
                End Select
                
                If change Then
                    oFld.Select
                    Set oRange = wordapp.Selection.Range
                    'oRange.Text = Format(Date, "DD MMMM YYYY")
                    oRange.Text = newData
                End If
            End If
            Next
        'Next
        
        'now copy all the data over to the bottom of doc1
        wordapp.Selection.WholeStory
        wordapp.Selection.Copy
        wordapp.Windows("Document1").Activate
        wordapp.Selection.PasteAndFormat (wdPasteDefault)
        wordapp.Selection.TypeBackspace
        wordapp.Selection.InsertBreak Type:=wdPageBreak
        
        rs.MoveNext
        currRecord = currRecord + 1
        Label4.Caption = CStr(currRecord)
    Wend
    
    rs.Close
    Set rs = Nothing
    ado.Close
    Set ado = Nothing
 
    wordapp.Windows("Document1").Activate
    wordapp.ActiveDocument.SaveAs "C:\testfile.doc"
 
    wordapp.Quit False
    Set wordapp = Nothing

Can anyone suggest a quicker way of doing this?

Cheers

Stuart



The problem is that this is very slow, is there a better way of doing this?
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top