در مقالات قبلی با تعریف Procedure و همینطور ماژول ها که پروسیژر ها را در خود جا میدهند آشنا شدیم. یادآور میشویم پروسیژر ها مجموعه ای از کد ها هستند که در کنار یکدیگر برای انجام هدفی خاص نوشته شده اند، پروسیژر ها در ماکرو نویسی اکسل به سه دسته تقسیم میشوند که هرکدام به منظور خاصی نوشته میشوند و نمیتوانند کار یکدیگر را انجام دهند.
پروسیژر در ویژوال بیسیک
نمودار زیر دسته بندی پروسیژر ها در ماکرو نویسی اکسل را ترسیم مینماید:
ایجاد Procedure در ماژول
پروسیژرها در ویژوال بیسیک در محیط ماژول ها بوجود می آیند، ابتدا باید برای Projectخود ماژول ایجاد نمایید، با نحوه ی ایجاد ماژول ها، تغییر نام آنها و انواع آن ها در مقالات قبلی آشنا شده ایم.
وارد پنجره کد نویسی ماژول شده و از منوی Insert گزینه ی Procedure را انتخاب نمایید. پس از انتخاب این گزینه پنجره ایجاد procedure برای شما فعابپل شده و میتوانید پروسیژر دلخواه را ایجاد نمایید.
در اینجا طبق تعریف project در ویژال بیسیک، هر فایل اکسلی که شما بر روی آن ماژول ایجاد میکنید Project شما محسوب میشود، به عبارتی Workbook شما در اکسل همان Project در ویژوال بیسیک است.
انواع پروسیژر در ماکرو نویسی اکسل
پروسیژر ها در ماکرو نویسی در اکسل به سه دسته تقسیم میشوند:
- Sub یا Sub Procedures
- توابع یا Functions
- Property Procedures
پروسیژر Sub در ویژوال بیسیک
پروسیژر های نوع ساب، با عبارت Sub شروع شده و با عبارت End Sub تمام میشوند، کدهای (Statements) قرار گرفته در بین این دو عبارت همگی جزیی از این پروسیژر بوده و با هم اجرا میشوند، پروسیژر نوع ساب غالباً برای انجام یک آنالیز مورد بررسی قرار میگیرد، همانطور که قبلاً ذکر شده، تمام پروسیژر ها میتوانند حین اجرا از پروسیژرهای دیگر استفاده نمایند.
خروجی پروسیژر نوع Sub را نمیتوان برابر با عبارتی خاص در نظر گرفت، به عبارتی دیگر خروجی پروسیژر Sub میتواند مقدار یک متغیر تعریف شده در مساله و یا انجام یک عملیات خاص و ارایه ی یک گزارش باشد. اما در مقایسه، پروسیژر نوع Function مانند همان توابع قابل استفاده در اکسل، یک خروجی با فرمت مشخص تولید میکند که میتواند به یک متغیر اختصاص یابد.
پروسیژر ساب به صورت زیر نوشته میشود:
1 2 3 |
Sub Excelpro () ‘Expressions/ Codes / Statements End Sub |
در اینجا نام ساب Excelpro میباشد، پرانتز های قرار گرفته در جلوی نام ساب، به صورت پیش فرض خالی هستند و نام آرگومان های Sub در آن نوشته میشود، آرگومان های Sub میتوانند از نوع Variable، Constant و یا Expression باشند، در آینده با آنها بیشتر آشنا خواهیم شد ولی در حال حاضر نیازی به تعریف آرگومان برای پروسیژر هایمان نداریم. در مقاله ای جداگانه ساختار Sub Procedure ها مورد بررسی بیشتر قرار خواهد گرفت.
پروسیژر Function در ویژوال بیسیک
با توابع در اکسل آشنایی داریم، به وسیله ی ویژوال بیسیک میتوان توابع شخصی برای فایل های اکسل خود ایجاد نماییم که در اکسل به آن ها User Defined Function گفته میشود. در ویژوال بیسیک برای تعریف و ایجاد توابع باید از پروسیژر نوع Function استفاده کنیم، همانند Sub، پروسیژر نوع فانکشن با Function شروع شده و با End Function تمام میشود.
همانطور که گفته شد، پروسیژر نوع فانکشن میتواند برابر با یک مقدار خاص باشد و میتوان یک متغیر را به خروجی آن نسبت داد که این کار برای پروسیژر نوع Sub مقدور نیست.
پروسیژر فانکشن به صورت زیر نوشته میشود:
1 2 3 |
Function Excelpro (VarA, VarB) Excelpro = VarA + VarB End Function |
در اینجا نام فانکشن Excelpro میباشد، پرانتز های قرار گرفته در جلوی نام فانکشن، به صورت پیش فرض خالی هستند و نام آرگومان های Function که در توابع اکسل به عنوان آرگومان های ورودی توابع با آن ها اشنا هستیم در آن نوشته میشود، آرگومان های Function میتوانند از نوع Variable، Constant و یا Expression باشند، در آینده با آنها بیشتر آشنا خواهیم شد. توابع با اختصاص دادن نام خودشان به عنوان یک متغیر مقدار گیرنده در کد های نوشته شده میتوانند مقدار خروجی داشته باشند. مثلاً خروجی تابع فوق مجموع دو آرگومان ورودی میباشد.
پروسیژر نوع Property
پروسیژر های نوع Property مجموعه ای از کدها و Statements هستند که به برنامه نویس اجازه میدهند Properties دلخواه خود را ایجاد و ویرایش نماید. پروسیژر های نوع پروپرتی میتوانند برای ایجاد Read-Only Properties برای فرم ها و انواع ماژول ها مورد استفاده قرار گیرند.
فرض کنید ما یک اتومبیل داریم ، برای این اتومبیل میتوانیم ویژگی های مختلفی تعریف نماییم مانند رنگ، سال ساخت، کارخانه سازنده و … به عنوان مثال، رنگ اتومبیل را میتوانیم به عنوان یک ویژگی برای اتومبیل تعریف کنیم که میتواند مقادیری از جنس آبی، سبز، مشکی و… باشد. اگر در این مثال اتومبیل را یک ماژول و یا فرم (میتوان آن را به صورت کلی یک Object در نظر گرفت) در نظر بگیریم، رنگ اتومبیل یک Property میباشد که از طریق پروسیژر نوع Property میتوان آن را برای اتومبیل تعریف کرده و نوع آن را مشخص کنیم. در این حالت در مثال اتومبیل میتوان نوشت:
“رنگ اتومبیل آبی است”
و مشابه آن در ویژوال بیسیک میتوانیم بنویسیم:
Object.Color=Blue
در اینجا Color پروپرتی اختصاص یافته به شی Object میباشد که مقدار آن Blue است که Blue در واقع خود یک Constant تعریف شده میباشد.
منظور از Read-Only Properties مواردی هستند که صرفاً قابل گزارش میباشند و قابل تغییر نیستند، فرض کنید در مثال فوق برند تمام اتومبیل ها فقط قرار است Mercedes-Benz باشد، در این حالت Property برند اتومبیل به عنوان یک Read-Only Property برای اتومبیل میباشد که مقدار آن همواره Mercedes-Benz است.
عبارت “Object.Brand” همواره معادل Mercedes-Benz میباشد. در آینده مفصلاً پروسیژر نوع Property مورد بررسی قرار خواهد گرفت.
حوزه اعتبار Procedure
در هر Project ممکن است شما چندین ماژول داشته باشید، هر ماژول میتواند محتوی تعدادی Procedure با انواع مختلف باشد. همانطور که قبلاً ذکر شد در پروسیژر ها همواره میتوانید Procedure های دیگر را فراخوانی نموده و بخشی از عملیات را با آنها انجام دهید.
حوزه ی اعتبار یا Scope هر Procedure امکان فراخوانی پروسیژر را در ماژول ها تعیین مینماید، اگر شما قبل از عبارت شروع هر پروسیژر مانند Sub کلمه ی privet را بنویسید (مانند Privet Sub …..) به این معنی است که آن پروسیژر تنها در همان ماژولی که قرار گرفته قابل فراخوانی است و در ماژول های دیگر شناخته شده نیست و اگر کلمه ی Public نوشته شود آن پروسیژر را در تمام ماژول ها قابل استفاده مینماید.
به صورت پیش فرض نوشتن کلمات Public و Privet قبل از Procedure ها اجباری نیست و میتوانید بدون مشخص کردن Scope کار خود را انجام دهید.
مقاله ی تعریف متغیرها در ویژوال بیسیک شما را در درک مفهوم حوزه اعتبار یاری خواهد نمود.
ساختار Procedure ها
هر پروسیژر بنا به نوع آن با یک Statement شروع و به پایان میرسد، در بین این دو خط کدهای نوشته شده همگی در غالب همان پروسیژر قابل اجرا میباشند و یک هدف واحد را دنبال میکنند.
پس از ایجاد پروسیژر باید متغیرهایی که در آن مورد استفاده قرار میگیرند را تعریف کنیم و بعد از آن کدهای ویژوال بیسیک قرار دارند که در مقالات بعدی به تفصیل مورد بررسی قرار خواهند گرفت.
بسیار کامل و جامع توضیح دادید.ممنون از سایت خوبتون.
منتظر مقالات بعدی هستم.
متشکرم، حتماً، لطفاً در خبرنامه عضو باشید که در جریان انتشار مقالات قرار بگیرید.
ممنون ازمطالبتون،لطفا ردیفهای مطالب یادگیری ماکرو را باطبقه بندی ذکر کنید تا بطور سلسله مراتب بتونیم جلو بریم مرسی
خواهش میکنم، مقالات مقدماتی ماکرو نویسی را به ترتیب از بالا به پایین مطالعه کنید، تنها استثنا، مقاله ی “ذخیره و انتقال ماکرو” را به عنوان مقاله ی سوم خود در روند یادگیری مطالعه کنید، موفق باشید.
با تشکر موفق باشید.
خواهش میکنم، موفق باشید.
با سلام و تشکر از مطالب مفیدتون
آیا امکانش هست به عنوان مثال semidifferentiate رو به عنوان یک پروسیژر sub بنویسید؟
مرسی
سلام، خواهش میکنم، لطفاً در قسمت پرسش و پاسخ کد مورد نیاز را با جزییات توضیح دهید تا دوستان علاقمند برای شما کد نویسی کنند. موفق باشید.