在《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)
说明:
当工作簿的任意工作表中的单元格由于用户操作或外部链接产生变化时发生此事件。
参数Sh,代表工作表对象。
参数Target,代表单元格对象,即发生变化的单元格。
联系客服