اگر Roy هنگام باز کردن یک کتاب کار، کلید Shift را پایین نگه دارد، اکسل اجرای ماکروهای «خودکار» را که معمولاً اجرا میشوند، از جمله رویداد Workbook_Open دور میزند. او فکر می کند که آیا یک راه به همان اندازه آسان، هنگام بستن یک کتاب کار، وجود دارد که باعث شود اکسل رویداد Workbook_BeforeClose را دور بزند.
راه به همان اندازه آسان وجود ندارد. این بدان معنا نیست که نمی توان آن را انجام داد، اما "به همان اندازه آسان" به طور کلی به معنای "چیزی ساخته شده است؛ کلیدهایی برای فشار دادن یا تنظیم کردن برای ایجاد." چنین کلیدها و تنظیماتی برای دور زدن رویداد BeforeClose در اکسل تعبیه نشده است.
کاری که می توانید انجام دهید این است که نحوه برنامه ریزی رویداد BeforeClose را به گونه ای تنظیم کنید که اگر یک شرط خاص برآورده شد، کد موجود در کنترل کننده رویداد دور زده شود. یک روش آسان این است که در صورت انتخاب یک سلول کاربرگ خاص، به سادگی کد را دور بزنید، به این ترتیب:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If ActiveCell.Address = "$Z$27" Then Exit Sub
Your normal code here...
End Sub
در این حالت، اگر سلول فعال - سلولی که هنگام راه اندازی رویداد BeforeClose انتخاب می شود - سلول Z27 باشد، کد معمولی شما در کنترل کننده رویداد حذف می شود. اگر سلول دیگری انتخاب شده باشد، از آن رد نمی شود. (من عمداً سلول Z27 را انتخاب کردم زیرا هم باطنی و هم مبهم است. البته می توانید کد را تغییر دهید تا هر سلول دیگری را که می خواهید منعکس کند.)
اگر برای بررسی اینکه آیا کلید Shift پایین نگه داشته شده است، در حالت خاموش هستید، می توانید با استفاده از Windows API این کار را انجام دهید. این شامل افزودن مقداری کد به ناحیه اعلامیه های یک ماژول است. این می تواند یک ماژول معمولی باشد. لازم نیست در پنجره کد ThisWorkbook باشد. فقط باید مطمئن شوید که در قسمت اعلامیهها قرار دارد، قبل از اینکه هر رویهای اعلام شود.
#If VBA7 Then
Declare PtrSafe Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer
#Else
Declare Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer
#End If
توجه داشته باشید که #اگر از دستور شرطی VBA7 استفاده می شود تا اگر از اکسل 2010 یا جدیدتر استفاده می کنید، از نحو صحیح اعلان استفاده می شود تا هیچ خطایی در نسخه های 32 بیتی یا 64 بیتی برنامه وجود نداشته باشد.
اکنون، در کنترلر رویداد BeforeClose خود می توانید کارهای زیر را انجام دهید:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Const VSHIFT = &H10
Const SHIFTED = &H80
If GetKeyState(VSHIFT) And SHIFTED Then Exit Sub
Your normal code here...
End Sub
اگر با فعال شدن رویداد BeforeClose کلید Shift را نگه دارید، کد BeforeClose حذف می شود. باید توجه داشته باشید که تشخیص اینکه چه زمانی باید کلید Shift را نگه دارید یا به اندازه کافی آن را نگه داشته اید کمی دشوار باشد. به همین دلیل، من تمایل دارم رویکرد "بررسی ActiveCell" را بهتر ترجیح دهم، زیرا می توانید به سادگی سلول را انتخاب کنید، کتاب کار را ببندید و آن را فراموش کنید.