分享

学习VBA,报表做到飞 第五章 事件篇 5.3 Workbook_BeforeClose事件

 拾叁亿人 2023-04-05 发布于云南

第五章 事件篇

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会提醒我们数据未填完,并用光标选择该行进行提示。

每日生产情况统计表

日期

上午

下午

2022/11/15

376

423

2022/11/16

425

301

2022/11/17

334

416

2022/11/18

395

474

2022/11/19

442

440

2022/11/20

348

331

2022/11/21

348

317

2022/11/22

394

2022/11/23

2022/11/24

2022/11/25

2022/11/26

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,工作簿不会被关闭,弹出对话框并选择该行,直到数据填完后再点关闭,工作簿才会被关闭。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多