我正在处理阿拉伯文文档,但是我面临数字转换问题。因此,我需要一个宏来将阿拉伯数字转换为英文数字。
答案 0 :(得分:1)
答案 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