رایلی یک برگه دارد که باید هر جمعه با آن کار کند. این کاربرگ بر اساس یک الگو است و حداقل پنج سلول در محدوده C4:C8 وجود دارد که او باید پر کند. هنگامی که او با کاربرگ شروع می کند، این سلول ها خالی هستند. رایلی به این فکر می کند که آیا راهی برای جلوگیری از ذخیره و/یا بسته شدن کاربرگ تا زمانی که تمام این پنج خانه را پر کند وجود دارد.
راهی برای انجام این کار وجود دارد، اما شامل استفاده از ماکروها است. اکسل از مفهوم کنترل کننده رویداد پشتیبانی می کند، به این معنی که شما می توانید ماکروهایی را توسعه دهید که به صورت خودکار در هنگام وقوع رویدادهای خاص اجرا شوند. دو رویدادی که میتوانید برای آنها کنترلکنندههای رویداد ویژه ایجاد کنید، BeforeClose (به معنی قبل از بسته شدن کتاب کار) و BeforeSave (قبل از ذخیره کتاب کار) هستند.
به عنوان مثالی از این که چگونه می تواند کار کند، اجازه دهید بگوییم که کاربرگ حاوی محدوده ای که باید بررسی شود (C4:C8) "MyData" نام دارد. می توانید این کد را به ماژول ThisWorkbook اضافه کنید:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim rng As Range
Dim iCount As Integer
Dim sTemp As String
Set rng = Worksheets("MyData").Range("C4:C8")
iCount = Application.WorksheetFunction.CountBlank(rng)
If iCount <> 0 Then
sTemp = rng.Address & " has blank cells. " & vbCrLf
sTemp = sTemp & "The workbook will not be closed."
MsgBox sTemp
Cancel = True
End If
End Sub
توجه داشته باشید که ماکرو برای تعیین اینکه آیا در محدوده سلولها جای خالی وجود دارد یا خیر به تابع کاربرگ CountBlank متکی است. اگر هر چک خالی را تشخیص دهد (iCount بزرگتر از 0 است)، ماکرو پیامی را به کاربر نمایش می دهد و متغیر Cancel روی True تنظیم می شود که در واقع بسته شدن کتاب کار را متوقف می کند.
می توانید از یک ماکرو مشابه برای رویداد BeforeSave به این ترتیب استفاده کنید:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim rng As Range
Dim iCount As Integer
Dim sTemp As String
Set rng = Worksheets("MyData").Range("C4:C8")
iCount = Application.WorksheetFunction.CountBlank(rng)
If iCount <> 0 Then
sTemp = rng.Address & " has blank cells. " & vbCrLf
sTemp = sTemp & "The workbook will not be saved."
MsgBox sTemp
Cancel = True
End If
End Sub
اگر میخواهید مطمئن شوید که روتین سلولهایی را انتخاب کرده است که در آنها ورودی مورد نیاز است (به عنوان مرحله آخر)، میتوانید خط زیر را به هر دو ماکرو، درست بعد از خطی که متغیر Cancel را روی True تنظیم میکند، اضافه کنید:
rng.Select
همچنین به یاد داشته باشید که از آنجایی که کتاب کار شما مبتنی بر یک الگو است، برای اینکه به درستی کار کند باید به عنوان یک الگوی فعال ماکرو ذخیره شود.