Tell a friend Print this page Bookmark this page

Help For MS Word - Word Frequency Macro

Help For MS Word - Word Frequency Macro

There apparently is some confusion concerning the procedure for using the Word Frequency marco. To help get it working for you, I've listed the way I use for patching macros into MS Word.

Also, if anyone has tried to contact me through my web sites, they are not lost. I'm in the process of designing and building them. I would have liked to pay someone else to do it like many people do, but I can't afford it right now. Self-publishing tends to be a bit expensive. I'm sorry for any inconvenience or frustration the macro might or my web sites might have caused anyone. I hope to have them up and running soon.

Try this procedure for using this macro. I have tested it and it works fine with Word 2000. If you have a different version of Word, you may have to adjust the procedure to work with your version.

1. Open the Macro box. That's "Tools>Marco>Macros."

2. When the Macros window pops up, clear the window for "Macro Name:" and enter what you want to call the macro. I called it, "WordFrequency1"

3. Click "Create." This will create a blank macro.

4. Click on "WordFrequency1" then "Edit." The "MicroSoft Visual Basic - Normal" editor will pop up.

5. Under "' WordFrequency1 Marco" (if that's what you called it,) and your name, paste the entire macro program from "Const maxwords = 20000" including "" different words ", vbOKOnly, "Finished")" to the end just before "End Sub."

6. In the "MicroSoft Visual Basic - Normal File" menu, click "Close and Return to MicroSoft Word."

7. Return to the Macro window, highlight the "WordFrequency1" macro and click "Run." It will open a new Word document, count the words for you and list the totals. Keep in mind that you must have a document with words loaded into Word so it will have something to count. If you still have errors, please consult your Word manual. You may not be entering the program properly.

Good luck and please let me know how it worked out for you. If you still have errors, please be specific what the kind of error it is. The errors are shown in red in the "MicroSoft Visual Basic - Normal" editor.

Sincerely,
John Patrick Lamont

www.JPatrickLamont.com
www.SumOfLifeBooks.com

Here's a copy for reference directly from my Word macros:

Sub WordFrequency1()
'
' WordFrequency1 Macro
Const maxwords = 20000 'Maximum unique words allowed
Dim SingleWord As String 'Raw word pulled from doc
Dim Words(maxwords) As String 'Array to hold unique words
Dim Freq(maxwords) As Integer 'Frequency counter for unique words
Dim WordNum As Integer 'Number of unique words
Dim ByFreq As Boolean 'Flag for sorting order
Dim ttlwds As Long 'Total words in the document
Dim Excludes As String 'Words to be excluded
Dim Found As Boolean 'Temporary flag
Dim j, k, l, Temp As Integer 'Temporary variables
Dim ans As String 'How user wants to sort results
Dim tword As String '

' Set up excluded words
Excludes = "[the][a][of][is][to][for][by][be][and][are]"

' Find out how to sort
ByFreq = True
ans = InputBox("Sort by WORD or by FREQ?", "Sort order", "WORD")
If ans = "" Then End
If UCase(ans) = "WORD" Then
ByFreq = False
End If

Selection.HomeKey Unit:=wdStory
System.Cursor = wdCursorWait
WordNum = 0
ttlwds = ActiveDocument.Words.Count

' Control the repeat
For Each aword In ActiveDocument.Words
SingleWord = Trim(LCase(aword))
'Out of range?
If SingleWord < "a" Or SingleWord = "z" Then
SingleWord = ""
End If
'On exclude list?
If InStr(Excludes, "[" & SingleWord & "]") Then
SingleWord = ""
End If
If Len(SingleWord) > 0 Then
Found = False
For j = 1 To WordNum
If Words(j) = SingleWord Then
Freq(j) = Freq(j) + 1
Found = True
Exit For
End If
Next j
If Not Found Then
WordNum = WordNum + 1
Words(WordNum) = SingleWord
Freq(WordNum) = 1
End If
If WordNum > maxwords - 1 Then
j = MsgBox("Too many words.", vbOKOnly)
Exit For
End If
End If
ttlwds = ttlwds - 1
StatusBar = "Remaining: " & ttlwds & ", Unique: " & WordNum
Next aword

' Now sort it into word order
For j = 1 To WordNum - 1
k = j
For l = j + 1 To WordNum
If (Not ByFreq And Words(l) < Words(k)) _
Or (ByFreq And Freq(l) > Freq(k)) Then k = l
Next l
If k <> j Then
tword = Words(j)
Words(j) = Words(k)
Words(k) = tword
Temp = Freq(j)
Freq(j) = Freq(k)
Freq(k) = Temp
End If
StatusBar = "Sorting: " & WordNum - j
Next j

' Now write out the results
tmpName = ActiveDocument.AttachedTemplate.FullName
Documents.Add Template:=tmpName, NewTemplate:=False
Selection.ParagraphFormat.TabStops.ClearAll
With Selection
For j = 1 To WordNum
.TypeText Text:=Trim(Str(Freq(j))) _
& vbTab & Words(j) & vbCrLf
Next j
End With
System.Cursor = wdCursorNormal
j = MsgBox("There were " & Trim(Str(WordNum)) & _
" different words ", vbOKOnly, "Finished")
End Sub