هنگامی که در حال توسعه یک کاربرگ هستید که توسط افراد دیگر استفاده می شود، ممکن است بخواهید مطمئن شوید که آنها سلول های خاصی را قبل از اینکه اجازه بستن کتاب کار را داشته باشند پر می کنند. هیچ تابع داخلی برای انجام این کار در اکسل وجود ندارد، اما می توانید یک ماکرو ایجاد کنید که بررسی لازم را انجام دهد و کاربر را برای ادامه کار متوقف کند. این می تواند یک ماکرو نسبتاً ساده باشد که به رویداد BeforeClose گره خورده است.
رویداد BeforeClose هر زمان که یک کتاب کار به هر وسیله ای بسته شود فعال می شود. ترفند، تنظیم ویژگی Cancel در کنترل کننده رویداد است. با تنظیم Cancel روی True بسته شدن کتاب کار متوقف می شود و بدون تغییر باقی می ماند و باعث بسته شدن نرمال کتاب کار می شود.
به عنوان مثال، ماکرو زیر بررسی می کند که آیا سلول A1 چیزی در آن وجود دارد یا خیر. اگر چنین شد، کتاب کار بسته می شود. اگر نشد، کاربر مطلع می شود که چیزی گم شده است و بسته شدن لغو می شود.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Cells(1, 1).Value = "" Then
MsgBox "Please fill cell A1"
Cancel = True
End If
End Sub
در صورت تمایل می توان ماکروهای دقیق تری ایجاد کرد. به عنوان مثال، ممکن است چندین سلول مختلف داشته باشید که باید بررسی شوند. نسخه زیر محدوده ای به نام "اجباری" را بررسی می کند تا ببیند آیا هر سلول در محدوده حاوی چیزی است یا خیر. اگر هر یک از سلول ها خالی باشد، کتاب کار نمی تواند ذخیره یا بسته شود. (این ماکرو نه تنها در طول رویداد BeforeClose، بلکه در طول رویداد BeforeSave نیز فعال می شود.) این دو کنترل کننده رویداد باید در برگه کد کتاب کار قرار گیرند:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = ForceDataEntry()
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
Cancel As Boolean)
Cancel = ForceDataEntry()
End Sub
توجه داشته باشید که کنترل کننده رویداد تابع ForceDataEntry را فراخوانی می کند. این تابع باید در یک ماژول ماکرو معمولی قرار گیرد:
Function ForceDataEntry() As Boolean
Dim rng As Range
Dim c As Variant
Dim rngCount As Integer
Dim CellCount As Integer
Set rng = Range("Mandatory")
rngCount = rng.Count
CellCount = 0
For Each c In rng
If Len(c) > 0 Then
CellCount = CellCount + 1
End If
Next c
ForceDataEntry = False
If CellCount <> rngCount Then ForceDataEntry = True
End Function
باید توجه داشته باشید که هر پیاده سازی که به ماکرو نیاز دارد (مانند این مورد) از یک مشکل بالقوه رنج می برد - کاربران می توانند تصمیم بگیرند که وقتی کتاب کار بارگیری می شود ماکروها را فعال نکنند. اگر آنها کتاب کار را با ماکروهای غیرفعال اجرا کنند، همچنان می توانند کارنامه را بدون تمام سلول های اجباری حاوی مقادیر ذخیره کنند.