اکثر خوانندگان از قبل می دانند که می توانید توابع و زیر روال ها را با استفاده از VBA ایجاد کنید. این تفاوتی با آن چیزی که تحت نام ویژوال بیسیک VBA است، ندارد. به طور معمول، زمانی که کادر محاورهای ماکروها را نمایش میدهید، یک ماکرو در لیست ماکرو نشان داده میشود ( Alt+F8 را فشار دهید )، مگر اینکه یکی از سه شرط رعایت شود:
- ماکرو یک تابع است. توابع معمولاً اطلاعات را برمیگردانند و نیاز به انتقال اطلاعات به آنها دارند. از آنجایی که اجرای یک ماکرو از لیست ماکرو اجازه نمی دهد هیچ یک از این موارد اتفاق بیفتد، اکسل نشان می دهد که نیازی به فهرست کردن آن نیست. توابع تعریف شده توسط کاربر، که در اکسل کاملاً مفید هستند، در کادر محاورهای ماکروها نمایش داده نمیشوند، زیرا در نهایت، توابع هستند.
- ماکرو یک زیربرنامه با پارامترها است. اکسل فرض می کند که از آنجایی که پارامترها ضروری هستند و شما نمی توانید با انتخاب زیربرنامه از لیست ماکرو پارامترها را ارائه دهید، نیازی به لیست کردن آن نیست.
- زیربرنامه خصوصی اعلام شده است. این بدان معنی است که زیربرنامه فقط برای کدنویسی در ماژولی که در آن اعلام شده است مفید است.
تنها نوع ماکرو فهرست شده در کادر محاورهای ماکروها، یک برنامه فرعی غیر خصوصی و بدون پارامتر است. با این حال، در شرایط خاص، ممکن است آن موارد ذکر شده را نیز نخواهید. به عنوان مثال، ممکن است برخی از زیربرنامه های جهانی ایجاد کرده باشید که اگر به تنهایی فراخوانی شوند، هیچ کار مفیدی انجام نمی دهند. آنها طوری طراحی شده اند که از کدهای دیگر فراخوانی شوند. به عنوان مثال، ماکرو زیر را در نظر بگیرید:
Sub MySub()
MsgBox "We are running the macro"
End Sub
این ماکرو در کادر محاوره ای Macros ظاهر می شود. اگر نمیخواهید ظاهر شود، چندین راهحل وجود دارد که میتوانید دنبال کنید، که همه آنها با بررسی سه روش حذف ماکروها از فهرست کلان آشکار میشوند. اولین راه حل بالقوه این است که کد خود را بررسی کنید و بفهمید که آیا واقعا "جهانی" است یا خیر. آیا به کد بیش از یک ماژول نیاز دارید؟ اگر این کار را نکردید، زیرروال را Private اعلام کنید. در کادر محاوره ای ماکروها ظاهر نمی شود. بنابراین، ماکرو مشکل قبلی به صورت زیر می شود:
Private Sub MySub()
MsgBox "We are running the macro"
End Sub
راه دوم برای مخفی کردن ماکرو، تبدیل آن به یک تابع است. این ممکن است عجیب به نظر برسد، به خصوص اگر نمی خواهید هیچ مقداری را برگردانید، اما کاملاً مجاز است. در VBA یک تابع مجبور نیست مقداری را برگرداند. در صورت عدم اعلام صریح مقدار بازگشتی، تابع یک نتیجه پیشفرض را برمیگرداند (به عنوان مثال، Boolean False را برمیگرداند، رشته «»، و غیره را برمیگرداند) بنابراین، رویه مشکل را میتوان به یک تابع تغییر داد و همانطور که در اینجا نشان داده شده است اعلام کرد:
Function MySub() As Boolean
MsgBox "We are running the macro"
End Function
این رویه در کادر محاوره ای Macros نشان داده نمی شود و به آرگومان نیاز ندارد. به طور پیش فرض False را برمی گرداند، اما این نتیجه را می توان نادیده گرفت. بسته به ماهیت زیربرنامه ای که در حال تغییر آن هستید، ممکن است به نفع شما باشد که واقعاً به تابع تبدیل شده اجازه دهید که True یا False بسته به موفقیت کاری که در کد انجام می شود، برگرداند. در این مورد، تابع تبدیل شده یک تابع واقعی است، و در واقع یک زیربرنامه ساختگی نیست، زیرا چیزی با ارزش را برمی گرداند.
سومین راه حل بالقوه استفاده از برخی پارامترهای ساختگی با زیربرنامه است. لازم نیست در خود زیربرنامه کاری با آنها انجام دهید، اما با قرار دادن آنها، رویه در لیست ماکرو فهرست نمی شود. در این سناریو، زیربرنامه مشکل به چیزی شبیه به زیر تغییر می کند:
Sub MySub(Void As Integer)
MsgBox "We are running the macro"
End Sub
اکنون رویه در لیست ماکرو فهرست نشده است، اما باید روش فراخوانی زیربرنامه را تغییر دهید. شما باید هر نمونه را طوری تغییر دهید که یک پارامتر ارسال شود، حتی اگر هرگز استفاده نشود.