در محیط برنامهنویسی VBA، در پنجره Mudule چند جور می توان برنامه نویسی کرد:
بخش اول: تعیین کلیات و ایجاد مقدمات برنامه نویسی
بخش دوم: زیر بخش های هر ماژول(Subها و Functionها)
منظور از این بخش اول، همان خطی است که در آن عبارت زیر را مشاهده می کنید:
Option Compare Database
در این بخش می توانید تعیین کنید که Module چگونه کار کند، یا از چه متغییرهایی(عمومیGlobal، اختصاصی Private) استفاده کند کدام dllهای ویندوز، یا DLLهایی را که خودتان تولید کرده اید را استفاده کند.فعلا به این بخش کاری نخواهیم داشت.
زیر بخشها:
دو نوع زیر بخش می توانید ایجاد کنید، که در واقع در هر زیر بخش کدهای برنامه نویسی خود را تایپ می کنیم.
- زیر بخش از نوع Sub
- زیر بخش از نوع Function
فرقی که Sub با Function دارد به به قابلیت برگشت مقدار به برنامه ای دارد که آنرا فراخوانی کرده است.
مثلا یک زیر بخش یا یک زیر برنامه به نام زیر برنامه اصلی ()Sub Main، می سازیم و در آن یک پیام به کاربر می دهیم.
Sub main()
MsgBox "Hello"
End Sub
اکنون می خواهیم در همین زیر برنامه که دیگر به آن برنامه اصلی خواهیم گفت -چون نام زیر برنامه را زیر برنامه اصلی()Sub Main، گذاشته ایم- درخواست ورود یک مقدار از کاربر می کنیم.
Sub main()
InputBox "", "", ""
End Sub
در مرحله بعد می خواهیم عبارتی را که از کاربر دریافت کرده ایم را نمایش دهیم:
Sub main()
MsgBox InputBox ("", "", "")
End Sub
همانطور که می بینید در این بخش دو پرانتز به خط اضافه شده است؛ این سئوال باید پیش بیاید، آیا نمی شد به این صورت این خط را بنویسیم؟
Sub main()
MsgBox InputBox "", "", ""
End Sub
پاسخ خیر است. اما چرا؟
در این خط دو دستور قرار دادهایم، یکی MsgBox که منجر به نمایش پیام می شود، و دیگری دستور InputBox با سه پارامتر اجباری که همگی از نوع جملهای(String) هستند، و من از عبارتهای خالی برای این یه پارامتر استفاده کردهام.
هر دستور خودش یک Sub یا Functions است که نیاز به تعریف ندارد.
اگر انتظار نداشته باشم که یک دستور مقداری را باز گرداند، نباید پارامترهای دستور را داخل پرانتز()، قرار دهیم؛ اما اگر انتظار داشته باشیم، مقداری را بازگرداند، اولا باید دستور قابلیت برگشت مقدار را داشته باشد یعنی نوعی Function باشد، و ثانیا باید بعد از دستور از علامت پرانتز() استفاده کنیم، و اگر پارامترهایی باید به دستور بدهیم باید، پارامترها را داخل پرانتز قرار دهیم و آنها را با , از هم جدا کنیم.
دستور Msgbox خودش می تواند مقداری را بازگرداند!
اما ما در اینجا چنین انتظاری از آن نداریم.
مثلا این دستور را ببنید:
MsgBox MsgBox("")
معنی دستور بالا یعنی: نمایش مقدار برگشت داده شده، از اجرای دستور MsgBox
یعنی ("")MsgBox مقداری را باز خواهد گرداند، و MsgBox سمت چپ(یعنی MsgBox اولی)، این مقدار را نمایش خواهد داد.
چند خط بالاتر این عبارت را نگاه کنید:
«دستور InputBox با سه پارامتر اجباری که همگی از نوع جملهای(String) هستند،»، دستور MsgBox هم دارای یک پارامتر اجباری است و به همین دلیل مجبور هستیم داخل پرانتز از عبارت "" استفاده کنیم، یعنی یک پارامتر باید به Function یا دستور داخلی MsgBox وارد کنیم، موقعی که انتظار نداریم Msgbox، مقداری را بازگرداند پارامتر به MsgBox داده می شود، اما این پارامتر داخل پرانتز نیست:
Sub main()
MsgBox "Hello"
End Sub
حالا بیایید با آنچه که تا کنون گفته ایم کمی کار کنیم:
می خواهم یک Sub تولید کنم که هیچ پارامتر اجباری نداشته باشد، سپس آنرا اجرا کنم.
یک Sub به نام My_Box، که فقط پیامی را به عنوان پیش فرض نمایش می دهد.
Sub main()
My_Box
End Sub
Sub My_Box()
MsgBox "Hello"
End Sub
My_Box در زیر برنامه اصلی صدا زده شده، اما پارامتری به آن داده نشده؛ خروجی این برنامه، نمایش پیام Hello است؛ و همیشه Hello را نمایش می دهد.
طرح یک سئوال و پاسخ به آن:
آیا می توانیم یک زیر برنامه ایجاد کنیم که هم پارامتر ورودی بتواند بگیرد و هم اگر به آن پارامتر نخواهیم بدهیم کار کند؟
ببینید که چرا این سئوال را از خودمان پرسیده ایم؟
وقتی دستور My_Box را اجرا می کنیم فقط پیام Hello نمایش داده می شود، و نمی توانیم پیامی بجز Hello را نمایش دهیم، آیا می توانیم از هر دو امکان استفاده کنیم؟
یعنی: هم اگر نخواستیم پارامتری به زیر برنامه بدهیم، زیر برنامه به درستی کار کند، و اشکالی پیش نیاید؛ و هم اگر پیامی به آن دادیم پیام را نمایش دهد؟!
پاسخ کوتاه به این سئوال «بله» است.
اما برای پاسخ تشریحی به این سئوال باید دو مطلب را یادبگیرید:
- چگونه برای یک زیر برنامه پارامتر تعیین کنیم؟
- چگونه پارامتر را دلخواه، و غیر اجباری کنیم؟
چگونه برای یک زیر برنامه پارامتر تعیین کنیم؟
Sub main()
My_Box "Hello"
End Sub
Sub My_Box(parameter)
MsgBox parameter
End Sub
در این دو زیر برنامه ای که بالا ساخته ایم، پارامتری اجباری برای زیر برنامه My_Box تنظیم شده است؛ عبارت Paremeter در این بخش شبیه به ظرفی عمل می کند که عبارت Hello را با خودش به Sub وارد می کند و همین عبارت را جلوی دستور MsgBox قرار می دهد.
به اصلاح به Parameter متغییر می گویند، چونکه مقدار داخل اش توسط شما قابل تغییر است.
چگونه پارامتر را دلخواه، و غیر اجباری کنیم؟
Sub main()
My_Box
End Sub
Sub My_Box(Optional parameter="Hello")
MsgBox parameter
End Sub
در این دو زیر برنامه ای که بالا ساخته ایم، پارامتر زیر برنامه My_Box دارای مقدار پیشفرض شده و غیر اجباری شده است.
مقدار پیشفرض با اضافه کردن عبارت "Hello"= داخل پرانتز، و غیر اجباری شدن پارامتر با عبارت Optional انجام شده.
تا اینجا اگر بجای عبارت Sub از Function استفاده کنید، هیچ اشکالی پیش نخواهد آمد.
اما از اینجا به بعد می خواهیم از معنی واقعی Function استفاده کنیم، پس باید جایی که Function نیاز است، Function بنویسیدو جایی که به Sub نیز است، Sub بنویسید.
اصولا وقتی Function را نیاز خواهیم داشت که بخواهیم مقداری را از دستوری که function را فراخوانی کرده بدست آوریم. یک مثال می زنم.
شما فرماندهی هستید و دو سرباز دارید، که هر دو متخصص تخریب هستند، دو پُل در جَنگ وجود دارد که باید تخریب شوند، یکی از سربازها را با مقداری مُهمات برای تخریب پل اول، مامور می کنید.
سرباز اول sub است به نام solider او به پل می رسد و آنرا تخریب می کند و سپس پیش شما بر می گردد.
Sub Solider()
Delete The Bridge
End sub
سرباز دوم را با مقداری مهمات برای تخریب پُل دوم، مامور می کنید.
سرباز دوم function است به نام modern_solider او به پُل می رسد و آنرا بمبگذاری می کند، اما آنرا تخریب نمی کند و سپس پیش شما بر می گردد، او برای شما یک Remote Control یا یک کنترل از را دور بیسیم می آورد و به شما می گوید این کنترل تخریب پل است.
Function modern_solider() as Boolean
Bombing The Bridge
End function
اکنون می توانید با استفاده از ریموت کنترل، کنترل بهتری روی تخریب پُل داشته باشید، حتی ممکن است پُل را تخریب نکنید، یا در زمان مناسب تری آنرا تخریب کنید.
برای استفاده از Function در محیط VBA مثالی می زنیم:
این مثال کار جدید و خاصی انجام نمی دهد، فقط شما را با نحوه استفاده از Function آشنا می کند.
Sub main()
MsgBox MY_Input()
End Sub
Function MY_Input() as Variant
MY_Input=InputBox ("","","")
End function
روال اصلی(main) یک تابع(function) را صدا می زند و مقدار برگشتی آنرا به صورت یک پیام نمایش می دهد.
تابع (function) که نامش MY_Input است، هیچ پارامتری دریافت نمی کند، فقط عبارتی را از کاربر دریافت می کند. سپس این عبارت را باز می گرداند.
وقتی تابع(function)یی را تعریف میکنید باید تعیین کنید که چه نوع مقداری را باید بازگرداند، البته در VBA می توانید تعیین کنید مقدار از هر نوعی میتواند باشد (Variant)، پس از فراخوانی تابع همان نام تابع شبیه به ظرفی(متغییری) عمل می کند و حاوی مقداری خواهد شد که برگردانده.
یعنی در sub به نام main ، می توانید تصور کنید که در متغییری به نام My_Input مقدار وجود داردکه از همین تابع(function) بدست آمده.