تا این بخش از آموزش های سایت با متغیر و ثابت آشنا شدیم؛ و دانستیم که می توانیم با استفاده از عملگرها و ترکیب آنها با متغیرها و ثابت ها عبارات منطقی و ریاضی ایجاد نماییم. در این بخش از آموزش های رایگان VBA می خواهیم با روال ها و انواع آن در VBA آشنا شویم.
تعریف روال
طبق تعریف واژه نامه VBE روال یا procedure دنباله ای نامگذاری شده از دستورها است که بعنوان یک بخش واحد اجرا می شود. این تعریف شامل سه بخش مهم می باشد:
- روال دنباله ای از دستورها می باشد.
- روال باید نامگذاری شده باشد.
- روال بعنوان یک بخش واحد توسط کامپایلر در نظر گرفته می شود.
VBA از روال ها برای دسته بندی دستورهایی که هدف مشترکی را دنبال می نمایند استفاده می نماید. در واقع می توان گفت روال ها در VBA کار انجام وظایف را بر عهده دارند.
انواع روال
روال ها در VBA سه نوع می باشند:
- روال Sub (سابروتین)
- روال Function (تابع)
- روال Property (ویژگی)
روال Sub
روال Sub یک دنباله از دستورات ویژوال بیسیک می باشد که توسط Sub و End Sub محصور شده اند. روال Sub عملیات انجام می دهد ولی هیچ مقداری را برنمی گرداند.
روال Sub می تواند یک یا چند آرگومان از نوع ثابت، متغیر و یا عبارت داشته باشد. آرگومان ها به هنگام اعلان روال در داخل پرانتزها قرار داده می شوند.
مثال
کد زیر یک نمونه از روال Sub می باشد:
Sub GetInfo()
Dim answer As String
answer = InputBox(Prompt:="اسم شما چیست؟")
If answer = Empty Then
MsgBox Prompt:="شما نام خود را وارد نکرده اید."
Else
MsgBox Prompt:="اسم من " & answer & " است"
End If
End Sub
تحلیل کد
خط ۱: همانطور که در تعریف گفته شد روال باید نامگذاری شود، برای همین منظور در این خط روال Sub با نام GetInfo اعلان شده است.
خط ۲: متغیر answer از نوع String اعلان شده است.
خط ۳: مقدار متغیر answer از طریق تابع داخلی InputBox از کاربر دریافت می شود.
خط ۴: در این خط مقدار متغیر answer با دستور If بررسی می شود و در صورتی که مقداری توسط کاربر وارد نشده باشد خط ۵ و در غیر این صورت خط ۷ اجرا خواهد گردید.
خط ۵ و ۷: در این خطوط با استفاده از تابع داخلی MsgBox پیغام به کاربر نمایش داده می شود.
خط ۸: این خط پایان دستور If را اعلام می نماید.
خط ۹: پایان روال Sub را اعلام می نماید.
روال Function
روال Function همانند روال Sub یک دنباله از دستورات ویژوال بیسیک می باشد با دو تفاوت که در این روال دستورات در میان Function و End Function محصور شده اند و تفاوت دیگر اینکه روال Function مقدار بازگشتی نیز می تواند داشته باشد.
روال Function می تواند همانند روال Sub یک یا چند آرگومان از نوع ثابت، متغیر و یا عبارت هایی که با فراخوانی یک روال به آن منتقل شده اند داشته باشد. در صورتی که تابع هیچ آرگومانی هم نداشته باشد نیز باید شامل دو پرانتز خالی باشد. مقدار برگشتی روال Function با اختصاص مقدار به نام آن در یک یا چند دستور تعیین می شود.
مثال
در مثال زیر تابع Celsius مقیاس فارنهایت را به سلسیوس تبدیل می نماید. وقتی که تابع توسط روال Main فراخوان می شود، یک متغیر حاوی مقدار آرگومان تابع به آن منتقل می شود. نتیجه محاسبات توسط تابع به روال فراخوان کننده برگردانده می شود و در پنجره پیغام برنامه نمایش داده می شود.
Sub Main()
temp = Application.InputBox(Prompt:= _
"لطفا مقدار دما را به فارنهایت وارد نمایید", Type:=1)
MsgBox "مقدار دما برابر است با " & Celsius(temp) & " درجه سانتیگراد"
End Sub
Function Celsius(fDegrees)
Celsius = (fDegrees – 32) * 5 / 9
End Function
تحلیل کد
خط ۱: در این خط روال Sub با نام Main اعلان شده است.
خط ۲ و ۳: این دو خط در واقع یک دستور می باشند که در دو خط شکسته شده اند. اگر انتهای خط دوم را نگاه کنید متوجه کاراکتر زیر خط (Underscore) خواهید شد. کاراکتر زیر خط برای شکستن خطوط در VBA کاربرد دارد. در این دو خط با استفاده از تابع InputBox مقدار دما با مقیاس فارنهایت از کاربر دریافت و در متغیر temp ذخیره می شود.
خط ۴: در این خط مقدار دما به سلسیوس با استفاده از فراخوانی تابع Celsius با آرگومان temp که قبلا از کاربر دریافت شده است توسط تابع MsgBox نمایش داده می شود. در این خط Celsius(temp) تابع Celsius را با آرگومان temp فراخوان می نماید. پس از فراخوان تابع محاسبات در تابع انجام می شود و مقدار برگشتی در پیغام ذخیره و به کاربر نمایش داده می شود. عملگر & در این خط برای تجمیع رشته ها بکار رفته است.
خط ۵: پایان روال Sub را اعلان می نماید.
خط ۷: در این خط روال Function با نام Celsius و آرگومان fDegrees اعلان شده است.
خط ۸: همانطور که ملاحظه می نماید مقدار برگشتی تابع در این خط محاسبه می شود. قبلا هم گفتیم که مقدار برگشتی تابع با اختصاص مقدار به نام آن تعیین می شود. در این خط نام تابع ( Celsius ) برابر با عبارت زیر تعیین شده است:
(fDegrees – 32) * 5 / 9
خط ۹: پایان روال Function را اعلان می نماید.
روال Property
روال property یک سری از دستورات ویژوال بیسیک می باشد که به برنامه نویس اجازه ایجاد و کنترل ویژگی های سفارشی را می دهد.
- روال property می تواند برای ایجاد ویژگی های فقط خواندنی ( read-only ) برای فرم ها ( forms )، ماژول استاندارد (standard module) و ماژول کلاس (class module) بکار رود.
- روال های property باید به جای متغیرهای عمومی ( Public variables ) در کد مورد استفاده قرار گیرد و وقتی اجرا شوند که مقدار ویژگی تعیین شده باشد.
- برخلاف متغیرهای عمومی ( Public variables ) می توانید برای روال property در مرورگر شیء (Object Browser) راهنما تعیین نمایید.
زمانی که روال property را در یک ماژول ایجاد نمایید، تبدیل به یک ویژگی برای روال مربوطه می شود. ویژوال بیسیک سه نوع از روال property را پشتیبانی می نماید:
روال | شرح |
Property Let | روالی که مقدار یک ویژگی را تعیین می نماید. |
Property Get | روالی که مقدار یک ویژگی را برمی گرداند. |
Property Set | روالی که مرجع یک ویژگی را تعیین می نماید. |
دستور زبان برای اعلان روال property به صورت زیر می باشد.
[ Public | Private ] [ Static ] Property { Get | Let | Set } propertyname [( arguments )] [ As type ] statements End Property
روال property معمولا بصورت جفتی استفاده می شود: Property Let همراه با Property Get، و Property Set همراه با Property Get. استفاده از هر سه روال ویژگی فقط برای داده از نوع Variant می تواند مفید باشد، چرا که فقط این نوع داده می تواند حاوی یک شیء و یا سایر انواع داده ها باشد. Property Set می تواند برای استفاده با اشیاء برنامه نویسی شود؛ Property Let نمی تواند.
آرگومان های موردنیاز برای اعلان روال property در جدول زیر نمایش داده شده اند.
روال | دستور اعلان |
Property Get | Property Get propname (1, …, n) As type |
Property Let | Property Let propname (1, …,,,, n, n +1) |
Property Set | Property Set propname (1, …, n, n +1) |
آرگومان های متناظر ۱ تا n باید در همه روال های property با نام یکسان ( propname ) هم نام و یک نوع داده داشته باشند.
اعلان روال Property Get یک آرگومان کمتر از اعلان روال های Property Let و Property Set می پذیرد. نوع داده روال Property Get باید همان نوع داده اعلان شده در آرگومان (n+1) روال Property Let و Property Set متناظر باشد. بعنوان مثال شما اگر روال Property Let زیر را اعلان نموده باشید، اعلان روال Property Get باید آرگومان های با نام و نوع داده مشابه در روال Property Let را داشته باشد.
Property Let Names(intX As Integer , intY As Integer , varZ As Integer )
' Statement here.
End Property
Property GET Names(intX As Integer , intY As Integer ) As Variant
' Statement here.
End Property
آرگومان نهایی اعلان شده در روال Property Set باید از نوع شیء و یا Variant باشد.
منابع:
Office VBA Reference
Writing a Sub procedure
Writing a Function procedure
Writing a property procedure
بیشتر بخوانید
توابع توکار VBA | لیست کامل توابع داخلی در ویژوال بیسیک
عملگرهای VBA | انجام عملیات روی داده ها و ایجاد عبارت ها
حلقه در VBA | ایجاد حلقه برای تکرار دستورات در ویژوال بیسیک
کدهای VBA | آشنایی با کدها و دستور زبان برنامه نویسی VBA
دستور IF | اجرای مشروط کد با استفاده از عبارت های شرطی و منطقی
آرایه در VBA | آرایه ها و کاربرد آن ها در برنامه نویسی
میدان دید متغیر در VBA | نحوه دسترسی به متغیرها در قسمت های مختلف پروژه