A goodly while back someone, somewhere, asked me if there was a workaround for this and I said I'd get back to 'em. Problem is I can't remember where the question was asked, so I'm just going to post it here and hope they read the blog…
There's an easy way, in VBA, to tell if a selected string in a Microsoft Word document is a number:
If IsNumeric(Selection) = True Then
MsgBox "It's a number"
MsgBox "It's not a number"
(It will count strings with commas and/or full-stops* (used as decimal points) in them as numbers provided everything else is a digit.)
* That's "periods" to some of you strange foreign types.
Unfortunately there's no equivalent method for telling if a string contains nothing but letters, and that's the workaround I was asked for. Well, my first thought was something like this:
Sub Sub IsABC()
If Selection.Range.Case = wdLowerCase Or _
Selection.Range.Case = wdTitleWord Then MsgBox "All letters"
… but with a complete list of possible cases instead of just the two in that example. Unfortunately, it turns out that provided the selection includes letters, it'll quite happily report spaces, commas, hyphens etc and even numbers, as being letters. Select one of those things on its own however, and it won't do so—which does leave us with the option of checking character-by-character. So here's my workaround. It ain't pretty, but it does do the job asked of it:
Dim iSelected As Integer
iSelected = Len(Selection)
iCount = 0
Do While iCount < iSelected
iCount = iCount + 1
If Selection.Range.Characters.Last.Case = wdUpperCase = False And _
Selection.Range.Characters.Last.Case = wdLowerCase = False Then
Selection.moveend unit:=wdCharacter, Count:=iCount - 1
MsgBox "Not all letters"
Selection.moveend unit:=wdCharacter, Count:=-1
Selection.MoveRight unit:=wdCharacter, Count:=iSelected, Extend:=wdExtend
MsgBox "All letters"
All it does is check the final character in the selection, then shrink the selection by one character and check again, until it either runs into something that's not upper or lower case (i.e., not a letter)—in which case it reselects the characters it's deselected and reports that the selection is "Not all letters"—or until it runs out of things to check, in which case it reselects the whole lot and reports that the selection is indeed "All letters." (Presumably, in actual use, it would make a Boolean true or false. I didn't ask what it was wanted for.)
Anyways, that's me lot. As ever, I hope this will be of help to somebody.
You may use these HTML tags in comments
<a href="" title=""></a> <abbr title=""></abbr>
<acronym title=""></acronym> <blockquote></blockquote> <del></del>* <strike></strike>† <em></em>* <i></i>† <strong></strong>* <b></b>†
* is generally preferred over †