در آموزش قبلی با نحوه اعلان متغیرها آشنا شدیم. در این بخش از آموزشهای رایگان VBA با مفهوم میدان دید متغیرها (Variable Scope) و نحوه دسترسی به آنها در بخشهای مختلف پروژه آشنا خواهیم شد.
در پروژههای بزرگ VBA، دانستن میدان دید متغیرها بسیار اهمیت دارد. اگر توسعهدهنده نداند متغیر در چه محدودهای معتبر است، ممکن است دادهها اشتباه تغییر کنند یا مقدارهای ناخواسته در بخشهای دیگر برنامه استفاده شوند. به همین دلیل، شناخت Scope یکی از پایههای نوشتن کد تمیز و بدون خطا در VBA است.
📑 فهرست مطالب
انواع میدان دید متغیرها در VBA
میدان دید متغیر مشخص میکند که هر متغیر در چه بخشهایی از پروژه VBA قابل استفاده است. به طور کلی، سه سطح اصلی برای متغیرها وجود دارد:
| نوع متغیر | محل اعلان | محدوده دسترسی | مدت زمان نگهداری مقدار |
|---|---|---|---|
| محلی (Dim) | داخل روال | فقط همان روال | تا پایان اجرای روال |
| محلی (Static) | داخل روال | فقط همان روال | تا زمانی که VBA در حال اجراست |
| ماژول (Private/Dim) | بالای ماژول | تمام روالهای همان ماژول | تا زمانی که VBA در حال اجراست |
| عمومی (Public) | بالای ماژول استاندارد | تمام ماژولهای پروژه | تا زمانی که VBA در حال اجراست |
۱. میدان دید روال (محلی) (Procedure Scope)
یک متغیر محلی تنها در درون همان روالی که اعلان شده است قابل استفاده است. این متغیرها معمولاً با دستور Dim یا Static اعلان میشوند.
اعلان متغیر محلی با دستور Dim
وقتی یک متغیر با دستور Dim داخل یک روال اعلان شود، تا پایان اجرای همان روال در حافظه باقی میماند. پس از اتمام روال، مقدار متغیر از بین میرود و در اجرای بعدی دوباره مقداردهی اولیه میشود.
Sub Example1()
Dim X As Integer
X = 100
End Sub
Sub Example2()
Dim X As String
X = "Yes"
End Sub
در مثال بالا دو متغیر همنام با نوعهای متفاوت تعریف شدهاند. هر کدام فقط در روال خود معتبر هستند و هیچ تداخلی با هم ندارند.
اعلان متغیر محلی با دستور Static
متغیرهای محلی که با Static اعلان میشوند، مقدار خود را بین اجرایهای مختلف همان روال حفظ میکنند تا زمانی که VBA در حال اجرا باشد.
- در صورت بروز خطا بدون مدیریت خطا، مقدار بازنشانی میشود.
- در صورت توقف یا بستن VBA مقدار از بین میرود.
- تغییر ماژول نیز باعث بازنشانی مقدار میشود.
Sub RunningTotal()
Static Accumulate As Integer
num = 2
Accumulate = Accumulate + num
MsgBox "The running total is " & Accumulate
End Sub
در اجرای اول، مقدار متغیر Accumulate برابر ۲ میشود، و در اجرایهای بعدی با مقدار قبلی جمع میشود.
۲. میدان دید ماژول (Module Scope)
اگر متغیر خارج از هر روالی در بالای یک ماژول اعلان شود، برای تمام روالهای همان ماژول در دسترس خواهد بود. این نوع متغیرها با Dim یا Private تعریف میشوند.
Dim A As Integer
Dim B As Integer
Sub Example1()
A = 100
B = A + 1
End Sub
Sub Example2()
MsgBox A
MsgBox B
End Sub
در مثال بالا، متغیرهای A و B برای هر دو روال درون همان ماژول قابل استفاده هستند.
۳. میدان دید عمومی (Public Scope)
متغیرهای عمومی بیشترین سطح دسترسی را دارند و در تمام ماژولهای پروژه قابل استفادهاند. این متغیرها باید در ماژول استاندارد با دستور Public اعلان شوند.
' module1
Public SalesPrice As Integer
Public UnitsSold As Integer
Public CostPerUnit As Integer
' module2
Sub CDSales()
SalesPrice = 12
UnitsSold = 1000
CostPerUnit = 5
MsgBox "Gross Profit: $" & (SalesPrice * UnitsSold - (UnitsSold * CostPerUnit))
End Sub
در این مثال، متغیرهای عمومی تعریفشده در module1 بدون نیاز به اعلان مجدد در module2 در دسترس هستند.

🟩 جمعبندی سریع
- Dim (محلی): فقط در همان روال معتبر است.
- Static: مقدار بین اجرایهای بعدی حفظ میشود.
- Private: در کل ماژول در دسترس است.
- Public: در همه ماژولهای پروژه قابل استفاده است.
درک تفاوت این سطحها به شما کمک میکند تا کدهای ساختیافتهتر و کمخطاتری بنویسید.
سؤالات متداول درباره میدان دید متغیرها در VBA
میدان دید (Scope) در VBA به چه معناست؟
میدان دید در VBA مشخص میکند که یک متغیر در چه بخشهایی از کد قابل دسترسی است. بهعبارتی تعیین میکند متغیر در چه محدودهای معتبر است و تا چه زمانی مقدار خود را حفظ میکند.
تفاوت بین متغیرهای Dim و Static چیست؟
هر دو متغیر محلی هستند، اما Dim فقط تا پایان اجرای روال مقدار خود را نگه میدارد، درحالیکه Static مقدارش را حتی پس از پایان اجرای روال نیز حفظ میکند و در اجرای بعدی دوباره از همان مقدار ادامه میدهد.
چه زمانی باید از Public و چه زمانی از Private استفاده کنیم؟
وقتی متغیر باید در چند ماژول مختلف استفاده شود، از Public استفاده کنید. اما اگر متغیر فقط برای همان ماژول کاربرد دارد، بهتر است از Private استفاده شود تا از تداخل نامها و تغییرات ناخواسته جلوگیری شود.
آیا متغیرهای عمومی (Public) در فرمها و کلاسها هم قابل استفادهاند؟
بله، اما تنها اگر در یک ماژول استاندارد (Module) تعریف شده باشند. متغیرهای Public داخل فرم یا کلاس فقط برای همان شیء قابل دسترسیاند و باید از طریق نمونهسازی (Instance) به آنها دست یافت.
چرا برخی توسعهدهندگان از Option Explicit استفاده میکنند؟
دستور Option Explicit باعث میشود VBA قبل از اجرای کد بررسی کند که تمام متغیرها بهدرستی با Dim، Static، Private یا Public تعریف شده باشند. این کار از بروز خطاهای ناشی از تایپ اشتباه نام متغیر جلوگیری میکند.
منبع
Scope of variables in Visual Basic for Applications (Microsoft)
بیشتر بخوانید
Me در VBA | کاربرد کلمه کلیدی Me در VBA و برنامه نویسی شیءگرا
روال Property Get در VBA | کاربرد روال Property Get در شیءگرایی
روال Property Set در VBA | کاربرد روال Property Set در شیءگرایی
روال Property Let در VBA | شیءگرایی و کپسوله سازی داده ها در VBA
خواص کلاس در VBA | ایجاد خواص کلاس با استفاده از اعلان متغیر در VBA
کلاس و شیء در VBA | مراحل ایجاد کلاس و شیء در VBA
برنامه نویسی شیءگرا (OOP) | مقدمه ای بر روش برنامه نویسی شیءگرا