Please Note: This article is written for users of the following Microsoft Word versions: 97, 2000, 2002, and 2003. If you are using a later version (Word 2007 or later), this tip may not work for you. For a version of this tip written specifically for later versions of Word, click here: Running Macros Based on Keywords.
by Allen Wyatt
(last updated August 17, 2017)
Eyal wonders if there is any way to run a macro automatically if a user types in a particular word or phrase.
Unfortunately, there are no Word VBA event procedures that will detect when text is typed into a document. However, Word internally detects when a complete word is entered so that it can carry out such things as spell checking, AutoCorrect, and updating the word count. You cannot tap into this internal detection method, however.
Probably the best approach is to use VBA's timer capability to check whether a word has been entered. (Remember—Word internally updates the word count every time a word is completed, so your timer code can monitor the word count to see if it has changed.) The OnTime method has a minimum setting of one second, which means that your timer-based code can only run once per second. It is possible for a fast typist to type more than one word per second, so your code needs to actually check the last few words entered.
Here is the code you can use:
Dim wCount As Long Dim aRange As Range Dim tWords Dim inactiveSW As Boolean Sub InitializeTimer() tWords = Array("APPLE", "ORANGE", "PEAR") wCount = ActiveDocument.Words.Count Set aRange = Selection.Range aRange.Start = ActiveDocument.Range.Start inactiveSW = False StartTimer End Sub
Public Sub StartTimer() Application.OnTime When:=Now + TimeValue("00:00:01"), _ Name:="TestWords" End Sub
Public Sub TestWords() Dim testWord As String Dim i As Long Dim k As Long Dim kw As Long Dim xc As Long If inactiveSW Then Exit Sub With ActiveDocument xc = .Range.Words.Count - wCount If xc > 0 And xc < 5 Then aRange.End = Selection.End kw = aRange.Words.Count - 1 If kw > 0 Then For k = kw - xc + 1 To kw testWord = UCase(Trim(aRange.Words(k).Text)) For i = 0 To UBound(tWords) If testWord = tWords(i) Then mysub (testWord) Exit For End If Next i Next k End If End If wCount = .Range.Words.Count End With StartTimer End Sub
Public Sub KillOnTime() 'cannot stop the timer so set inactive switch inactiveSW = True End Sub
Sub mysub(s As String) ' this subroutine is executed when a special word is entered MsgBox s End Sub
The first routine you need to run is the InitializeTimer macro. It sets up the variables that are necessary before actually starting the OnTime method. It then calls the StartTimer macro which actually sets the timer that runs the TestWords macro.
TestWords checks to see if the word count has increased and, if it has, it checks the last five words entered to see if they match any of your trigger words. (The trigger words are set in the tWords array, in the InitializeTimer macro. They should be entered in the array all in uppercase.) If a trigger word is detected, then your code (mysub) is executed, and the trigger word is passed to your code.
It should be noted that it may be possible for the word count to jump by more than five, particularly if text is pasted into the document. If you want the code to check all words that may be pasted into the document, then you'll need to change the checking code line, which is this:
If xc > 0 And xc < 5 Then
All you need to do is change it to this:
If xc > 0 Then
If you want to stop the word checking, run the KillOnTime macro, which sets a flag that stops the words from being checked. To later restart checking, just run InitializeTimer again.
WordTips is your source for cost-effective Microsoft Word training. (Microsoft Word is the most popular word processing software in the world.) This tip (12374) applies to Microsoft Word 97, 2000, 2002, and 2003. You can find a version of this tip for the ribbon interface of Word (Word 2007 and later) here: Running Macros Based on Keywords.
Learning Made Easy! Quickly teach yourself how to format, publish, and share your content using Word 2013. With Step by Step, you set the pace, building and practicing the skills you need, just when you need them! Check out Microsoft Word 2013 Step by Step today!
When you are printing a document, it is not unusual to see messages (dialog boxes) periodically. When you want the printing ...Discover More
If you store information within a variable array, at some point in your macro you may want to get rid of that information. ...Discover More
Part of developing macros is learning how to use and manipulate variables. This tip examines a technique you can use to ...Discover More
FREE SERVICE: Get tips like this every week in WordTips, a free productivity newsletter. Enter your address and click "Subscribe."
Got a version of Word that uses the menu interface (Word 97, Word 2000, Word 2002, or Word 2003)? This site is for you! If you use a later version of Word, visit our WordTips site focusing on the ribbon interface.