دستور Static | اعلان متغیر استاتیک درون روال در ویژوال بیسیک

دستور Static در سطح روال برای اعلان متغیرها و اختصاص فضای حافظه کاربرد دارد. متغیرهایی که با دستور Static اعلان می شوند تا زمانی که کد اجرا می شود مقدار خود را حفظ می نمایند.

Syntax:


Static varname [ ( [ subscripts ] ) ] [ As [ New type ], [varname [ ( [ subscripts ] ) ] [ As [ New type ]]

دستور Static از قسمت های زیر تشکیل شده است:

قسمت توضیحات
varname اجباری. نام متغیر؛ می بایست طبق کنوانسیون نامگذاری استاندارد متغیر تعیین شود.
subscripts اختیاری. ابعاد یک متغیر آرایه را تعیین می نماید؛ حداکثر تا 60 بعد می تواند اعلان گردد. آرگومان subscripts از ساختار زیر استفاده می نماید:
[ lower To ] upper [ , [ lower To ] upper ] . . .
وقتی کران پایین (lower) بصورت واضح تعیین نشود، کران پایین یک آرایه به وسیله دستور Option Base کنترل می شود. در صورتی که از دستور Option Base استفاده نشود کران پایین صفر خواهد بود.
New اختیاری. کلمه کلیدی که برای ایجاد مجازی یک شیء بکار می رود. اگر از New زمانی که متغیر شیء را اعلان می نمایید استفاده نمایید، یک نمونه جدید از شیء مرجع ایجاد می کند، بنابراین مجبور نیستید از دستور Set برای اختصاص شیء مرجع استفاده نمایید.
type اختیاری. نوع داده متغیر؛ ممکن است Byte، Boolean، Integer، Long، Currency، Single، Double، Decimal (در حال حاضر پشتیبانی نمی شود)، Date، String (برای String با طول متغیر)، String length (برای String با طول ثابت(، Object، Variant، یک نوع داده تعریف شده توسط کاربر و یا یک object type باشد. بند As type را برای هر متغیر که اعلان می نمایید جداگانه استفاده نمایید.

ملاحظات

بعد از اجرای ماژول کد، متغیرهایی که با دستور Static اعلان شده باشند مقادیرشان تا زمانی که ماژول اجرا و یا بازنشانی گردد حفظ می شود. در ماژول کلاس، متغیرهایی که با استفاده از دستور Static اعلان شوند مقادیرشان در هر نمونه از کلاس تا زمانی که آن نمونه نابود شود حفظ خواهد گردید. در ماژول فرم، متغیرهای استاتیک مقادیرشان تا زمانی که فرم بسته شود حفظ خواهد شد.

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

از یک دستور Static دریک روال برای اعلان نوع داده یک متغیر که مقدار آن میان فراخوان روال ها حفظ می شود استفاده نمایید. برای مثال، دستور زیر یک آرایه با اندازه ثابت از نوع داده عدد صحیح (integer) اعلان می نماید:


Static NumberOfEmployees(200) As Integer

دستور زیر یک متغیر به عنوان یک نمونه جدید از worksheet (کاربرگ اکسل) اعلان می نماید:


Static X As New Worksheet

اگر کلمه کلیدی New وقتی که یک متغیر شیء اعلان می گردد استفاده نگردد، متغیری که به شیء اشاره دارد، قبل از اینکه بتواند مورد استفاده قرار بگیرد باید توسط دستور Set به یک شیء موجود (شی ای که در Object Browser موجود باشد) انتساب گردد. تا زمانی که متغیر شیء اعلان شده به یک شیء خاص انتساب نگردد، مقدار خاص Nothing را خواهد داشت، که حاکی از آن است که به هیچ نمونه ای از یک شیء خاص اشاره ندارد. وقتی از کلمه کلیدی New در اعلان استفاده نمایید، یک نمونه از شیء از روی اولین ارجاع به آن شیء ایجاد می شود.

اگر در اعلان متغیر نوع داده یا نوع شیء را مشخص ننمایید، و دستور Deftype در ماژول استفاده نشده باشد، متغیر بصورت پیشفرض Variant می باشد.

نکته
دستور Static و کلمه کلیدی Static شبیه هم هستند، اما برای اهداف متفاوتی کاربرد دارند. اگر شما یک روال را با استفاده از کلمه کلید Static اعلان نمایید، بطور مثال:
 Static Sub CountSales ()  
فضای حافظه برای همه متغیرهای محلی درون روال یکبار تخصیص داده می شود، و مقدار متغیرها برای تمام زمان اجرای برنامه حفظ می شود. در مورد روال های غیراستاتیک، فضای حافظه برای متغیرها هر بار که روال فراخوان می شود اختصاص و زمان خروج از روال آزاد می شود.  روال استاتیک برای اعلان متغیرهای خاصی که در میان روال های غیراستاتیک مقادیرشان تا زمان پایان اجرای برنامه حفظ می شود کاربرد دارد.

وقتی متغیرها مقدار دهی اولیه می شوند (پس از اعلان متغیرها، VBA بصورت پیش فرض متغیرها را مقداردهی اولیه می نماید. توجه داشته باشد امکان مقداردهی خارج از روال توسط کاربر در زبان برنامه نویسی VBA وجود ندارد) متغیر عددی به صفر، متغیر string با طول متغیر به یک رشته خالی (“”)، متغیر string با طول ثابت با صفر پر میشود (بعنوان مثال اگر طول رشته ۳ باشد 000 مقداردهی اولیه می باشد). متغیرهای Variant به تهی (Empty) مقداردهی اولیه می شوند. هر عنصر از یک نوع متغیر کاربر با این فرض که هر یک از عناصر یک متغیر جداگانه هستند مقدار دهی اولیه خواهد شد.

نکته
وقتی از دستور Static درون روال استفاده می نمایید، به همراه بقیه دستورات اعلانی نظیر Dim آن را در ابتدای روال قرار دهید.

آیا می‌دانید:

آموزش VBA به شما امکان می‌دهد که با استفاده از اسکریپت‌های سفارشی، نرم‌افزارهای آفیس را به‌طور دقیق مطابق با نیازهای خود تنظیم کنید. این زبان قدرتمند می‌تواند بهره‌وری شما را در تمامی برنامه‌های آفیس افزایش دهد و کارهای تکراری و زمان‌بر را ساده‌تر کند.

مثال

این مثال از دستور Static برای نگهداری مقدار یک متغیر تا زمانیکه ماژول کد اجرا می گردد استفاده می نماید.


' تعریف تابع.
Function KeepTotal(Number)
	' فقط مقدار متغیر Accumulate به هنگام فراخوان تابع حفظ خواهد گردید.
	Static Accumulate
	Accumulate = Accumulate + Number
	KeepTotal = Accumulate
End Function 
 
' تعریف تابع استاتیک.
Static Function MyFunction(Arg1, Arg2, Arg3)
	' مقدار همه متغیرها به هنگام فراخوان تابع حفظ خواهند گردید.
	Accumulate = Arg1 + Arg2 + Arg3
	Half = Accumulate / 2
	MyFunction = Half
End Function

تحلیل کد:

روال غیراستاتیک: حدود تابع KeepTotal بین خطوط ۲ تا ۷ مشخص شده است. متغیر محلی Accumulate با استفاده از دستور Static درون این تابع در خط ۴ اعلان شده است. هر بار که تابع KeepTotal فراخوان شود مقدار متغیر Accumulate در آخرین فراخوان تابع حفظ و در خط ۵ آرگومان تابع به آن اضافه می شود.
روال استاتیک: حدود تابع استاتیک MyFunction بین خطوط ۱۰ تا ۱۵ مشخص شده است. تمامی متغیرهایی که درون این تابع استفاده شوند از نوع استاتیک تعیین می شود و مقادیر آنها مابین فراخوان های متعدد تابع (تا زمانی که برنامه اجرا می شود) حفظ خواهد گردید.
توجه داشته باشید که متغیر Accumulate درون روال های KeepTotal و MyFunction دو متغیر متفاوت می باشند، چرا که در سطح روال اعلان شده اند و فقط توسط روالی که درون آن اعلان شده است قابل دیدن می باشند.

منبع

Static statement

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