محیط VBA در اکسل و البته سایر نرم افزارهای OFFICE یک محیط اصطلاحا NON-UNICODE است. یعنی از کدینگ زبانهای مختلف پشتیبانی نمیکند زیرا بسیار قدیمی است و به همین دلیل در آن نمیتوانید فارسی بنویسید.
نکته) استاندارد جدید و جهانی که از همه کاراکترها (نویسههای) پشتیبانی میکند، یونیکد نامیده میشود.
و اگر یک ماکرو در اکسل رکورد کنید که در آن چیزهای فارسی باشد، کد شما اینگونه خواهد شد:
Sub Macro1()
Range("A1").Select
ActiveCell.FormulaR1C1 = "???? ?? ???"
End Sub
برای حل این مشکل (نمایش صحیح حروف فارسی در VBA) میتوانید یکی از راهکاریهای زیر را بکار ببرید:
حل مشکل فارسی نویسی در VBA - تنظیم Region
ما میتوانیم با تنظیم زیر به ویندوز بفهمانیم که در محیطهایی مانند VBA که unicode نیستند، کاراکترهایی را که نمیفهمد را باید فارسی تفسیر کنید.
به Control Panel --> Region بروید و مطابق تصویر زیر این تنظیم را انجام دهید.
مشکل این راه کار آن است که اگر کد شما بر روی کامپیوتر دیگری که اینگونه تنظیم نشده است، صحیح اجرا نخواهد شد و حتی ممکن است که برنامه با خطا مواجه شود. (مانند وقتی که اسم یک شیت فارسی است)
نکته) گزینه 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
، متنهای فارسی را نوشتهایم و در برنامه برای نمایش پیامهای فارسی از این کدها استفاده کردهایم:
در کد بالا میبینید که ما سلولی مانند 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 و ... استفاده شود، را فارسی نگذارید.
در نگارش این مقاله از هیچ منبع فارسی و یا ... استفاده نشده است و حاصل تجربههای فرساران است.
شما هم تجربه یا دیدگاه خود را بنویسید:
با سلام روش زیر امتحان کردم جواب داد.
1- اجرای برنامه RegEditor
2- رفتن به مسیر
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
3- تغییر مقدار مدخل های زیر به مقدار 65001
ACP =1252 است که باید 65001 شود
MACCP=10000 است که باید 65001 شود
OEMCP=437 است که باید 65001 شود
تست
پاسخ تستی