در آموزش قبلی با نحوه اعلان متغیرها آشنا شدیم. در این بخش از آموزش های رایگان وی بی ای با مفهوم میدان دید متغیر در VBA آشنا خواهیم شد.
میدان دید متغیر نحوه دسترسی به متغیر و مقدار آن در قسمت های مختلف یک پروژه را تعیین می نماید. میدان دید یک متغیر زمانی که متغیر اعلان می شود تعیین می شود. در VBA سه میدان دید برای متغیرها به شرح ذیل تعریف شده است.
فهرست مطالب
میدان دید روال (محلی) (Procedure (local) scope)
یک متغیر محلی با میدان دید روال فقط در درون روالی که اعلان شده باشد قابل تشخیص می باشد. متغیر محلی می تواند با دستور Dim یا Static اعلان شود.
اعلان متغیر محلی با دستور Dim:
وقتی که یک متغیر محلی با دستور Dim اعلان می شود، متغیر تا زمانی که روالی که در درون آن اعلان شده است در حال اجرا است وجود خواهد داشت. معمولا زمانی که روال پایان می یابد، مقدار یک متغیر محلی محفوظ نخواهد ماند و حافظه اختصاص یافته به آن آزاد خواهد گردید. دفعه بعدی که روال آغاز شود تمامی متغیرهای محلی مجددا مقداردهی اولیه خواهند شد.
مثال
1 2 3 4 5 6 7 8 9 |
Sub Example1() 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 را نمایش خواهد داد.
1 2 3 4 5 6 |
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 اعلان شده است یک متغیر محلی است و فقط در همین روال در دسترس می باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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 اعلان می شود.
مثال
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
' 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 باعث ایجاد خطای کامپایلر خواهد گردید.