فرانکلین یک ماکرو دارد که تعدادی ردیف را در یک کاربرگ پنهان می کند و سپس کاربرگ را چاپ می کند. برای انجام این کار او از کنترل کننده رویداد BeforePrint استفاده می کند. مشکل اینجاست که فرانکلین میخواهد بعد از اتمام چاپ، ردیفها را بهطور خودکار آشکار کند. او نمی داند چگونه این کار را در کلان خود انجام دهد.
چند راه وجود دارد که می توانید به این موضوع نزدیک شوید. یکی استفاده از کنترل کننده رویداد BeforePrint و استفاده از آن برای مخفی کردن ردیف های مورد نظر و سپس تعیین یک ماکرو برای اجرا از طریق متد OnTime. شکلی که کنترل کننده رویداد به نظر می رسد:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Code here to hide rows desired
Application.OnTime Now, "AfterPrint"
End Sub
باید کدی را به این کنترل کننده رویداد اضافه کنید تا ردیف هایی را که می خواهید پنهان کنید پنهان کنید. (فرانکلین گفت که چنین کدی کار میکرد؛ پس از چاپ آنها را پنهان میکرد که با آن مشکل داشت.) توجه داشته باشید که ماکرویی که از طریق OnTime فراخوانی میشود، AfterPrint نامیده میشود. این ماکرو باید در یک ماژول معمولی قرار گیرد، نه در همان ماژولی که کنترل کننده های رویداد قرار می گیرند. این می تواند حتی ساده تر از کنترل کننده رویداد باشد:
Sub AfterPrint()
Code here to unhide rows
Cells.Select
Selection.EntireRow.Hidden = False
End Sub
همچنین در صورت تمایل می توانید نیاز به روش OnTime (و ماکرو AfterPrint) را به طور کامل دور بزنید. این شامل این رویکرد است:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = True
Code here to hide rows desired
Application.EnableEvents = False
ActiveSheet.PrintOut
Application.EnableEvents = True
Code here to unhide rows
End Sub
ماکرو به این دلیل کار میکند که چاپی را که رویداد BeforePrint را راهاندازی کرده بود، لغو میکند، ردیفها را پنهان میکند، کاربرگ فعال را چاپ میکند و سپس سطرها را باز میکند.
اشکال چنین رویکرد مبتنی بر رویداد این است که آنچه کاربر می تواند چاپ کند را محدود می کند. به عبارت دیگر، کاربر فقط میتواند آنچه را که شما به او اجازه چاپ میدهید چاپ کند، نه آنچه را که واقعاً بخواهد چاپ کند. برای دور زدن این محدودیت نسبتاً بزرگ، باید رویکرد BeforePrint را به طور کامل کنار بگذارید. در عوض، یک ماکرو معمولی ایجاد کنید که کار چاپ را انجام می دهد:
Sub PrintWS()
Code here to hide rows desired
Application.EnableEvents = False
ActiveSheet.PrintOut
Application.EnableEvents = True
Code here to unhide rows
End Sub
توجه داشته باشید که اساساً این روش دوم BeforePrint است - شما ردیفها را پنهان میکنید، کاربرگ را چاپ میکنید و سپس سطرها را باز میکنید. این ماکرو PrintWS سپس می تواند به یک کلید میانبر یا چیزی در نوار ابزار دسترسی سریع متصل شود تا بتوان آن را به راحتی فراخوانی کرد.
به هر حال، اگر تصمیم دارید یکی از رویکردهای BeforePrint را انتخاب کنید، گزارش هایی مبنی بر عدم کارکرد صحیح آن در تمام نسخه های اکسل وجود دارد. (بهنظر میرسد ردیابی این امر بسیار سخت است.) آنچه اتفاق میافتد این است که در برخی از نسخهها، آنچه اکسل چاپ میکند، قبل از فراخوانی کنترلکننده رویداد BeforePrint «در سنگ» قرار میگیرد. این بدان معنی است که هر ردیفی که در کنترل کننده رویداد پنهان می کنید، وقتی کاربرگ واقعاً چاپ می شود نادیده گرفته می شود، بنابراین گویی هرگز ردیف ها را در ماکرو پنهان نکرده اید. تنها راه حل این واقعیت بسیار ناامیدکننده این است که خودتان مستقیماً از طریق مثال دوم BeforePrint در بالا یا رویکرد ماکرو PrintWS، چاپ را انجام دهید.