简体   繁体   中英

How to convert a letter to superscript in macro (Word)?

I want change a word to superscript in macro.

word 2016.

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting

With Selection.Find
.Text = "7th of every month."
.Replacement.Text = "7^th of every month."
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchAllWordForms = False
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False

End With
Selection.Find.Execute Replace:=wdReplaceAll

End Sub

when i run the macro instead of making "th" as supercript it just create space between "7" and "h"

Result is like this "The meeting is on 7 h of every month." enter image description here

Why don't simply try like this

With Selection.Find
.Text = "7th of every month."
'.Replacement.Text = "7^th of every month."
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchAllWordForms = False
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False

 Do While .Execute
 ActiveDocument.Range(Selection.Range.Start + 1, Selection.Range.Start + 3).Font.Superscript = True
 Loop

End With

Edit: With turning off some word options etc the 8 sec time to process 60 pages and 1240 replacement may be reduced to around 2 seconds. the test code

Sub test2()
Dim Rng As Range, tm As Double
tm = Timer
TurnOnOff False
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting

With Selection.Find
.Text = "7th of every month."
 X = 0
 Do While .Execute
 ActiveDocument.Range(Selection.Range.Start + 1, Selection.Range.Start + 3).Font.Superscript = True
 X = X + 1
 Loop

End With
Debug.Print X, Timer - tm
TurnOnOff True
End Sub
Sub TurnOnOff(OnOff As Boolean)
Application.ScreenUpdating = OnOff
    With Options
    .Pagination = OnOff
    .CheckSpellingAsYouType = OnOff
    .CheckGrammarAsYouType = OnOff
    End With
End Sub

The following code searches for one or two digits, immediately followed by th and superscripts the th . This makes it more flexible than searching the specific string.

It works with a Range rather than a Selection object which will make it faster. The search type is a "wildcard" search.

Sub SuperScript_th_()
    Dim rngFind As Word.Range
    Dim searchText As String
    Dim found As Boolean

    Set rngFind = ActiveDocument.content
    searchText = "[0-9]{1;2}th"
    'searchText = "7th"
    With rngFind.Find
        .Text = searchText
        .MatchWildcards = True
        .wrap = wdFindStop
        found = .Execute
        Do While found
            rngFind.Collapse wdCollapseEnd
            rngFind.MoveStart wdCharacter, -2
            rngFind.Font.Superscript = True
            rngFind.End = ActiveDocument.content.End
            found = .Execute
        Loop
    End With    
End Sub

The ^t is the instruction in Word's Find to insert a TAB (like pressing the Tab-key on the keyboard). That's why the code in the quesiton is inserting space between the 7 the h in the Replacement.Text .

While Word's Find/Replace is able to format text as part of the Replacement, the difficulty here is that

  1. Not all the text being found should be formatted
  2. The entire text needs to be retained

It's not possible to tell Find/Replace to find text, then format only part of it. That's why the Find needs to be separate from the formatting action. If the entire found text needed to be formatted, then Find/Replace alone would work.

There are also no commands in Word's Find/Replace to apply formatting as a "code" in the Replacement.Text string.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM