Phone (01457) 858877 or email
Even if you're writing Visual Basic macros within Excel, there's nothing to stop you inserting text into Word documents, manipulating PowerPoint slides or sending Outlook emails. This blog explains how to reference other applications, and write macros in Excel to link to other Microsoft Office software
This blog is part of a complete Excel VBA tutorial. You can also learn to program in VBA on one of our VBA macros courses.
To get our program to work, we first need to create a reference to a new instance of Word, then use this to create a document. Finally, we need to loop over our cells typing the values of each into this new Word document.
The first thing to do is to create a reference to a new Word application in memory. We'll store this reference in a variable. You can do this in one of two ways. The first way is easier to understand:
'create a variable to refer to a copy of Word
Dim WordApp As Word.Application
'now set this variable to refer to a new app
Set WordApp = New Word.Application
However, the second way is easier to write:
'set variable to refer to a a new copy of Word
Dim WordApp As New Word.Application
So which is better? The short answer is the second one, I think, because it's simpler - but it does have implications. What follows is a fairly technical summary of what these are.
Consider the following line of code:
'set variable to refer to a a new copy of Word
Dim WordApp As New Word.Application
This does not set the variable to a reference to Word, it just means that the variable will be set to a reference to Word the first time that it is used. There are two small disadvantages to this:
IMHO you don't need to worry about this, but at the owlery we try not to gloss over things!
The next thing to do is to make sure that you can see the copy of Word:
'make sure this copy of Word is visible
WordApp.Visible = True
You might be wondering why this is necessary. When you create a copy of an application in VBA, it isn't automatically visible. Had you missed out this line, you would have had to press ALT + CTRL + DEL to list out running processes to close it down:

Select the running copy of MS Word - called WINWORD.EXE - and end the process.
Note that the copy of Word you've created programmatically will NOT show up in the Applications tab of this dialog box.
Once you have created a copy of Word within memory, you can run commands within this. Here is what our full macro could look like:
Sub ListJugglersInWord()
'set variable to refer to a new copy of Word
Dim WordApp As New Word.Application
'make sure this copy of Word is visible
WordApp.Visible = True
'create a new document in this
Dim doc As Word.Document
Set doc = WordApp.Documents.Add
'loop over all of the jugglers
Dim JugglerRange As Range
Dim JugglerCell As Range
Set JugglerRange = Range( _
Range("A1"), Range("A1").End(xlDown))
For Each JugglerCell In JugglerRange
'for this juggler, write name into Word
WordApp.Selection.TypeText JugglerCell.Value
WordApp.Selection.TypeParagraph
Next JugglerCell
MsgBox "You should now see your jugglers in Word!"
End Sub
The commands to type information into Word are:
'for this juggler, write name into Word
WordApp.Selection.TypeText JugglerCell.Value
WordApp.Selection.TypeParagraph
It is vital that you include the WordApp object at the start of every Word VBA command, as explained below.
Supposing that you had missed out the WordApp object from the 2 lines shown above, to get:
'for this juggler, write name into Word
Selection.TypeText JugglerCell.Value
Selection.TypeParagraph
This will not compile or run - here's why. When Excel sees the word Selection, it tries to find this in its list of referenced object libraries:

Excel will start from the top and work its way down in order. It will find the word Selection within the Excel object library before it finds it within the Word one, and so assume that this is a built-in Excel object.
Because Excel is above Word in the list of references, the compiler will assume that Selection refers to the currently selected cells in Excel, and complain loudly that you can not apply the TypeText method to an Excel range:

The error message you will get if you try to run the macro without prefixing the Word Selection object.
In theory you could change the order of the references to put Word above Excel, but apart from being terrible practice - after all, you're coding within Excel - this isn't actually possible (you get an error message if you try to demote Excel in the references list).
Now we've got all of the theory out of the way, let's look at a worked example of how to get an Excel workbook to fill in a Word form.
Even if you're writing Visual Basic macros within Excel, there's nothing to stop you inserting text into Word documents, manipulating PowerPoint slides or sending Outlook emails. This blog explains how to reference other applications, and write macros in Excel to link to other Microsoft Office software
This blog is part of a complete Excel VBA tutorial. You can also learn to program in VBA on one of our VBA macros courses.
Comments on this blog
This blog has 5 comments:
Thanks for those thoughts, and glad you liked the blog!
Hi guys
First of all thank for the admin for the greatest post, even though it seems small thing for him but for who needs it, it is a greatest thing :-) - THANKS A LOT!!!!:-)
For those who want to export word to pdf using excel vba here is the code - It will help for those who search lot because I did.
Just simple modification:
MODIFIED CODE
doc.ExportAsFixedFormat FilePath & "person " & PersonCell.Value & ".pdf", wdExportFormatPDF
doc.Close False
ORIGINAL CODE
doc.SaveAs2 FilePath & "person " & PersonCell.Value & ".docx"
doc.Close
_____________________________________________________
HERE IS THE COMPLETE CODE OF IT
Option Explicit
'change this to where your files are stored
Const FilePath As String = "C:\Documents and Settings\thiruselvam\Desktop\Macro\exit interview\"
Dim wd As New Word.Application
Dim PersonCell As Range
Sub CreateWordDocuments()
'create copy of Word in memory
Dim doc As Word.Document
wd.Visible = True
Dim PersonRange As Range
'create a reference to all the people
Range("A1").Select
Set PersonRange = Range(ActiveCell, ActiveCell.End(xlDown))
'for each person in list �
For Each PersonCell In PersonRange
'open a document in Word
Set doc = wd.Documents.Open(FilePath & "Word form.docx")
'go to each bookmark and type in details
CopyCell "FirstName", 1
CopyCell "LastName", 2
CopyCell "Company", 3
'save and close this document
doc.ExportAsFixedFormat FilePath & "person " & PersonCell.Value & ".pdf", wdExportFormatPDF
doc.Close False
Next PersonCell
wd.Quit
MsgBox "Created files in " & FilePath & "!"
End Sub
Sub CopyCell(BookMarkName As String, ColumnOffset As Integer)
'copy each cell to relevant Word bookmark
wd.Selection.GoTo What:=wdGoToBookmark, Name:=BookMarkName
wd.Selection.TypeText PersonCell.Offset(0, ColumnOffset).Value
End Sub
Thanks
Thiru
Thanks for that, Thiru.
I'm not sure, but I think your problem may be that you're creating a new Word application in the declarations section of the module. Try first changing the variable declaration to:
Dim wd As Word.Application
Then in your CreateDocuments procedure, add the line:
Set wd = New Word.Application
It will then create a new Word application whenever you run the program. I can't think of anything else which might cause this problem.