دستور 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 می باشد.
وقتی متغیرها مقدار دهی اولیه می شوند (پس از اعلان متغیرها، VBA بصورت پیش فرض متغیرها را مقداردهی اولیه می نماید. توجه داشته باشد امکان مقداردهی خارج از روال توسط کاربر در زبان برنامه نویسی VBA وجود ندارد) متغیر عددی به صفر، متغیر string با طول متغیر به یک رشته خالی (“”)، متغیر string با طول ثابت با صفر پر میشود (بعنوان مثال اگر طول رشته ۳ باشد 000 مقداردهی اولیه می باشد). متغیرهای Variant به تهی (Empty) مقداردهی اولیه می شوند. هر عنصر از یک نوع متغیر کاربر با این فرض که هر یک از عناصر یک متغیر جداگانه هستند مقدار دهی اولیه خواهد شد.
مثال
این مثال از دستور 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
دو متغیر متفاوت می باشند، چرا که در سطح روال اعلان شده اند و فقط توسط روالی که درون آن اعلان شده است قابل دیدن می باشند.
منبع
بیشتر بخوانید
دستور Dim: اعلان متغیرها و اختصاص فضای حافظه
انواع داده VBA: راهنمای انواع داده و محدوده مقادیر آنها
دستور Option Explicit | نحوه اعلان متغیرها در ویژوال بیسیک
دستور ReDim | تغییر اندازه و ابعاد آرایه پویا در ویژوال بیسیک
عملگر Like: مقایسه و تطبیق رشته ها با یکدیگر در VBA
دستور Static | اعلان متغیر استاتیک درون روال در ویژوال بیسیک