分享

Excel VBA解读(98):工作簿事件示例——强制用户必须在指定单元格中输入数据

 L罗乐 2018-05-24


在《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,代表单元格对象,即发生变化的单元格。

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多