在 Word 中使用 VBA 查找和格式化带有上标的序数排名
Using VBA in Word to find and format ordinal ranks with superscript
我在 Microsoft Word 中工作,需要 VBA 查找特定文本并将其格式化为上标。我正在尝试将以下文本格式化为上标,但前提是文本紧跟在数字之后。这是我需要找到的四段文字:
st
nd
路
第
这是一个例子:
Bill 在比赛中排名第一,但紧随其后的是第二名 Steve。
将代码应用于此示例后,第一个的 "st" 将被格式化为上标,但第二个的 "nd" 将保持不变。
下面是我正在使用的代码,但我似乎无法让它工作。
Sub ReplaceOrdinals()
ActiveDocument.Range.Select
Dim regExp As Object
Set regExp = CreateObject("vbscript.regexp")
With regExp
.Pattern = "(?<=[0-9])[dhnrst]{2}"
.Global = True
Selection.Font.Superscript = wdToggle
End With
End Sub
Private Function SuperscriptAll(ByVal where As Range, ByVal pattern As String, ByVal wildcards As Boolean)
Dim true_end As Long
true_end = where.End
With where.Find
.ClearFormatting
.ClearAllFuzzyOptions
Do While .Execute(pattern, MatchWildcards:=wildcards, Forward:=True, Wrap:=wdFindStop)
With .Parent
.MoveStart wdCharacter, 1
.Font.Superscript = True
.SetRange .End, true_end
End With
Loop
End With
End Function
Public Sub ReplaceOrdinals()
SuperscriptAll ActiveDocument.Range, "1st", False
SuperscriptAll ActiveDocument.Range, "2nd", False
SuperscriptAll ActiveDocument.Range, "3rd", False
SuperscriptAll ActiveDocument.Range, "[0-9]th", True
End Sub
我在 Microsoft Word 中工作,需要 VBA 查找特定文本并将其格式化为上标。我正在尝试将以下文本格式化为上标,但前提是文本紧跟在数字之后。这是我需要找到的四段文字:
st nd 路 第
这是一个例子:
Bill 在比赛中排名第一,但紧随其后的是第二名 Steve。
将代码应用于此示例后,第一个的 "st" 将被格式化为上标,但第二个的 "nd" 将保持不变。
下面是我正在使用的代码,但我似乎无法让它工作。
Sub ReplaceOrdinals()
ActiveDocument.Range.Select
Dim regExp As Object
Set regExp = CreateObject("vbscript.regexp")
With regExp
.Pattern = "(?<=[0-9])[dhnrst]{2}"
.Global = True
Selection.Font.Superscript = wdToggle
End With
End Sub
Private Function SuperscriptAll(ByVal where As Range, ByVal pattern As String, ByVal wildcards As Boolean)
Dim true_end As Long
true_end = where.End
With where.Find
.ClearFormatting
.ClearAllFuzzyOptions
Do While .Execute(pattern, MatchWildcards:=wildcards, Forward:=True, Wrap:=wdFindStop)
With .Parent
.MoveStart wdCharacter, 1
.Font.Superscript = True
.SetRange .End, true_end
End With
Loop
End With
End Function
Public Sub ReplaceOrdinals()
SuperscriptAll ActiveDocument.Range, "1st", False
SuperscriptAll ActiveDocument.Range, "2nd", False
SuperscriptAll ActiveDocument.Range, "3rd", False
SuperscriptAll ActiveDocument.Range, "[0-9]th", True
End Sub