بردلی سندی دارد که در متن آن اعداد رومی زیادی وجود دارد. او به یک راه آسان برای تغییر این هزاران عدد رومی به عربی نیاز دارد. اینها هیچ ماهیتی ندارند. آنها به سادگی در متن به صورت اعداد رومی تایپ می شوند. او از خود می پرسد که آیا راهی برای تغییر آسان آنها به معادل های عربی خود وجود دارد؟
متأسفانه هیچ تابعی در Word وجود ندارد که اعداد رومی را به عربی تبدیل کند. اگر بخواهید می توانید به سادگی از Find and Replace برای جستجوی اعداد رومی استفاده کنید، اما باید برای هر یک جستجوی جداگانه انجام دهید. برای جستجوی کلمه ای که کاملاً از اعداد رومی بزرگ تشکیل شده است، می توانید از جستجوی کارت وحشی استفاده کنید، که جستجو را کمی آسان تر می کند. تنها کاری که باید انجام دهید این است که «<[CDILMVX]{1,}>» (بدون علامت نقل قول) را جستجو کنید و مطمئن شوید که کادر انتخاب Use Wild Cards را انتخاب کرده اید. وقتی روی Find Next کلیک می کنید، عدد رومی بعدی قرار می گیرد و سپس می توانید آن را به صورت دستی به معادل عربی خود تغییر دهید.
راه دیگری برای تلاش برای انجام تبدیل، استفاده از ماکرو است. میتوانید یک ماکرو ایجاد کنید که به هر کلمه در سند شما نگاه میکند و سعی میکند تعیین کند که آیا این کلمه کاندیدای متشکل از اعداد رومی است یا خیر. اگرچه ممکن است برخی از موارد مثبت کاذب دریافت کنید، به خصوص اگر سند شما حاوی کلمات اختصاری باشد که ممکن است با اعداد رومی اشتباه گرفته شود. (به عنوان مثال، اگر از مخفف 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)، آنگاه کاندیدای تبدیل در نظر گرفته می شود. ماکروها همچنین فرض می کنند که تمام اعداد رومی شما بزرگ هستند.