اکثر خوانندگان از قبل می دانند که می توانید توابع و زیر روال ها را با استفاده از VBA ایجاد کنید. این با ویژوال بیسیک مشابه VBA تفاوتی ندارد. معمولاً وقتی کادر محاورهای ماکروها (Alt+F8) را نمایش میدهید، یک ماکرو در لیست ماکرو نشان داده میشود، مگر اینکه یکی از سه شرط وجود داشته باشد:
- ماکرو یک تابع است. توابع معمولاً اطلاعات را برمیگردانند و نیاز به انتقال اطلاعات به آنها دارند. از آنجایی که اجرای یک ماکرو از لیست ماکرو اجازه نمی دهد هیچ یک از این موارد اتفاق بیفتد، Word می گوید نیازی به فهرست کردن آن نیست.
- ماکرو یک زیربرنامه با پارامترها است. Word فرض می کند که از آنجایی که پارامترها ضروری هستند و نمی توانید با انتخاب زیربرنامه از لیست ماکرو پارامترها را ارائه دهید، نیازی به لیست کردن آن نیست.
- زیربرنامه خصوصی اعلام شده است. این بدان معنی است که زیربرنامه فقط برای کدنویسی در ماژولی که در آن اعلام شده است مفید است.
نتیجه این سه شرط این است که تنها نوع ماکرو فهرست شده در کادر محاورهای Macros، یک برنامه فرعی غیر خصوصی و بدون پارامتر است. با این حال، در شرایط خاص، ممکن است آن موارد ذکر شده را نیز نخواهید. به عنوان مثال، ممکن است برخی از زیرروال های جهانی ایجاد کرده باشید که اگر به تنهایی فراخوانی شوند، هیچ کار مفیدی انجام نمی دهند؛ آنها طوری طراحی شده اند که از کدهای دیگر فراخوانی شوند. به عنوان مثال، ماکرو زیر را در نظر بگیرید:
Sub MySub()
MsgBox "We are running the macro"
End Sub
این ماکرو در کادر محاوره ای Macros ظاهر می شود. اگر نمیخواهید ظاهر شود، راهحلهای مختلفی وجود دارد که میتوانید دنبال کنید، که همه آنها با بررسی سه روش حذف ماکروها از لیست ماکرو مشخص میشوند. اولین راهحل بالقوه این است که کد خود را بررسی کنید و پیدا کنید. اگر واقعا "جهانی است." آیا به کد بیش از یک ماژول نیاز دارید؟ در کادر محاوره ای ماکروها ظاهر نمی شود. بنابراین، ماکرو مشکل قبلی به صورت زیر می شود:
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
اکنون رویه در لیست ماکرو فهرست نشده است، اما باید روش فراخوانی زیربرنامه را تغییر دهید. شما باید هر نمونه را طوری تغییر دهید که یک پارامتر ارسال شود، حتی اگر هرگز استفاده نشود.