باب در حال پردازش اطلاعات در یک ورک بوک با استفاده از یک ماکرو است. او مایل است که ماکرو یک ورک بوک دوم را باز کند که دارای یک ماکرو AutoClose در آن باشد، اما نمی خواهد وقتی کتاب دوم بسته می شود، اجرا شود. او به دنبال راهی برای باز کردن کتاب دوم، تحت کنترل ماکرو در ورک بوک اول، بدون فعال کردن ماکروهای ورک بوک دوم است.
هیچ راهی برای غیرفعال کردن ماکروها در ورک بوک دوم هنگام باز کردن آن تحت کنترل ماکرو وجود ندارد. (اگر آن را به صورت دستی باز می کنید، بدیهی است که می توانید کلید Shift را با باز شدن ورک بوک نگه دارید، اما این به ماکرو شما کمکی نمی کند - انگشتی برای نگه داشتن آن کلید ندارد!)
با این حال، چند راه حل وجود دارد. اولین مورد شامل تغییر کد شما است که دومین ورک بوک را می بندد، به این ترتیب:
Application.EnableEvents = False
Workbooks("SecondBook.xls").Close
Application.EnableEvents = True
با تنظیم ویژگی EnableEvents روی False، رویدادی که قرار است رخ دهد (بستن ورک بوک) ماکرو AutoClose را راه اندازی نمی کند. سپس می توانید (و باید) ویژگی EnableEvents را روی True تنظیم کنید تا بعداً رویدادها ادامه پیدا کنند.
راه حل دیگر این است که نوعی "پرچم" را در ماکرو AutoClose ورک بوک دوم تنظیم کنید. این پرچم می تواند آزمایش کند که آیا اولین ورک بوک باز است یا نه، و اگر باز است، کد اصلی را در ماکرو AutoClose اجرا نمی کند.
برای انجام این کار، در کتاب دوم در بالای صفحات ماژول کد زیر را اضافه کنید:
Dim AutoCloseDisabled as Boolean
Sub DisableAutoClose()
AutoCloseDisabled=True
End Sub
توجه داشته باشید که عبارت اعلان برای متغیر AutoCloseDisabled خارج از هر رویه ای است، به این معنی که دامنه آن جهانی خواهد بود و در همه رویه ها قابل دسترسی است.
در مرحله بعد، ماکرو AutoClose را طوری تغییر دهید که بدنه آن در داخل یک عبارت If محصور شود، همانطور که در اینجا نشان داده شده است:
Sub AutoClose()
variable declarations here
If Not AutoCloseDisabled then
body of AutoClose here
End if
End Sub
ایده این است که وقتی کتاب دوم به طور معمول باز می شود، متغیر AutoCloseDisabled به طور خودکار روی False تنظیم می شود. (متغیرهای بولی به طور پیش فرض زمانی که اعلان می شوند روی False هستند.) از آنجایی که روال DisableAutoClose هرگز در ورک بوک اجرا نمی شود، دستور If در ماکرو AutoClose اجازه می دهد که بدنه واقعی ماکرو اجرا شود.
اگر دومین ورک بوک را از اولین ورک بوک خود باز کنید، کد موجود در اولین ورک بوک شما می تواند ماکرو DisableAutoClose را در ورک بوک دوم فراخوانی کند و در نتیجه پرچم AutoCloseDisabled را روی True تنظیم کند. این بدان معناست که وقتی دومین ورک بوک بسته می شود، دستور If از روی بدنه ماکرو AutoClose رد می شود.