Option Explicit
Sub PopulateWordFromExcel()
Dim strWordDocPath As String, strWordDocName As String, strWordDocDir As String, strBkMark As String
Dim objWordApp As Object, objWordDoc As Object, objWordBkm As Object, objWordBkmRange As Object
Dim rngCell As Range
On Error Resume Next
Set objWordApp = GetObject(, "Word.Application")
If Err.Number <> 0 Then
Set objWordApp = CreateObject("Word.Application")
End If
On Error GoTo 0
On Error Resume Next
strWordDocPath = ThisWorkbook.Names(CStr("WordPath")).RefersToRange.Value
If Len(strWordDocPath) = 0 Then
strWordDocPath = Range(CStr("WordPath")).Value
End If
On Error GoTo 0
strWordDocName = Replace(strWordDocPath, Left(strWordDocPath, InStrRev(strWordDocPath, Application.PathSeparator)), "")
strWordDocDir = Left(strWordDocPath, InStrRev(strWordDocPath, Application.PathSeparator))
Select Case FileStatus(strWordDocPath)
Case Is = 53
MsgBox "The entered file name..." & vbNewLine & """" & strWordDocName & """" & vbNewLine & "...is invalid." & vbNewLine & "Please check and try again.", vbExclamation, "Populate Word from Excel"
Set objWordApp = Nothing
Exit Sub
Case Is = 70
MsgBox "The document..." & vbNewLine & """" & strWordDocName & """" & vbNewLine & "...is currently open." & vbNewLine & "Please close it and try again.", vbExclamation, "Populate Word from Excel"
Set objWordApp = Nothing
Exit Sub
Case Is = 76
MsgBox "The entered directory path..." & vbNewLine & """" & strWordDocDir & """" & vbNewLine & "...is invalid." & vbNewLine & "Please check and try again.", vbExclamation, "Populate Word from Excel"
Set objWordApp = Nothing
Exit Sub
End Select
Application.ScreenUpdating = False
objWordApp.Visible = True
strBkMark = "ClientName"
For Each rngCell In ThisWorkbook.Names("Names").RefersToRange
Set objWordDoc = objWordApp.Documents.Open(strWordDocPath)
Set objWordBkm = objWordDoc.Bookmarks(strBkMark)
objWordApp.Selection.GoTo What:=-1, Name:=objWordBkm.Name
Set objWordBkmRange = objWordBkm.Range
objWordBkmRange.Text = Replace(objWordBkmRange.Text, objWordBkmRange.Text, rngCell.Text)
With objWordDoc
.Bookmarks.Add strBkMark, objWordBkmRange
.Close -1
End With
FileCopy strWordDocDir & strWordDocName, strWordDocDir & rngCell.Text & ".docx"
Set objWordDoc = Nothing
Next rngCell
Set objWordApp = Nothing
Application.ScreenUpdating = True
MsgBox "Excel data has been copied across to Word.", vbInformation, "Populate Word from Excel"
End Sub
Function FileStatus(strFileName As String) As Long
Dim lngFileNum As Long
Dim lngErr As Long
On Error Resume Next
lngFileNum = FreeFile()
Open strFileName For Input Lock Read As #lngFileNum
Close lngFileNum
FileStatus = Err
On Error GoTo 0
End Function