در بخش قبلی با قسمتهای مختلف ویرایشگر VBA آشنا شدیم. در این بخش از آموزشهای رایگان VBA با یکی از پایهایترین مفاهیم برنامهنویسی یعنی «متغیرها» آشنا میشویم؛ جعبههایی در حافظه که دادهها را موقتاً نگه میدارند تا بتوانیم از آنها در طول اجرای برنامه استفاده کنیم.
📑 فهرست مطالب
چرا باید متغیرها را بشناسیم؟
در هر برنامهنویسی، متغیرها قلب منطق برنامه هستند. اگر ندانید چگونه متغیرها را بهدرستی اعلان و استفاده کنید، ممکن است نتایج محاسبات شما اشتباه شود یا برنامه با خطا متوقف گردد. شناخت صحیح متغیرها، اولین گام در نوشتن کدهای مطمئن و قابل فهم است.
تقریباً در هر ماکروی VBA که مینویسید، چندین متغیر به کار خواهید برد؛ بدون آنها هیچ محاسبهای ممکن نیست.
تعریف
طبق تعریف واژهنامه VBE متغیر در VBA فضایی از حافظه است که یک نام نمادین یا شناسه دارد و برای ذخیره دادهها کنار گذاشته شدهاست. متغیر یک مکان موقت درون حافظه برنامه است که دادهها را نگهداری میکند.
متغیرها برای نگهداری نتایج محاسبات و مقادیری که به کنترلهای فرم اختصاص میدهید بهکار میروند. متغیر در VBA Excel یکی از پایهایترین مفاهیم در نوشتن ماکروهای پیشرفته است.
مقدار یک متغیر میتواند تغییر کند زیرا متغیر فضایی از حافظه است که در هر لحظه می تواند یک مقدار خاص را حفظ کند. متغیرها بر خلاف خواص کنترلها که از قبل نام دارند هیچ نامی ندارند تا اینکه آنها را نامگذاری کنید.
قبل از آنکه بتوانید از یک متغیر استفاده کنید باید آن را اعلان نمایید، یعنی به VBA نام متغیر و نوع داده ای را که نگه میدارد اعلام نمایید. متغیرها فقط میتوانند دادههایی را حفظ کنند که مطابق با نوع داده ای باشد که برای آنها تعریف کردهاید.
بعنوان مثال متغیری که از نوع Byte تعریف شده، نمیتواند یک مقدار رشتهای (String) را نگه دارد (البته نوع داده Variant از این قاعده مستثنی است).
به بیان ساده: متغیرها مثل «جعبههایی» هستند که در حافظه برای نگهداری موقت اطلاعات ایجاد میکنید تا بتوانید بعداً در کد خود از آنها استفاده کنید.
اعلان متغیر در VBA
متداولترین دستور در VBA برای اعلان متغیر، دستور Dim است. نحوه استفاده از دستور Dim در مثال زیر توضیح داده شده است.
Dim x As Integer 'اعلان متغیر
در مثال بالا متغیر x از نوع داده integer به کامپایلر VBA اعلان شده است. اگر در صفحه انواع دادهها دقت کرده باشید، داده Integer از نوع عددی میباشد و فضایی معادل 2 بایت را اشغال مینماید. بنابراین با اعلان متغیر x فضایی برابر با ۲ بایت به نام x اختصاص داده میشود.
| جزء دستور | توضیح |
|---|---|
Dim | دستور اعلان متغیر به VBA |
x | نام متغیر |
As Integer | نوع داده متغیر (عدد صحیح) |
کاربرد متغیر در ماکرو واقعی اکسل
Sub ExampleVariable()
Dim total As Double
total = Range("B2").Value + Range("B3").Value
MsgBox "مجموع دو عدد برابر است با " & total
End Sub
قواعد و ترفندهای نامگذاری متغیرها در VBA
در ادامه قواعد نامگذاری متغیرها در VBA Excel را مشاهده میکنید. VBA در نامگذاری متغیرها از قواعد زیر پیروی می نماید:
- نام متغیر باید با یکی از حروف الفبا شروع شود.
- از حروف الفبا و اعداد می توانید در نام متغیر استفاده نمایید.
- نام متغیر می تواند بین ۱ تا ۲۵۵ کاراکتر داشته باشد.
- در نام متغیر نمی توانید از فاصله ( space )، نقطه (.)، علامت تعجب (!) یا کاراکترهای @، &، $ و # استفاده نمایید.
- بطور کلی، شما نباید از نامهایی که همنام با توابع، دستورها، روشها و ثابتهای ذاتی ویژوال بیسیک یا برنامه کاربردی میزبان میباشد استفاده نمایید. بعبارت دیگر از نام کلمات کلیدی استفاده شده در معماری VBA نمیتوانید استفاده نمایید.
- در یک سطح میدان دید یکسان نمیتوانید از نامهای تکراری استفاده نمایید. بعنوان مثال نمیتوانید دو نام متغیر age را در یک روال اعلان نمایید.
نمونههای درست و نادرست:
نمونهکد زیر به شما کمک میکند تفاوت بین نامهای مجاز و نامهای نادرست را بهتر درک کنید:
'نامهای مجاز
Dim studentName As String
Dim total_Amount As Double
'نامهای غیرمجاز
Dim student name As String 'بهدلیل فاصله بین کلمات
Dim #total As Integer 'بهدلیل استفاده از کاراکتر غیرمجاز #
Dim 1total As Integer 'بهدلیل شروع نام متغیر با عدد
نکات کاربردی درباره اعلان متغیرها
در ادامه چند نکته مهم برای جلوگیری از خطاهای متداول هنگام اعلان متغیر آورده شده است:
- 📌
- همانطور که می دانید کدهای VBA به زبان انگلیسی نوشته میشوند، بنابراین برای جلوگیری از بروز خطا در کامپایل کدها حتما در انتخاب نام متغیر از نامهای انگلیسی استفاده نمایید.
- در ابتدای نام متغیر یک پیشوند قرار دهید که نوع داده متغیر را نشان دهد. بدین ترتیب برای پیدا کردن نوع داده متغیر مجبور نیستید به قسمت اعلان برنامه مراجعه کنید. برای مشاهده فهرست پیشوندهای پیشنهادی میتوانید صفحه انواع داده در VBA را مشاهده نمایید.
- دستور Dim را می توان هم در سطح ماژول و هم در درون روال استفاده نمود. متغیری که در سطح ماژول اعلان می شود متغیر ماژول نامیده می شود و برای تمامی روال های درون ماژول قابل دسترس می باشد. (اطلاعات بیشتر در این خصوص را می توانید در آموزش میدان دید متغیر در VBA پیدا کنید.)
- 📌
- از نام های معنادار (مانند curHighTotal) بجای اسامی مبهم (مثل curX1) استفاده کنید. این نام های معنادار به مستند شدن کد کمک می کنند.
- در نام متغیر می توانید از تعداد محدودی کاراکترهای خاص استفاده نمایید. برای اطمینان فقط از کاراکتر زیرخط (_) در نام متغیر استفاده نمایید.
- VBA حساس به حروف بزرگ و کوچک نمی باشد. بنابراین تفاوتی بین Age، age و aGe وجود نخواهد داشت. البته در نظر داشته باشید ویرایشگر VBE حالت حروف در اولین اعلان را حفظ می نماید.
خلاصه نکات مهم نامگذاری متغیرها:
- ✅ از حروف انگلیسی برای نامگذاری استفاده کنید.
- ✅ پیشوند نوع داده را در نام متغیر بگنجانید (مثلاً
strNameبرای رشته). - ✅ از نامهای معنادار استفاده کنید تا خوانایی کد افزایش یابد.
- ✅ فقط از کاراکتر زیرخط (
_) برای ترکیب کلمات استفاده نمایید. - ✅ از تعریف متغیرهای تکراری در یک محدوده دید خودداری کنید.
خطای Overflow در VBA (خطای شماره 6)

حتماً برایتان پیش آمده که برنامه بدون دلیل مشخصی متوقف شود و پیغام Overflow را ببینید… این خطا زمانی رخ میدهد که مقدار داده بزرگتر از ظرف متغیر باشد
در صورتی که به متغیر اعلان شده توسط شما مقداری بیشتر یا کمتر از محدوده مجاز نوع داده آن تحمیل شود با خطای Overflow (خطای شماره ۶) مواجه خواهید شد و برنامه شما متوقف خواهد شد.
بنابراین همواره باید در تعیین نوع داده متغیر دو وجه اساسی را در نظر داشته باشید، از یک طرف انتخاب نوع داده با حجم بیشتر از نیاز، باعث اشغال بی مورد حافظه و کندی برنامه شما خواهد شد و از طرف دیگر در صورتی که فضای انتخابی شما کمتر از مقدار اختصاص یافته به متغیر باشد با خطای کامپایلر مواجه خواهید شد.
بعنوان مثال در کد زیر خط دوم باعث بروز خطای Overflow خواهد شد، چرا که محدوده مجاز نوع داده Byte بین 0 تا 255 میباشد.
Dim i As Byte
i = 256
💡 یادآوری: نوع داده Long میتواند مقادیر بین −2,147,483,648 تا 2,147,483,647 را نگهداری کند.
روشهای اعلان متغیر به کامپایلر
در VBA اعلان متغیرها را میتوانید به دو صورت انجام دهید:
- اعلان متغیرها به صراحت (Explicitly)
- اعلان متغیرها به صورت ضمنی (Implicitly)
در VBA تعیین نوع اعلان توسط دستور Option Explicit صورت می پذیرد.
| روش اعلان | ویژگی | مزایا | معایب |
|---|---|---|---|
| ✅ Explicit (صریح) | با استفاده از Option Explicit | کاهش خطاهای تایپی، خوانایی بیشتر | نیاز به تعریف همه متغیرها |
| ⚠️ Implicit (ضمنی) | بدون استفاده از Option Explicit | کدنویسی سریع در پروژههای کوچک | احتمال بالای بروز خطا و متغیرهای ناخواسته |
اعلان متغیرها به صورت صریح (Explicitly)
برای اعلان متغیرها بصورت صریح (Explicitly) باید از دستور Option Explicit استفاده نمایید. در صورت استفاده از دستور Option Explicit در ابتدای یک ماژول، کامپایلر شناسه را در صورتی بعنوان متغیر خواهد پذیرفت که قبل از استفاده از آن در کد VBA، شناسه و نوع آن به کامپایلر اعلان شده باشد.
مثال زیر نحوه استفاده از دستور Option Explicit را نمایش می دهد:
Option Explicit 'تعیین نحوه اعلان صریح متغیرها به کامپایلر
Dim x As Byte 'اعلان متغیر
Private Sub MYsub()
y = 10' متغیر اعلان نشده باعث ایجاد خطای حین کامپایل می شود
x = 10' متغیر اعلان شده خطایی ایجاد نخواهد کرد
End Sub
در خط ۱ کد بالا Option Explicit به کامپایلر اعلام می نماید که متغیرها باید بصورت صریح از قبل اعلان شده باشند. نکته مهم در خصوص دستور Option Explicit این است که این دستور باید در هر ماژول قبل از هر کد دیگری در پنجره کد ظاهر شده باشد.
در خط ۲ متغیر x از نوع Byte اعلان شده است.
خط ۳ اعلان سابروتین MYsub می باشد. در سابروتین ها و نقش آن ها در بخش های بعدی بصورت کامل با شما صحبت خواهیم کرد.
در خط ۴ عدم اعلان متغیر y باعث ایجاد خطای حین کامپایل خواهد شد. علت این امر استفاده از دستور Option Explicit در خط ۱ می باشد. در این خط، چون متغیر y پیش از استفاده اعلان نشده است، کامپایلر خطای Compile Error: Variable not defined را نشان میدهد
در خط ۵، متغیر x که قبلا اعلان شده است مقداردهی شده است.
خط ۶ نشانگر پایان سابروتین MYsub شروع شده در خط ۳ می باشد.
اعلان متغیرها به صورت ضمنی یا تلویحی (Implicitly)
برای اعلان متغیرها بصورت ضمنی (Implicitly) کافیست از دستور Option Explicit در ابتدای ماژول استفاده ننمایید. در این حالت کامپایلر بصورت اتوماتیک متغیرها را بهنگام استفاده از آن ها در کد ایجاد و نوع آن ها را تعیین می نماید. برای روشن شدن موضوع می توانید مثال زیر را مشاهده نمایید:
Private Sub MYsub()
x = 10'نوع متغیر با توجه به مقدار آن از نوع عددی تعیین می شود
y = "Sadegh"'کامپایلر نوع متغیر را با توجه به مقدار آن از نوع غیر عددی تعیین می نماید
End Sub
در خط ۲ شناسه x با توجه به مقدار آن توسط کامپایلر بعنوان متغیر از نوع داده عددی Integer تعیین می شود.
در خط ۳ شناسه y توسط کامپایلر بعنوان متغیر از نوع داده غیرعددی String تعیین می شود.
💬 نکته: در پروژههای واقعی همیشه توصیه میشود از Option Explicit استفاده کنید تا از بروز خطاهای تایپی جلوگیری شود.
❓ سؤالات متداول درباره متغیرها در VBA
آیا میتوان بدون استفاده از Dim متغیر تعریف کرد؟
بله، اما توصیه نمیشود. همیشه از Option Explicit برای جلوگیری از خطاها استفاده کنید.
تفاوت بین Variant و سایر نوع دادهها چیست؟
نوع داده Variant میتواند هر نوع دادهای را نگهداری کند، اما استفاده بیش از حد از آن ممکن است باعث کندی برنامه شود.
آیا نام متغیرها به حروف بزرگ و کوچک حساس است؟
خیر، VBA نسبت به حروف بزرگ و کوچک حساس نیست.
💎 نکات طلایی برای حرفهایها
- در پروژههای بزرگ، از پیشوندهای سهحرفی برای نوع داده استفاده کنید (مانند
intCount،strUser). - برای افزایش سرعت اجرا، نوع دادهها را دقیق انتخاب کنید (مثلاً به جای
VariantازLongاستفاده کنید). - در صورت نیاز به متغیرهای عمومی بین چند ماژول، از
Publicدر سطح ماژول استفاده نمایید. - رعایت میدان دید متغیرها میتواند میزان قابلتوجهی در مصرف حافظه صرفهجویی نماید.
- در پروژههای طولانی، بهتر است متغیرهای موقت را در پایان روال مقداردهی صفر کنید تا مصرف حافظه کاهش یابد.
- از ابزار Locals Window در VBE برای مشاهده مقدار لحظهای متغیرها استفاده کنید.
جمعبندی و آموزش بعدی
در این آموزش با مفهوم متغیر، قواعد نامگذاری، روشهای اعلان و خطای Overflow آشنا شدیم. در بخش بعدی از آموزشهای VBA یاد میگیریم که انجام عملیات روی دادهها و ایجاد عبارتها با استفاده از عملگرها چگونه بر عملکرد برنامه تأثیر میگذارد. در آموزش بعدی یاد میگیرید چگونه با استفاده از عملگرها محاسبات خود را در VBA انجام دهید — قدمی مهم برای نوشتن کدهای پویا و حرفهای.
🚀 برای ادامه مسیر یادگیری VBA، آموزش بعدی را از دست ندهید!
اگر این آموزش برایتان مفید بود، آن را با دوستان خود به اشتراک بگذارید 💬
بیشتر بخوانید
Me در VBA | کاربرد کلمه کلیدی Me در VBA و برنامه نویسی شیءگرا
روال Property Get در VBA | کاربرد روال Property Get در شیءگرایی
روال Property Set در VBA | کاربرد روال Property Set در شیءگرایی
روال Property Let در VBA | شیءگرایی و کپسوله سازی داده ها در VBA
خواص کلاس در VBA | ایجاد خواص کلاس با استفاده از اعلان متغیر در VBA
کلاس و شیء در VBA | مراحل ایجاد کلاس و شیء در VBA
برنامه نویسی شیءگرا (OOP) | مقدمه ای بر روش برنامه نویسی شیءگرا