کارن به دنبال راهی برای چاپ کل ورک بوک است، حتی اگر کاربر انتخاب کند که یک کاربرگ را چاپ کند. به عبارت دیگر، او به دنبال راهی برای چاپ کل ورک بوک است یا اصلاً هیچ گزینه ای نباید وجود داشته باشد.
تنها راه حل این مشکل استفاده از ماکرو است. VBA به شما این امکان را می دهد که ماکروهایی ایجاد کنید که هنگام وقوع رویدادهای خاص شروع شوند. یکی از رویدادهایی که می تواند ماکروها را فعال کند، رویداد "چاپ" است. هنگامی که شخصی درخواست چاپ می کند، یا انتخاب می کند که پیش نمایش چاپ را ببیند، رویداد BeforePrint شی Workbook فعال می شود. شما می توانید ماکرو خود را ایجاد کنید که در هنگام راه اندازی رویداد اجرا می شود.
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim sht As Variant
Dim bPreview As Boolean
Dim iResponse As Integer
On Error GoTo ErrHandler
iResponse = MsgBox(prompt:="Do you want to Print Preview?", _
Buttons:=vbYesNoCancel, Title:="Preview?")
Select Case iResponse
Case vbYes
bPreview = True
Case vbNo
bPreview = False
Case Else
GoTo ExitHandler
End Select
Application.EnableEvents = False
For Each sht In Sheets
If sht.Visible Then
sht.PrintOut Preview:=bPreview
End If
Next
ExitHandler:
Application.EnableEvents = True
Cancel = True
Exit Sub
ErrHandler:
MsgBox Err.Description
Resume ExitHandler
End Sub
هر زمان که اکسل برای چاپ آماده می شود، یا هر زمان که پیش نمایش چاپ فراخوانی می شود، رویداد BeforePrint فعال می شود و این ماکرو اجرا می شود. ماکرو ابتدا از کاربر می پرسد که آیا می خواهد پیش نمایش چاپ را انجام دهد یا خیر. ساختار Select Case برای تنظیم متغیر bPreview بر اساس پاسخ به سوال استفاده می شود. تنظیم bPreview سپس آنچه را که اتفاق می افتد کنترل می کند.
اگر کاربر در مورد پیش نمایش روی Cancel کلیک کرد، ماکرو خارج می شود و چاپ لغو می شود. در غیر این صورت، هر کاربرگ در ورک بوک برای چاپ یا پیش نمایش بررسی می شود. اگر کاربرگ قابل مشاهده باشد، چاپ می شود و ویژگی Preview برابر با bPreview تنظیم می شود (True به این معنی است که کاربرگ پیش نمایش شده است؛ False یعنی واقعاً چاپ شده است).
توجه داشته باشید که ماکرو ویژگی EnableEvents را روی False قرار می دهد. این کار به گونه ای انجام می شود که هیچ رویداد دیگری در حین چاپ یا پیش نمایش فعال نشود. اگر EnableEvents "روشن" باقی بماند، هر بار که از روش PrintOut استفاده می شود، کل رویداد BeforePrint دوباره فعال می شود—اگر مدیریت رویداد خاموش نمی شد کاربر در یک حلقه بی پایان قرار می گیرد.
همچنین توجه داشته باشید که یکی از آخرین مواردی که قبل از خروج از ماکرو رخ می دهد این است که ویژگی Cancel روی True تنظیم شده است. این کار به این دلیل انجام می شود که درخواست چاپ یا پیش نمایش چاپ اصلی که رویداد BeforePrint را ایجاد کرده است لغو شود. به هر حال، نیازی به تکمیل آن درخواست نیست، زیرا ماکرو تمام کارهای چاپی را برای کاربر انجام داده است.
البته یک اخطار برای استفاده از این رویکرد برای چاپ وجود دارد: اگر ماکروها فعال نباشند، کنترلر اجرا نمی شود و کاربر می تواند به دلخواه چاپ کند. (نگه داشتن Shift در حین باز کردن ورک بوک، ماکروها را غیرفعال می کند و اغلب از کاربر سؤال می شود که آیا می خواهد ماکروها را فعال کند یا خیر.) موضوعات دیگر ExcelTips این واقعیت را مورد بحث قرار داده اند.