رویه ها در وی بی (VBA) یا توابع در ویژوال بیسیک
در وی بی (VBA) مجموعه ای از دستورات برای اجرای یک سری فعالیت را در یک رویه (Procedure) قرار میدیم که این رویه یا میتونه از نوع تابع (Function) باشه یا ساب (Sub). با ایجاد رویه، شما میتونید مجموعه دستوراتی رو برای انجام کارهای مختلف تعریف کنید و تو برنامه های خودتون ازشون استفاده کنید. با این روش توابع در ویژوال بیسیک ایجاد می شوند.
تفاوت اصلی بین یک تابع و ساب اینه که تابع یک خروجی خواهد داشت در حالیکه یک رویه این خروجی رو نداره.
برای همین اگه قصد دارید کارهایی رو انجام بدید که باید نهایتا یک نتیجه رو به شما بده ( به عنوان مثال جمع مجموعه ای از اعداد) معمولا بادی از یک تابع استفاده کنید. اما اگه فقط قصد دارید که یک سری فعالیت انجام بشن که لزوما خروجی هم نداشته باشه یک ساب راه حل مناسبی هست. پس شما باید تعیین کنید که از کدام استفاده بشه.
قبل از شروع کار با این رویه ها بهتره یکسری موارد مشترک رو بین اون دو یاد بگیریم.
آرگومان ها
رویه ها در وی بی (VBA) میتونن با استفاده از آرگومان ها اجرا بشن. این آرگومان ها در بخش تعریف آنها مشخص شده اند. به عنوان مثال شما میتونید یک ساب تعریف کنید که یک عدد رو به تمام سلول های انتخاب شده در شیت اضافه کنه. شما میتونید این عدد رو به صورت آرگومان به ساب بدید تا این کار رو برای شما انجام بده:
۱ ۲ ۳ ۴ ۵ |
Sub AddToCells(i As Integer) . . . End Sub |
[irp posts=”۹۴۳۷″ name=”تعریف متغیر ها و ثابت ها در وی بی (VBA) | قسمت اول”]
وجود آرگومان ها برای ساب یا تابع الزامی نیست و میتونه بدون آنها کار کنه.
آرگومان های اختیاری
بعضی توابع و ساب ها آرگومان های اختیاری دارند (حتما شما چند مورد از این آرگومان ها رو در توابع مختلف دیدید، آرگومان آخر تابع Vlookup یک نمونه از این موارد هست). شما هم میتونید برای توابع و ساب های خودتون آرگومان های اختیاری تعریف کنید. این آرگومان ها میتونن توسط کاربر پر بشن یا نشن.
در زمان استفاده از توابع یا ساب هایی که آرگومان اختیاری دارن امکان وارد کردن اون آرگومان ها وجود داره، اما در صورتیکه مقداری بهشون داده نشده، یک مقدار اولیه به جای اون آرگومان درنظر گرفته میشه.
با توجه به مثال بالا اگر بخوایم عددی که به محدوده اضافه بشه اختیاری باشه، ساب رو به صورت زیر تعریف میکنیم:
۱ |
Sub AddToCells(Optional i As Integer = ۰) |
تو این حالت مقدار اولیه این آرگومان صفر هست که اگه کاربر مقدار خودش رو وارد کنه به جای صفر قرار میگیره و به محدوده اضافه میشه.
شما میتونید چندین آرگومان اختیاری در رویه های وی بی استفاده کنید به شرطی که تمام آرگومان های اختیاری همه بعد از آرگومان های اجباری قرار بگیرن
انتقال آرگومان با مرجع یا با مقدار
زماینکه آرگومان ها به رویه ها داده میشن به دو صورت میشه با اونها رفتار کرد:
با مقدار (ByVal) – در این حالت تنها مقدار اون آرگومان منتقل میشه به این معنی که یک کپی از اون رو منتقل میکنه. بنابراین هر تغییری که درون رویه بر روی آرگومان انجام میشه تأثیری بر اصل آرگومان نداره و آرگومان در حالت اولیه خودش میمونه.
با مرجع (ByRef) – در این حالت مقدار آرگومان به صورت اصلی (نه کپی) منتقل میشه. در این حالت هر تغییری که در طول رویه بر روی آرگومان ایجاد میشه برای روی اصل آرگومان هم اعمال میشه و بعد از تمام شدن رویه دیگه مقدار آرگومان تغییر کرده.
برای اینکه تعیین کنیم آرگومان به چه صورت به رویه منتقل بشن (با مقدار یا با مرجع) از کلمات ByRef یا ByVal استفاده میکنیم.
به رویه های زیر دقت کنید:
۱ ۲ ۳ ۴ ۵ |
Sub AddToCells(ByVal i As Integer) . . . End Sub |
در این حالت آرگومان i به صورت مقداری منتقل میشه و هر تغییری که درون رویه بر روی متغیر i ایجاد میشه در پایان رویه از بین میره و تغییری در مقدار i نخواهد داشت (در واقع تنها میتونه از مقدار متغیر i استفاده کنه)
۱ ۲ ۳ ۴ ۵ |
Sub AddToCells(ByRef i As Integer) . . . End Sub |
در این حالت آرگومان به همراه مرجع منتقل میشه و هر تغییری که در طول اجرای دستورات رویه بر روی i ایجاد میشه حفظ میشه و در انتهای رویه مقدار i هم تغییر خواهد کرد.
به صورت پیشفرض آرگومان های یک رویه به همراه مرجه به رویه منتقل میشن. بنابراین اگه از هیچکدام از کلمات ByVal و یا ByRef استفاده نکنید به معنی انتقال آرگومان با مرجع هست.
تو این آموزش درباره رویه ها (Procedures) صحبت کردیم و گفتیم که دو نوع هستند: ساب (Sub) و تابع (Function) و تقریبا متوجه شدیم که توابع در ویژوال بیسیک چطور ایجاد می شوند. همینطور یاد گرفتید که چطوری آرگومان اختیاری برای هر کدوم از این رویه ها ایجاد میشه و نهایتا نحوه تعیین نوع انتقال آرگومان به رویه رو دیدید.
تو آموزش های بعدی نحوه کار با هر یک از این رویه ها رو توضیح میدیم و اینکه چطوری با آرگومان ها درون رویه ها کار کنیم.
سلام
وقت بخیر
من یه تاریخ رو میخام با هر کلیک رو باتوم ،مقداری افزایش بدم ولی نمیدونم چطور.
تابع dateadd هم استفاده کردم ولی جواب نمیده.
مثلا میخام به تاریخ فعلیم با هر کلیک ۲ دقیقه اضافه بشه و این تاریج جدید دوباره به عنوان ورودی باشه و این روند با هر بار کلیک تکرار بشه
ممنون میشم اگر راهنمایی کنید چکار باید بکنم
درود بر شما
میتونید بدون کدنویسی و با استفاده از spin button شمارنده بذارید و مقدارشو به دقیقه تبدیل کنید
عدد۱ برای اینکه به ۲ دقیقه تبدیل بشه باید به ۲۴ و ۶۰ تقسیم بشه و در ۲ ضرب بشه
۲۴/۶۰*۲
سلام
با استفاده از وی بی ای فرمولهایی نوشتم که مثلاً از شیت یک و سلول c1را در سلول g1 کپی کنه
حالا اگه یک ستون بین a و b ایجاد کنیم در وی بی ای فرمول مربوط به c1 و g1 تبدیل به d1وf1 نمیشود
چکار باید کرد
سلام
از تابع Cells استفاده کنید که با استفاده از شماره سطر و ستون به سلول دسترسی داشته باشید.
با سلام حضور محترم جناب آقای مهندس چراغی عزیز
وبا تشکر ویژه بابت سایت بسیار کاربردی و آموزندتون بالاخره یکی پیدا شد که این نرم افزار قدرتمند رو آموزش اصولی بده و تبریک میگم به شما و تیم توانمندتون .
من یک نرم افزار فروش و حسابداری و انبار داری با اکسل ۹۵ برای خودم { فست فود ) طراحی کردم و تا امروز آپدیت کردم به ۲۰۱۶ که از همه نظر نیازهامو براورده میکنه
فقط جدیدا میخواستم رقم جمع فاکتورم رو بفرستم به پورت com3 که دستگاه کارت خوان بانک بوسیله کابل USP به اون متصل هست تا مشتری فقط رمزشو بزنه و دیگه لازم نباشه رقم خرید رو وارد کنه تا هم سرعت کار بره بالا و هم کمتر اشتباه بشه ولی نمیدونم کدش رو دقیقا چطور بنویسم
در ضمن درایور دستگاه پوز و فایل dll رو بانک بهم داده ولی چون برنامم عمومی نیست مسئولین فنی بانک گفتند قسمت داخلی برنامه رو خودت باید تنظیم کنی و هیچ کمکی نکردند
از شما و تیم خوبتون کمک و راهنمایی میخواستم
با تشکر و سپاس فراوان
با سلام و تشکر از لطفتون
موردی که میفرمائید فقط از طریق VBA انجام میشه و دقیقا پیش نیاز اون اینه که توابع موجود و ساختار آنها رو در فایل dll شناخته بشه و بر اساس اون بشه این ارتباط رو برقرار کرد.
ممکنه راهنمای این توابع رو در نت یا سایت سازنده دستگاه بتونید پیدا کنید.
با سلام
ممنون از راهنمایتون دقیقا مشکل منم همینه ، فایل dll رو هر جای کامپیوتر که کپی میکنم در قسمت avilable references VBE دیده نمیشه تا بتونم از توابعش استفاده کنم .
راهنمای توابع رو دارم ، بانک اونارو در قالب یک فایل pdf داخل پکیج dll بهم داده .
به نظر شما فایل dll رو کجا بریزم تا توسط VBE شناخته بشه ؟
متأسفانه به این عمیقی درگیر چنین مشکلی نبودم و ساختار دقیق فایل های dll رو جهت حل این مشکل نمیشناسم اما با جستجویی که کردم ممکنه دو صفحه زیر بهتون کمک کنه:
اضافه کردن فایل dll به VBA از سایت مایکروسافت
رفرنس دوم
ممنون میشم درصورتیکه راه حل قطعی مشکل رو پیدا کردید بنده رو هم مطلع سازید.
تشکر و پوزش بابت عدم ارائه پاسخ نهایی
اختیار دارید جناب آقای مهندس ، ممنون بابت وقتی که گذاشتید .
حتما در صورت آگاهی ، شما را مطلع خواهم کرد ، ولی چون فایل dll با #C نوشته شده به نظرم باید از یک برنامه نویس حرفه ای که مسلط به #C و VB باشه سوال کنیم .
اگر شما کسی رو تو دوستان و آشنایانتون دارید که ممنون میشم .
تشکر،
احساس میکنم این مسئله بیشتر با یک متخصص #C حل بشه، چند تا از کامنت هایی که میخوندم راه حل های مرتبط با این قضیه داده بودن و در نوع ذخیره فایل dll راهکار هایی داده بودند.