در آموزش قبلی با نحوه اعلان متغیرها آشنا شدیم. در این بخش از آموزش های رایگان وی بی ای با مفهوم میدان دید متغیر در VBA آشنا خواهیم شد.
میدان دید متغیر نحوه دسترسی به متغیر و مقدار آن در قسمت های مختلف یک پروژه را تعیین می نماید. میدان دید یک متغیر زمانی که متغیر اعلان می شود تعیین می شود. در VBA سه میدان دید برای متغیرها به شرح ذیل تعریف شده است.
فهرست مطالب
میدان دید روال (محلی) (Procedure (local) scope)
یک متغیر محلی با میدان دید روال فقط در درون روالی که اعلان شده باشد قابل تشخیص می باشد. متغیر محلی می تواند با دستور Dim یا Static اعلان شود.
اعلان متغیر محلی با دستور Dim:
وقتی که یک متغیر محلی با دستور Dim اعلان می شود، متغیر تا زمانی که روالی که در درون آن اعلان شده است در حال اجرا است وجود خواهد داشت. معمولا زمانی که روال پایان می یابد، مقدار یک متغیر محلی محفوظ نخواهد ماند و حافظه اختصاص یافته به آن آزاد خواهد گردید. دفعه بعدی که روال آغاز شود تمامی متغیرهای محلی مجددا مقداردهی اولیه خواهند شد.
مثال
Sub Example()
Dim X As Integer
X = 100
End Sub
Sub Example2()
Dim X As String
X = "Yes"
End Sub
در مثال بالا دو متغیر با نام مشابه X در دو روال سابروتین Example1 و Example2 اعلان شده اند. مشاهده می نمایید که متغیر اول از نوع داده Integer و متغیر دوم از نوع داده String می باشد. متغیر X در هر روال مستقل از دیگری می باشد و فقط در روال مربوط به خود قابل تشخیص می باشد.
اعلان متغیر محلی با دستور Static:
متغیر محلی که با دستور Static اعلان شده باشد تا زمانی که VBA در حال اجرا می باشد، وجود خواهد داشت. در صورتی هر یک از حالات زیر رخ بدهد متغیر بازنشانی خواهد شد:
- کد باعث ایجاد خطایی شود که برای آن دام خطا نوشته نشده است.
- توقف ویژوال بیسیک
- خروج از برنامه
- تغییر در ماژول توسط کاربر
مثال
بعنوان مثال در کد زیر سابروتین RunningTotal هر زمانی که اجرا گردد، مقدار قبلی متغیر Accumulate حفظ می شود. در دفعه اولی که ماژول اجرا می شود، پنجره پیغام عدد 2 را نمایش خواهد داد (مقدار اولیه داده های عددی توسط VBA بصورت خودکار صفر تعیین می شود). دفعه بعدی که ماژول اجرا شود، پنجره پیغام عدد 4 را نمایش خواهد داد.
Sub RunningTotal()
Static Accumulate As Integer
num = 2
Accumulate = Accumulate + num
MsgBox "The running total is " & Accumulate
End Sub
میدان دید ماژول ( Module scope )
متغیری که خارج از هر روالی در درون ماژول اعلان شده باشد متغیر ماژول نامیده می شود. متغیر ماژول برای همه روال های درون ماژول در دسترس می باشد، اما برای روال های سایر ماژول ها در دسترس نمی باشد. متغیر ماژول تا زمانی که ویژوال بیسیک اجرا می شود باقی خواهد ماند مگر اینکه ماژولی که در آن اعلان شده است ویرایش شود. متغیر ماژول می تواند با استفاده از دستور Dim یا Private بالای ماژول قبل از اولین روال (سطح ماژول) اعلان شود.
در سطح ماژول، تفاوتی بین Dim و Private وجود ندارد. دقت داشته باشید که متغیرهای ماژول نمی تواند داخل یک روال اعلان شوند.
مثال
در مثال زیر، دو متغیر A و B در سطح ماژول اعلان شده اند. این دو متغیر برای هر روالی در این ماژول در دسترس می باشند. متغیر سوم C که در روال Example3 اعلان شده است یک متغیر محلی است و فقط در همین روال در دسترس می باشد.
Dim A As Integer
Dim B As Integer
Sub Example1()
A = 100
B = A + 1
End Sub
Sub Example2()
MsgBox "The value of A is " & A ' Module variable.
MsgBox "The value of B is " & B ' Module variable.
End Sub
Sub Example3()
Dim C As Integer' Local variable.
C = A + B
MsgBox "The value of C is " & C ' Module variable.
End Sub
Sub Example4()
MsgBox A
' The message box displays the value of A.
MsgBox B
' The message box displays the value of B.
MsgBox C
' The message box displays nothing because C was a local variable.
End Sub
همانطور که در مثال مشاهده می نمایید در خطوط 20 و 22 متغیرهای A و B که میدان دید ماژول دارند برای روال Example4 قابل مشاهده می باشند و در پنجره پیغام مقادیر آن ها نمایش داده خواهد شد، اما متغیر C که متغیر محلی می باشد مقدار آن برای روال Example4 قابل مشاهده نمی باشد و یک پنجره پیغام خالی نمایش داده خواهد شد.
میدان دید عمومی (Public scope)
متغیرهای عمومی گسترده ترین میدان دید را در میان متغیرها دارند. یک متغیر عمومی به وسیله هر ماژولی در پروژه تشخیص داده می شود.
متغیرهای عمومی ویژگی های زیر را دارند:
- مانند متغیر ماژول در بالای ماژول، بالای اولین روال (سطح ماژول) اعلان می شود.
- نمی تواند داخل روال اعلان شود.
- متغیر عمومی همواره با استفاده از دستور Public اعلان می شود.
مثال
' module1.
Public SalesPrice As Integer
Public UnitsSold As Integer
Public CostPerUnit As Integer
Private Markup As Integer
' module2.
Sub CDSales()
Dim X As String
SalesPrice = 12
UnitsSold = 1000
CostPerUnit = 5
Markup = 1.05
X = "yes"
MsgBox "The Gross Profit for CD Sales is $" & (SalesPrice _
* UnitsSold) -(UnitsSold * CostPerUnit * Markup)
End Sub
همانطور که در مثال بالا مشاهده می کنید، متغیر های عمومی اعلان شده در module1 در module2 بدون اینکه مجددا اعلان شوند استفاده شده اند. توجه داشته باشید در صورتی که در module2 اعلان صریح متغیرها با استفاده از دستور Option Explicit تنظیم شده باشد، خط 7 باعث ایجاد خطای کامپایلر خواهد گردید.
منبع
Scope of variables in Visual Basic for Applications
بیشتر بخوانید
توابع توکار VBA | لیست کامل توابع داخلی در ویژوال بیسیک
عملگرهای VBA | انجام عملیات روی داده ها و ایجاد عبارت ها
حلقه در VBA | ایجاد حلقه برای تکرار دستورات در ویژوال بیسیک
کدهای VBA | آشنایی با کدها و دستور زبان برنامه نویسی VBA
دستور IF | اجرای مشروط کد با استفاده از عبارت های شرطی و منطقی
آرایه در VBA | آرایه ها و کاربرد آن ها در برنامه نویسی
میدان دید متغیر در VBA | نحوه دسترسی به متغیرها در قسمت های مختلف پروژه