You are currently viewing میدان دید متغیر در VBA | نحوه دسترسی به متغیرها در قسمت‌های مختلف پروژه

میدان دید متغیر در VBA | نحوه دسترسی به متغیرها در قسمت‌های مختلف پروژه

در آموزش قبلی با نحوه اعلان متغیرها آشنا شدیم. در این بخش از آموزش‌های رایگان VBA با مفهوم میدان دید متغیرها (Variable Scope) و نحوه دسترسی به آن‌ها در بخش‌های مختلف پروژه آشنا خواهیم شد.

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

انواع میدان دید متغیرها در VBA

میدان دید متغیر مشخص می‌کند که هر متغیر در چه بخش‌هایی از پروژه VBA قابل استفاده است. به طور کلی، سه سطح اصلی برای متغیرها وجود دارد:

نوع متغیرمحل اعلانمحدوده دسترسیمدت زمان نگهداری مقدار
محلی (Dim)داخل روالفقط همان روالتا پایان اجرای روال
محلی (Static)داخل روالفقط همان روالتا زمانی که VBA در حال اجراست
ماژول (Private/Dim)بالای ماژولتمام روال‌های همان ماژولتا زمانی که VBA در حال اجراست
عمومی (Public)بالای ماژول استانداردتمام ماژول‌های پروژهتا زمانی که VBA در حال اجراست
جدول مقایسه میدان دید متغیرها در VBA
آیا می‌دانید:

آموزش 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 در دسترس هستند.

نمودار فارسی میدان دید متغیرها در VBA شامل سه سطح: محلی، ماژول و عمومی
نمودار سه‌سطحی میدان دید متغیرها در VBA — محلی، ماژول و عمومی

🟩 جمع‌بندی سریع

  • 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)

دیدگاهتان را بنویسید