در یک نگاه
- اکسل تابع داخلی عدد به حروف فارسی ندارد؛ با یک تابع کوتاه VBA این کار ممکن است.
- تابع یک بار در Module نوشته میشود و مانند هر فرمول دیگری در سلول به کار میرود.
- برای یک یا چند مبلغ بدون اکسل، ابزار آنلاین عدد به حروف همین سایت قابل استفاده است.
در فاکتور، چک، رسید و قرارداد، مبلغ باید علاوه بر عدد به حروف نیز نوشته شود. نوشتن دستی آن در هر سند هم وقتگیر است و هم احتمال اختلاف میان عدد و حروف را بالا میبرد. اکسل برای این کار تابع داخلی فارسی ندارد، اما با یک تابع کوتاه VBA میتوان فرمولی ساخت که مانند SUM در هر سلول به کار رود.
قاعدهٔ نوشتن عدد به حروف
عدد از سمت راست سهرقمسهرقم جدا میشود. هر گروه سهرقمی جداگانه خوانده میشود، نام مرتبهٔ آن (هزار، میلیون، میلیارد) به آن افزوده میشود و گروهها با «و» به هم وصل میشوند. گروههای صفر خوانده نمیشوند.
| عدد | به حروف |
|---|---|
| ۱۰۵ | یکصد و پنج |
| ۲۰۰٬۰۱۹ | دویست هزار و نوزده |
| ۱٬۵۰۰٬۰۰۰ | یک میلیون و پانصد هزار |
| ۱۲٬۰۰۰٬۰۵۰ | دوازده میلیون و پنجاه |
در اسناد مالی و چک، صدگان معمولاً به صورت «یکصد» نوشته میشود و کد زیر نیز همین صورت را به کار میبرد.
گام ۱: باز کردن ویرایشگر VBA
- فایل را با پسوند
.xlsm(کارپوشهٔ ماکرودار) ذخیره نمایید. - کلید
Alt+F11را بزنید تا ویرایشگر VBA باز شود. - از منوی
InsertگزینهٔModuleرا انتخاب کنید.
گام ۲: کد تابع
کد زیر را بهطور کامل در Module جدید قرار دهید:
Function AdadBeHorouf(ByVal n As Variant) As String
Dim yekan, dah, dahgan, sadgan, vahed
Dim s As String, part As String, i As Integer, g As Integer, groups As Integer
yekan = Array("", "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه")
dah = Array("ده", "یازده", "دوازده", "سیزده", "چهارده", "پانزده", "شانزده", "هفده", "هجده", "نوزده")
dahgan = Array("", "", "بیست", "سی", "چهل", "پنجاه", "شصت", "هفتاد", "هشتاد", "نود")
sadgan = Array("", "یکصد", "دویست", "سیصد", "چهارصد", "پانصد", "ششصد", "هفتصد", "هشتصد", "نهصد")
vahed = Array("", " هزار", " میلیون", " میلیارد", " تریلیون")
s = Format(Fix(Abs(n)), "0")
If s = "0" Then AdadBeHorouf = "صفر": Exit Function
Do While Len(s) Mod 3 <> 0: s = "0" & s: Loop
groups = Len(s) \ 3
If groups > 5 Then AdadBeHorouf = "عدد بیش از حد بزرگ است": Exit Function
For i = 1 To groups
g = CInt(Mid(s, (i - 1) * 3 + 1, 3))
If g > 0 Then
part = SeRaqam(g, yekan, dah, dahgan, sadgan) & vahed(groups - i)
AdadBeHorouf = VaJoin(AdadBeHorouf, part)
End If
Next i
End Function
Private Function SeRaqam(ByVal g As Integer, yekan, dah, dahgan, sadgan) As String
Dim r As Integer, t As String
If g \ 100 > 0 Then t = sadgan(g \ 100)
r = g Mod 100
If r >= 10 And r < 20 Then
t = VaJoin(t, dah(r - 10))
Else
If r \ 10 > 0 Then t = VaJoin(t, dahgan(r \ 10))
If r Mod 10 > 0 Then t = VaJoin(t, yekan(r Mod 10))
End If
SeRaqam = t
End Function
Private Function VaJoin(ByVal a As String, ByVal b As String) As String
If a = "" Then VaJoin = b Else VaJoin = a & " و " & b
End Functionعملکرد کد: عدد به متن تبدیل و از سمت چپ با صفر کامل میشود تا طول آن مضرب سه شود. سپس هر گروه سهرقمی با تابع SeRaqam خوانده میشود، نام مرتبه به آن افزوده میشود و گروهها با تابع VaJoin با «و» به هم وصل میشوند.
گام ۳: استفاده در برگه
پس از بستن ویرایشگر، تابع مانند هر فرمول دیگری در دسترس است. اگر مبلغ در سلول A2 باشد:
| سلول | فرمول | نتیجه برای ۱٬۵۰۰٬۰۰۰ |
|---|---|---|
| B2 | =AdadBeHorouf(A2) | یک میلیون و پانصد هزار |
| C2 | =AdadBeHorouf(A2)&" ریال" | یک میلیون و پانصد هزار ریال |
| D2 | =AdadBeHorouf(A2/10)&" تومان" | یکصد و پنجاه هزار تومان |
نکتههای کاربردی
- فاکتور و قالب چاپی: سلول مبلغ به حروف در قالب فاکتور، با تغییر مبلغ بهطور خودکار بهروز میشود و نیازی به ویرایش دستی نیست.
- انتقال به فایلهای دیگر: برای استفاده در همهٔ فایلها، Module را در فایل
PERSONAL.XLSBقرار دهید یا یک افزونهٔ.xlamبسازید. - ارسال فایل برای دیگران: فایل باید با پسوند
.xlsmارسال شود و گیرنده ماکرو را فعال کند؛ در غیر این صورت سلولها خطای#NAME?نمایش میدهند. - چاپ چک: برای چاپ مبلغ به عدد و حروف روی چک و فرمهای بانکی، نرمافزار آمادهای مانند چاپ بانک موجود است.
پرسشهای پرتکرار
آیا اکسل تابع داخلی عدد به حروف فارسی دارد؟
خیر. اکسل تابع داخلی برای نوشتن عدد به حروف فارسی ندارد و این کار با یک تابع VBA یا افزونه انجام میشود.
چرا حروف فارسی در ویرایشگر VBA به صورت علامت سؤال دیده میشود؟
ویرایشگر VBA از یونیکد کامل پشتیبانی نمیکند. با تنظیم «Language for non-Unicode programs» ویندوز روی Persian، متن فارسی کد درست نمایش و ذخیره میشود.
آیا این تابع مبلغ منفی و اعشاری را هم تبدیل میکند؟
تابع قدر مطلق بخش صحیح عدد را تبدیل میکند. برای مبلغ منفی میتوان پیش از نتیجه کلمهٔ «منفی» را با یک شرط IF افزود.