第五章 事件篇 5.3 Workbook_BeforeClose事件 这是一个工作簿事件,当代码所在的工作簿被关闭时,触发该事件。 当我们关闭一个工作簿时,我们最希望的是我们做的工作能够被保存下来,以免我们的辛苦工作打了水漂,所以你可以这样写: Private Sub Workbook_BeforeClose(Cancel As Boolean) ThisWorkbook.Save End Sub 或者保存一个加当前日期的备份文件: Private Sub Workbook_BeforeClose(Cancel As Boolean) 日期 = Format(Now(), 'yyyymmdd') ThisWorkbook.SaveCopyAs ThisWorkbook.Path & '\' & 日期 & '-' & ThisWorkbook.Name End Sub 不知道大家注意到没有,Workbook_BeforeClose事件里有一个参数Cancel,它是一个Boolean(布尔型)变量。当这个参数被设置为Flase时,工作簿会被关闭;当它被设置为True时,工作簿不会被关闭,这个参数的默认值Flase。这听着好像有点别扭,我们可以这样理解:被设置为Flase时,不(Flase)取消(Cancel)关闭,被设置为True时,真(True)取消(Cancel)关闭。 我们通过一个案例来学习它的应用: 我们每天都要统计企业的生产量,但有时候可能还没有把数据录入完就点了关闭,就象下表这样下午的数据没有填,这时VBA会提醒我们数据未填完,并用光标选择该行进行提示。
Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next Dim d As Date sj = Application.CountA([2:2]) d = Format(Now(), 'yyyy-mm-dd') h = Range('a:a').Find(d, , xlValues).Row tj = Application.CountA(Rows(h)) If tj < sj Then Cancel = True MsgBox d & '今日数据未填完,请继续填写' Rows(h).Select End If End Sub 我们统计第二行的有数据的单元格个数sj,把它作为是否填完的一个标杆。然后读取当天的日期,并找到该日期所在的行,再统计该行的有数据的单元格个数tj,让它与sj相比较,如果小于sj,说明有空单元格没有填写,Cancel赋值为True,工作簿不会被关闭,弹出对话框并选择该行,直到数据填完后再点关闭,工作簿才会被关闭。 |
|