我想使用Word Macro将整个文档中的阿拉伯数字“ ٠、١、٢、٣、٤、٥、٦、٧、٨、٩”转换成英文数字吗?

时间:2018-12-21 15:55:51

标签: vba ms-word

我正在处理阿拉伯文文档,但是我面临数字转换问题。因此,我需要一个宏来将阿拉伯数字转换为英文数字。

2 个答案:

答案 0 :(得分:1)

如果要将文档中的所有阿拉伯数字都转换为英语,请按照以下步骤操作:

转到单词选项->高级->选择数字并将其设置为阿拉伯语,您会发现所有数字都更改为英语

enter image description here

enter image description here

enter image description here

答案 1 :(得分:0)

以下两个宏可在选定的范围内转换西数和阿拉伯语/波斯语之间的数字。该代码还提供了从左至右和从右至左书写的数字-所提供的功能可以进行反转。代码中的注释显示了如何更改文本方向以及要使用的源/目标脚本。

Sub WesternNumberToArabic_or_Persian()
Dim Rng As Range, StrTmp As String, i As Long
Set Rng = Selection.Range
With Selection.Range
  With .Find
    .ClearFormatting
    .Forward = True
    .Wrap = wdFindStop
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = True
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Text = "[,.0-9]{1,}"
    .Replacement.Text = ""
    .Execute
  End With
  Do While .Find.Found
    If .InRange(Rng) = False Then Exit Sub
    If .Characters.Last Like "[.,]" Then .End = .End - 1
    ' If the numbers are input right-to-left, use:
    StrTmp = Reverse(.Text)
    ' If the numbers are input left-to-right, use:
    StrTmp = .Text
    For i = 0 To 9
      ' For arabic #s, use
      StrTmp = Replace(StrTmp, Chr(48 + i), ChrW(17632 + i))
      ' For persian #s, use
      StrTmp = Replace(StrTmp, Chr(48 + i), ChrW(1776 + i))
    Next i
    .Text = StrTmp
    .Collapse (wdCollapseEnd)
    .Find.Execute
  Loop
End With
End Sub

Sub Arabic_or_PersianNumberToWestern()
Dim Rng As Range, StrTmp As String, i As Long
Set Rng = Selection.Range
With Selection.Range
  With .Find
    .ClearFormatting
    .Forward = True
    .Wrap = wdFindStop
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = True
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    'For arabic #s, use:
    .Text = "[,." & ChrW(1632) & "-" & ChrW(1641) & "]{1,}"
    'For persian #s, use:
    .Text = "[,." & ChrW(1776) & "-" & ChrW(1785) & "]{1,}"
    .Replacement.Text = ""
    .Execute
  End With
  Do While .Find.Found
    If .InRange(Rng) = False Then Exit Sub
    If .Characters.Last Like "[.,]" Then .End = .End - 1
    ' If the numbers are input right-to-left, use:
    StrTmp = Reverse(.Text)
    ' If the numbers are input left-to-right, use:
    StrTmp = .Text
    For i = 0 To 9
      ' For arabic #s, use:
      StrTmp = Replace(StrTmp, ChrW(1632 + i), Chr(48 + i))
      ' For persian #s, use:
      StrTmp = Replace(StrTmp, ChrW(1776 + i), Chr(48 + i))
    Next i
    .Text = StrTmp
    .Collapse (wdCollapseEnd)
    .Find.Execute
  Loop
End With
End Sub

Function Reverse(StrTmp As String) As String
  If (Len(StrTmp) > 1) Then
    Reverse = Reverse(Mid$(StrTmp, 2)) + Left$(StrTmp, 1)
  Else
    Reverse = StrTmp
  End If
End Function

要使代码在整个文档上运行,请替换:

Dim Rng As Range, StrTmp As String, i As Long
Set Rng = Selection.Range
With Selection.Range

具有:

Dim StrTmp As String, i As Long
With ActiveDocument.Range

并删除:

If .InRange(Rng) = False Then Exit Sub