رفع مشکل ناخوانایی متن فارسی در محیط برنامه نویسی VBA اکسل

محیط VBA در اکسل و البته سایر نرم افزارهای OFFICE یک محیط اصطلاحا NON-UNICODE است. یعنی از کدینگ زبان‌های مختلف پشتیبانی نمی‌کند زیرا بسیار قدیمی است و به همین دلیل در آن نمی‌توانید فارسی بنویسید.

نکته) استاندارد جدید و جهانی که از همه کاراکترها (نویسه‌های) پشتیبانی می‌کند،‌ یونیکد نامیده می‌شود.

و اگر یک ماکرو در اکسل رکورد کنید که در آن چیزهای فارسی باشد، کد شما اینگونه خواهد شد:

Sub Macro1()
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "???? ?? ???"
End Sub 

برای حل این مشکل (نمایش صحیح حروف فارسی در VBA) می‌توانید یکی از راهکاری‌های زیر را بکار ببرید:

حل مشکل فارسی نویسی در VBA - تنظیم Region

ما می‌توانیم با تنظیم زیر به ویندوز بفهمانیم که در محیط‌هایی مانند VBA که unicode‌ نیستند، کاراکترهایی را که نمی‌فهمد را باید فارسی تفسیر کنید.

به Control Panel --> Region بروید و مطابق تصویر زیر این تنظیم را انجام دهید.

تنظیم control panel ویندوز برای نمایش صحیح کاراکترهای فارسی در VBA
تنظیم control panel ویندوز برای نمایش صحیح کاراکترهای فارسی 

مشکل این راه کار آن است که اگر کد شما بر روی کامپیوتر دیگری که اینگونه تنظیم نشده است، صحیح اجرا نخواهد شد و حتی ممکن است که برنامه با خطا مواجه شود. (مانند وقتی که اسم یک شیت فارسی است)

نکته)‌ گزینه Beta: Use Unicode‌ در نسخه‌های اخیر ویندوز اضافه شده است و یعنی اینکه ویندوز همه محیط‌هایی را که از یونیکد پشتیبانی نمی‌کنند را خودش به صورت unicode باید تنظیم کند. (فعلا beta است یعنی آزمایشی و ممکن است که در همه جا کار نکند.) . 
من این گزینه را آزمایش کردم (یعنی فقط تیک Beta: Use Unicode‌ را زدم و گزینه Current system local بر روی English  بود، نتیجه جالب بود. در هنگام رکورد ماکرو، کلمات فارسی به صورت ناخوانا به شکل زیر در می‌آمد، اما هنگام اجرا، کاملا صحیح نمایش داده می‌شد:
 

Sub Macro2()
    ActiveCell.FormulaR1C1 = "فرساران"
End Sub

حل مشکل کاراکترهای فارسی در محیط VBA اکسل با تابع chrw

تابع chrw یک متن یونیکد را برای ما بر می‌گرداند و با آن می‌توانیم یک متن یونیکد (از جمله) فارسی را در VBA‌ تولید کنیم. مثلا کلمه «آبتین» با این تابع به شکل زیر نوشته می‌شود:

Sub print_abtin()

MsgBox ChrW(1570) & ChrW(1576) & ChrW(1578) & ChrW(1740) & ChrW(1606)

End Sub

مشکل این راهکار آن است که تغییرات متن‌ها را بسیار دشوار می‌کند و هر بار برنامه نویس باید متن را به رشته‌ای از chrw‌ها تبدیل کند و از سوی دیگر کد نهایی خوانا نیست.

برای چاپ کاراکترهای فارسی (که در واقع به آن عربی گفته می‌شود) به همراه کد آنها،‌ برنامه زیر را برای شما نوشته‌ام و در فایل پیوست انتهای همین صفحه، این برنامه و یک ایده برای استفاده از آن برای تبدیل یک نوشته فارسی به این کدها وجود دارد:

Sub Generate_arabic_unicode_char()
' Author: Farshid, www.farsaran.com

Range("A:B").Clear

For n = 1536 To 1791
    i = i + 1
    x = ChrW(n)
    Cells(i, 1) = x
    Cells(i, 2) = n
Next n
    
End Sub

از این تکنیک در توابع تاریخ شمسی و محاسبه عدد به حروف در اکسل استفاده کرده‌ایم تا مطمئن شویم که بر روی همه کامپیوترها،‌ ماه‌ها و اعداد به صورت صحیحی نمایش داده می‌شوند.


حل مشکل کاراکترهای فارسی در محیط VBA اکسل با یک شیت کمکی

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

در تصویر زیر مشاهده می‌کنید که ما در شیتی به نام farsi_txt ، متن‌های فارسی را نوشته‌ایم و در برنامه برای نمایش پیام‌های فارسی از این کدها استفاده کرده‌ایم:

راهکار رفع مشکل حروف ناخوانای فارسی در برنامه نویسی vba اکسل
راهکار رفع مشکل حروف ناخوانای فارسی در برنامه نویسی vba اکسل

در کد بالا می‌بینید که ما سلولی مانند B2 از شیت farsi_txt را خوانده‌ایم و نمایش داده‌ایم و خروجی این کد، به صورت صحیحی متن‌های فارسی را نمایش می‌دهد. در این روش، ویرایش متن‌های بسیار ساده و سریع است و کافی است و کافی است که مقدار سلول‌ها را تغییر دهیم اما کماکان کد ناخوانا است، یعنی ما نمی‌دانیم که دقیقا متن سلول B2 چیست:

Sub say_hello()

    MsgBox Sheets("farsi_txt").Range("B2") & vbCrLf _
           & Sheets("farsi_txt").Range("B3"), _
           Title:=Sheets("farsi_txt").Range("B4")

End Sub

خوشبختانه این کار با کمی خلاقیت حل خواهد شد.

در تصویر قبل، مشاهده می‌کنید که یک جدول از یک کلمه انگلیس که در جلوی آن متن معادل فارسی آن تایپ شده است، وجود دارد و می‌توانیم در کدهایمان به جای B2 (آدرس سلول)، نام معادل متن انگلیسی آن یعنی txt_hello را بنویسم و یک تابع ساده در VBA برای تبدیل متن‌های انگلیسی به معادل فارسی آن به شکل زیر بنویسیم:

نکته) نام Table را dict گذاشته‌ایم.

Function farsi(txt)

farsi = WorksheetFunction.VLookup(txt, Range("dict"), 2, 0)

End Function

و به شکل زیر از این تابع در هر قسمت از برنامه می‌توانیم استفاده کنیم:

Sub say_hello()

    MsgBox farsi("txt_hello") & vbCrLf _
           & farsi("txt_welcome"), _
           Title:=farsi("txt_title")

End Sub

همانطور که می‌بینید، این تابع یک متن (که همان متن انگلیسی ستون اول جدول است) را می‌گیرد و سپس متن روبروی آن را برای ما (که فارسی است) را برمی‌گرداند.

در اینجا کدهای ما خواناتر هستند و دقیقا می‌دانیم که چه چیزی را قرار است نمایش دهید.


    توصیه مهم)
☠️  نام شیت‌ها، Tableها، فایل، سر ستون Tableها  و یا هر چیزی که ممکن است در فرمول نویسی و یا VBA‌ و یا PowerQuery‌ و ... استفاده شود، را فارسی نگذارید.

در نگارش این مقاله از هیچ منبع فارسی و یا ... استفاده نشده است و حاصل تجربه‌های فرساران است.

⭐ فایل‌های پیوست ویژه ( برای دانلود، وارد شوید و یا ثبت نام کنید. )

شما هم تجربه یا دیدگاه خود را بنویسید:

محتوای این فیلد خصوصی است و به صورت عمومی نشان داده نخواهد شد.

متن ساده

  • تگ‌های HTML مجاز نیستند.
  • خطوط و پاراگراف‌ها بطور خودکار اعمال می‌شوند.
کد امنیتی
ایمان صحرایی د… (تایید نشده) در تاریخ چهارشنبه, 1403/01/15 - 21:28 نوشته:

با سلام روش زیر امتحان کردم جواب داد.
1- اجرای برنامه RegEditor
2- رفتن به مسیر
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
3- تغییر مقدار مدخل های زیر به مقدار 65001
ACP =1252 است که باید 65001 شود
MACCP=10000 است که باید 65001 شود
OEMCP=437 است که باید 65001 شود

احمد حجازی (تایید نشده) در تاریخ شنبه, 1402/12/05 - 02:36 نوشته:

تست

admin در تاریخ شنبه, 1402/12/05 - 02:45 نوشته:

پاسخ تستی