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

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

در آموزش قبلی با نحوه اعلان متغیرها آشنا شدیم. در این بخش از آموزش های رایگان وی بی ای با مفهوم میدان دید متغیر در VBA آشنا خواهیم شد.

میدان دید متغیر نحوه دسترسی به متغیر و مقدار آن در قسمت های مختلف یک پروژه را تعیین می نماید. میدان دید یک متغیر زمانی که متغیر اعلان می شود تعیین می شود. در 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 در حال اجرا می باشد، وجود خواهد داشت. در صورتی هر یک از حالات زیر رخ بدهد متغیر بازنشانی خواهد شد:

  • کد باعث ایجاد خطایی شود که برای آن دام خطا نوشته نشده است.
  • توقف ویژوال بیسیک
  • خروج از برنامه
  • تغییر در ماژول توسط کاربر

نکته
دستور Static برای اعلان متغیرها فقط در سطح روال قابل استفاده می باشد

نکته
مقدار متغیر محلی که با دستور Static اعلان شده باشد فقط برای روالی که متغیر داخل آن اعلان شده است در دسترس می باشد.

مثال

بعنوان مثال در کد زیر سابروتین RunningTotal هر زمانی که اجرا گردد، مقدار قبلی متغیر Accumulate حفظ می شود. در دفعه اولی که ماژول اجرا می شود، پنجره پیغام عدد 2 را نمایش خواهد داد (مقدار اولیه داده های عددی توسط VBA بصورت خودکار صفر تعیین می شود). دفعه بعدی که ماژول اجرا شود، پنجره پیغام عدد 4 را نمایش خواهد داد.


Sub  RunningTotal()
Static Accumulate As Integer
	num = 2
	Accumulate = Accumulate + num
	MsgBox "The running total is " & Accumulate
End Sub

برای کسب اطلاعات بیشتر در مورد دستور Static این صفحه را مشاهده نمایید.

میدان دید ماژول ( Module scope )

متغیری که خارج از هر روالی در درون ماژول اعلان شده باشد متغیر ماژول نامیده می شود. متغیر ماژول برای همه روال های درون ماژول در دسترس می باشد، اما برای روال های سایر ماژول ها در دسترس نمی باشد. متغیر ماژول تا زمانی که ویژوال بیسیک اجرا می شود باقی خواهد ماند مگر اینکه ماژولی که در آن اعلان شده است ویرایش شود. متغیر ماژول می تواند با استفاده از دستور Dim یا Private بالای ماژول قبل از اولین روال (سطح ماژول) اعلان شود.

در سطح ماژول، تفاوتی بین Dim و Private وجود ندارد. دقت داشته باشید که متغیرهای ماژول نمی تواند داخل یک روال اعلان شوند.

نکته
دقت داشته باشید متغیرهای ماژول حتما باید در سطح ماژول اعلان شوند و اعلان آنها در بین روال ها باعث ایجاد خطای کامپایلر خواهد شد.

نکته
اگر از دستور Private بجای Dim برای اعلان متغیرهای ماژول استفاده نمایید، خوانایی کدهای شما ممکن است بیشتر شود (بخاطر اینکه اگر از دستور 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 قابل مشاهده نمی باشد و یک پنجره پیغام خالی نمایش داده خواهد شد.

نکته
در صورتی که در ماژول مثال بالا اعلان صریح متغیرها با استفاده از دستور Option Explicit تنظیم شده باشد، خط 24 باعث ایجاد خطای کامپایلر خواهد گردید.

میدان دید عمومی (Public scope)

متغیرهای عمومی گسترده ترین میدان دید را در میان متغیرها دارند. یک متغیر عمومی به وسیله هر ماژولی در پروژه تشخیص داده می شود.

متغیرهای عمومی ویژگی های زیر را دارند:

  • مانند متغیر ماژول در بالای ماژول، بالای اولین روال (سطح ماژول) اعلان می شود.
  • نمی تواند داخل روال اعلان شود.
  • متغیر عمومی همواره با استفاده از دستور Public اعلان می شود.

نکته
امکان اعلان متغیرهای عمومی با نام یکسان در دو ماژول متفاوت وجود دارد. برای اجتناب از اشتباه و بروز خطای کامپایلر از اسامی یکتا استفاده نمایید یا مخفف نام ماژول را قبل از نام متغیر استفاده نمایید (بعنوان مثال در ماژول با نام “Feb_Sales” می توانید تمام متغیرهای عمومی را با پیشوند “FS” قبل از نام متغیر اعلان نمایید).

نکته
توجه داشته باشید ایجاد متغیر با میدان دید عمومی فقط در ماژول استاندارد امکان پذیر است. بنابراین هر متغیری که با دستور 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

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