在《Excel VBA解读(92):Workbook对象的Open事件和BeforeClose事件》中,我们详细介绍了Workbook_BeforeClose事件。该事件在关闭工作簿之前发生。
下面的示例使用Workbook_BeforeClose事件强制用户必须在指定的单元格中输入数据,否则就不能关闭该工作簿。如果用户想要关闭工作簿但没有在指定的所有单元格中都输入数据,那么Excel会弹出提示信息,列出还没有输入数据的单元格,并将这些单元格的背景设置为黄色。
图1演示了事件的运行效果。 图1
下面是ThisWorkbook模块中的代码: Dim strRng As String
Private SubWorkbook_BeforeClose(Cancel As Boolean) Dim strPrompt As String Dim rng1 As Range, rng2 As Range, rng3 As Range
'设置必须要输入数据的单元格 Set rng1 =Sheets('Sheet1').Range('A2:A5,B1,C2:C5,D3:D5') Set rng2 = Sheets('Sheet2').Range('E1,F2:F5,G3') Set rng3 = Sheets('Sheet3').Range('A1,B2:B5,C1')
strRng = '' strPrompt = '请检查工作表,确保所有需要输入数据的单元格中都有数据.' & vbCrLf & _ '否则,不能关闭或者保存工作簿,除非所有指定单元格中都输入了数据.' & vbCrLf & _ '我们将还没有输入数据的单元格添加了黄色背景.'
'调用子过程,检查单元格 CheckCells rng1 CheckCells rng2 CheckCells rng3
'如果存在必须输入数据的单元格没有数据,则提示用户 '并且不能关闭工作簿 If strRng <> '' Then MsgBox strPrompt & vbCrLf &vbCrLf & strRng, vbCritical, '数据输入未完成' Cancel = True Else ThisWorkbook.Save Cancel = False End If
Set rng1 = Nothing Set rng2 = Nothing Set rng3 = Nothing End Sub
'检查指定区域的单元格中是否有数据 '如果没有则添加黄色背景色 Sub CheckCells(rng As Range) Dim cell As Range Dim blnStart As Boolean
blnStart = True
For Each cell In rng If cell.Value = vbNullString Then cell.Interior.ColorIndex = 6 '黄色 If blnStart Then strRng = strRng& cell.Parent.Name & vbCrLf blnStart = False strRng = strRng &cell.Address(False, False) & ', ' Else cell.Interior.ColorIndex = 0 '无颜色 End If Next cell
If strRng <> '' Then strRng = Left$(strRng, Len(strRng)- 2) & vbCrLf & vbCrLf
End Sub
Private SubWorkbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Target.Interior.ColorIndex = 0 End Sub
在上面的代码中,还使用了Workbook_SheetChange事件,其语法为: Workbook_SheetChange(ByVal Sh AsObject, ByVal Target As Range)
说明:
|
|