حسن رمضانی
ماکرو و VBA

تبدیل عدد به حروف در اکسل برای مبلغ چک و فاکتور

ساخت تابع عدد به حروف فارسی در اکسل با VBA، برای نوشتن مبلغ چک، فاکتور و قرارداد به ریال یا تومان؛ همراه با کد کامل و روش استفاده.

B2=AdadBeHorouf(A2)

در یک نگاه

  • اکسل تابع داخلی عدد به حروف فارسی ندارد؛ با یک تابع کوتاه VBA این کار ممکن است.
  • تابع یک بار در Module نوشته می‌شود و مانند هر فرمول دیگری در سلول به کار می‌رود.
  • برای یک یا چند مبلغ بدون اکسل، ابزار آنلاین عدد به حروف همین سایت قابل استفاده است.

در فاکتور، چک، رسید و قرارداد، مبلغ باید علاوه بر عدد به حروف نیز نوشته شود. نوشتن دستی آن در هر سند هم وقت‌گیر است و هم احتمال اختلاف میان عدد و حروف را بالا می‌برد. اکسل برای این کار تابع داخلی فارسی ندارد، اما با یک تابع کوتاه VBA می‌توان فرمولی ساخت که مانند SUM در هر سلول به کار رود.

قاعدهٔ نوشتن عدد به حروف

عدد از سمت راست سه‌رقم‌سه‌رقم جدا می‌شود. هر گروه سه‌رقمی جداگانه خوانده می‌شود، نام مرتبهٔ آن (هزار، میلیون، میلیارد) به آن افزوده می‌شود و گروه‌ها با «و» به هم وصل می‌شوند. گروه‌های صفر خوانده نمی‌شوند.

عددبه حروف
۱۰۵یکصد و پنج
۲۰۰٬۰۱۹دویست هزار و نوزده
۱٬۵۰۰٬۰۰۰یک میلیون و پانصد هزار
۱۲٬۰۰۰٬۰۵۰دوازده میلیون و پنجاه

در اسناد مالی و چک، صدگان معمولاً به صورت «یکصد» نوشته می‌شود و کد زیر نیز همین صورت را به کار می‌برد.

گام ۱: باز کردن ویرایشگر VBA

  1. فایل را با پسوند .xlsm (کارپوشهٔ ماکرودار) ذخیره نمایید.
  2. کلید Alt+F11 را بزنید تا ویرایشگر VBA باز شود.
  3. از منوی Insert گزینهٔ Module را انتخاب کنید.

گام ۲: کد تابع

کد زیر را به‌طور کامل در Module جدید قرار دهید:

VBA
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 افزود.