布拉德利(Bradley)的文档在文本中包含许多罗马数字。他需要一种简单的方法来将这数千个罗马数字更改为阿拉伯数字。

这些不是任何性质的领域;它们只是在文本中键入为罗马数字。他想知道是否有一种方法可以轻松地将其更改为阿拉伯语版本。

不幸的是,Word中没有将罗马数字转换为阿拉伯数字的功能。您可以根据需要简单地使用“查找和替换”来搜索罗马数字,但是您必须对每个数字进行单独的搜索。您可以使用通配符搜索来搜索完全由大写罗马数字组成的单词,这将使搜索变得相当容易。您需要做的就是搜索“ <[CDILMVX] \ {1,}>”(不带引号),并确保已选中“使用通配符”复选框。当您单击“查找下一个”时,将找到下一个罗马数字,然后您可以手动将其更改为阿拉伯数字。

尝试进行转换的另一种方法是使用宏。您可以创建一个宏来查看文档中的每个单词,然后尝试确定它是否适合由罗马数字组成。但是,您可能会得到一些误报,特别是如果您的文档中包含的首字母缩写词可能会混淆为罗马数字。 (例如,如果您对信用卡使用首字母缩写CC,则可以将其视为200的罗马数字。)

下面的宏集将逐步浏览文档中的每个单词,如果单词仅包含罗马数字(I,V,X,L,C,D和M),则会询问用户是否应将宏转换为数字。

Sub ConvertRoman()

Dim wrdX     Dim wrd As String     Dim tstSW As Boolean     Dim J As Long

For Each wrdX In ActiveDocument.Words         wrd = UCase(Trim(wrdX))

If wrd = "" Or wrd = "I" Or wrd = vbCr Then             tstSW = False         Else             tstSW = True         End If         For J = 1 To Len(wrd)

If InStr("MDCLXVI",Mid(wrd, J, 1)) = 0 Then                 tstSW = False                 Exit For             End If         Next J

If tstSW Then             wrdX.Select             Selection.MoveLeft unit:=wdCharacter, _               Count:=Len(wrdX) - Len(wrd), _               Extend:=wdExtend             J = MsgBox("Convert " & wrd & " to Arabic", vbYesNoCancel)

If J = vbCancel Then Exit Sub             If J = vbYes Then Selection.TypeText Text:=RomanToArabic(wrd)

End If     Next wrdX End Sub
Function RomanToArabic(Rm As String) As String     Dim J As Long     Dim ab As Long     Dim cc As Long     Dim dd As Long

ab = 0     Rm = Trim(Rm)

J = 1     Do         cc = GetValue(Mid(Rm, J, 1))

dd = GetValue(Mid(Rm, J + 1, 1))

If cc < dd Then             ab = ab + dd - cc             J = J + 1         Else             ab = ab + cc         End If         J = J + 1     Loop Until J >= Len(Rm)

If J = Len(Rm) Then         ab = ab + GetValue(Mid(Rm, J, 1))

End If     RomanToArabic = Trim(Str(ab))

End Function
Function GetValue(ss As String) As Long     Dim Cde()

Dim Cvalue()

Dim J As Long

Cde = Array("M", "D", "C", "L", "X", "V", "I")

Cvalue = Array(1000, 500, 100, 50, 10, 5, 1)



For J = 0 To 6         If ss = Cde(J) Then             GetValue = Cvalue(J)

Exit Function         End If     Next J     GetValue = 999999 End Function

由于大写的I是文本中非常常见的词,因此宏不会停止在每个宏上以确定是否应该进行转换。

但是,如果大写字母I是仅由罗马数字(例如XLVII)组成的较长单词的一部分,则将其视为转换的候选对象。宏还假定您所有的罗马数字均为大写。

注意:

如果您想知道如何使用此页面(或_WordTips_网站上的任何其他页面)中描述的宏,我准备了一个包含有用信息的特殊页面。

_WordTips_是您进行经济有效的Microsoft Word培训的来源。

(Microsoft Word是世界上最流行的文字处理软件。)本技巧(5943)适用于Microsoft Word 2007、2010、2013、2016、2019和Office 365中的Word。 Word的旧菜单界面在这里: