I got sick and tired of not having the ability to do a word count on a selected portion of text, and I knew there were various macros out there for OpenOffice, so I finally got off my rear and experimented with a few. The problem, as usual, is that the technoids who graciously donate their time and effort tend not to realize that most of us need things explained from the ground up. And that’s ground as in actual ground, terra firma, not somewhere on the third floor.
Anyhow, if you select Tools / Macro -> Macro from the pull-downs, a confusing window will pop up. On the left side, click once on Standard so that the macro will show up in all your text documents, then click on the New button on the right side of the window. A new window will pop up with some Basic in it, just clear it all out and paste in the italicized Basic code below, then save it by selecting File / Save. To run it, select a piece of text, select Tools / Macro -> Macro, highlight acbwc by clicking once on it, then click Run. If you want to get fancy, of course, you can just add that macro to a button or whatever. It’s fast and it works well, and hopefully will be built into the next version of OpenOffice. So, a big thanks to the two Andrews, Brown and Pitonyak.
Once you’ve added the acbwc Word Count macro, here’s how to add a button to run the macro to the toobar:
1. Select Tools/Configure
2. Select Function Bar, then click on the Customize button
3. Click on the + next to OpenOffice.org BASIC Macros
4. Click on the + next to Standard, then again for Module 1
5. Select acbwc, then click on the Add–> button.
6. Select acbwc on the right window, then click the Icons button to give it an icon. Make sure that the checkbox is checked, or it won’t show up on the toolbar.
Sub acbwc
‘ v2.0.1
‘ 5 sept 2003
‘ does footnotes and selections of all sizes
‘ still slow with large selections, but I blame Hamburg 🙂
‘ v 2.0.1 slightly faster with improved cursorcount routine
‘ not unendurably slow with lots of footnotes, using cursors.
‘ acb, June 2003
‘ rewritten version of the
‘ dvwc macro by me and Daniel Vogelheim
‘ september 2003 changed the selection count to use a word cursor for large selections
‘ following hints from Andrew Pitonyak.
‘ this is not perfect, either, largely because move-by-word is erratic.
‘ it will slightly exaggerate the number of words in a selection, counting extra
‘ for paragraph ends and some punctuation.
‘ but it is still much quicker than the old method.
Dim xDoc, xSel, nSelcount
Dim nAllChars
Dim nAllWords
Dim nAllPars
Dim thisrange, sRes
Dim nSelChars, nSelwords, nSel
Dim atext, bigtext
Dim fnotes, thisnote, nfnotes, fnotecount
Dim oddthing,startcursor,stopcursor
xDoc = thiscomponent
xSel = xDoc.getCurrentSelection()
nSelCount = xSel.getCount()
bigText=xDoc.getText()
‘ by popular demand …
fnotes=xdoc.getFootNotes()
If fnotes.hasElements() Then
fnotecount=0
For nfnotes=0 To fnotes.getCount()-1
thisnote=fnotes.getbyIndex(nfnotes)
startcursor=thisnote.getStart()
stopcursor=thisnote.getEnd()
Do While thisnote.getText().compareRegionStarts(startcursor,stopcursor) AND _
startcursor.gotoNextWord(FALSE)
fnotecount=fnotecount+1
Loop
‘ msgbox(startcursor.getString())
‘ fnotecount=fnotecount+stringcount(thisnote.getstring())
‘ fnotecount=fnotecount+CursorCount(thisnote,bigtext)
Next nfnotes
End If
‘ this next “If” works around the problem that If you have made a selection, then
‘ collapse it, and count again, the empty selection is still counted,
‘ which was confusing and ugly
If nSelCount=1 and xSel.getByIndex(0).getString()=”” Then
nSelCount=0
End If
‘ access document statistics
nAllChars = xDoc.CharacterCount
nAllWords = xDoc.WordCount
nAllPars = xDoc.ParagraphCount
‘ initialize counts
nSelChars = 0
nSelWords = 0
‘ the fancy bit starts here
‘ iterate over multiple selection
For nSel = 0 To nSelCount – 1
thisrange=xSel.GetByIndex(nSel)
atext=thisrange.getString()
If len(atext)< 220 Then
nselwords=nSelWords+stringcount(atext)
Else
nselwords=nSelWords+Cursorcount(thisrange)
End If
nSelChars=nSelChars+len(atext)
Next nSel
‘ dialog code rewritten for legibility
If fnotes.hasElements() Then
sRes=”Document count (with footnotes): ” + nAllWords + ” words. ” + chr(13)
sRes= sRes + “Word count without footnotes: ” + str(nAllWords-fnotecount) +_
” words. ” + chr(13)+”(Total: ” +nAllChars +” Chars in ”
Else
sRes= “Document count: ” + nAllWords +” words. ” + chr(13)+”(” + _
nAllChars +” Chars in ”
End If
sRes=sRes + nAllPars +” Paragraphs.)”+ chr(13)+ chr(13)
If nselCount>0 Then
sRes=sRes + “Selected text count: ” + nSelWords + ” words” + chr(13) +_
“(” + nSelChars + ” chars”
If nSelcount=1 Then
sRes=sRes + ” In ” + str(nselCount) + ” selection.)”
Else
REM I don’t know why, but need this adjustment
sRes=sRes + ” In ” + str(nselCount-1) +” selections.)”
End If
sRes=sRes+chr(13)+chr(13)+”Document minus selected:” + chr(13)+_
str(nAllWords-nSelWords) + ” words.” +chr(13) +chr(13)
End If
If fnotes.hasElements() Then
sRes=sRes+”There are “+ str(fnotecount) + ” words in “+ fnotes.getCount() +_
” footnotes.” +chr(13) +chr(13)
End If
msgbox(sRes,64,”acb Word Count”)
End Sub
function Cursorcount(aRange)
‘ acb September 2003
‘ quick count for use with large selections
‘ based on Andrew Pitonyak’s WordCountWordCursor() function
‘ but made cruder, in line with my general tendency.
Dim lnumwords as long
Dim atext
Dim startcursor, stopcursor as object
atext=arange.getText()
lnumwords=0
If not atext.compareRegionStarts(aRange.getStart(),aRange.getEnd()) Then
startcursor=atext.createTextCursorByRange(aRange.getStart())
stopcursor=atext.createTextCursorByRange(aRange.getEnd())
Else
startcursor=atext.createTextCursorByRange(aRange.getEnd())
stopcursor=atext.createTextCursorByRange(aRange.getStart())
End If
Do while aText.compareRegionEnds(startCursor, stopcursor) >= 0 and _
startCursor.gotoNextWord(False)
lnumwords=lnumwords+1
Loop
CursorCount=lnumwords-1
end function
Function stringcount(astring)
‘ acb June 2003
‘ slower, more accurate word count
‘ for use with smaller strings
‘ sharpened up by David Hammerton (http://crazney.net/) in September 2003
‘ to allow those who put two spaces after punctuation to escape their just deserts
Dim nspaces,i,testchar,nextchar
nspaces=0
For i= 1 To len(astring)-1
testchar=mid(astring,i,1)
select Case testchar
Case ” “,chr(9),chr(13)
nextchar = mid(astring,i+1,1)
select Case nextchar
Case ” “,chr(9),chr(13),chr(10)
nspaces=nspaces
Case Else
nspaces=nspaces+1
end select
end select
Next i
stringcount=nspaces+1
end function