Riley有一个工作表,他需要在每个星期五工作。该工作表基于模板,并且他至少需要填写五个单元格,范围为C4:C8。当他从工作表开始时,这些单元格为空白。赖利(Riley)想知道是否有一种方法可以防止工作表在填写所有这五个单元格之前被保存和/或关闭。

有一种方法可以做到这一点,但是它涉及到宏的使用。 Excel支持事件处理程序的概念,这意味着您可以开发在某些事件发生时自动运行的宏。您可以为其创建特殊事件处理程序的两个事件是BeforeClose(意味着,在工作簿关闭之前)和BeforeSave(在工作簿被保存之前)。

作为如何工作的示例,假设包含要检查范围(C4:C8)的工作表命名为“ MyData”。您可以将此代码添加到ThisWorkbook模块中:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim rng As Range     Dim iCount As Integer     Dim sTemp As String

Set rng = Worksheets("MyData").Range("C4:C8")

iCount = Application.WorksheetFunction.CountBlank(rng)

If iCount <> 0 Then         sTemp = rng.Address & " has blank cells. " & vbCrLf         sTemp = sTemp & "The workbook will not be closed."

MsgBox sTemp         Cancel = True     End If End Sub

请注意,该宏依靠CountBlank工作表函数来确定单元格范围内是否有空白。如果它检测到任何空白cekks(iCount大于0),则宏将向用户显示一条消息,并且Cancel变量设置为True,这实际上使工作簿停止关闭。

您可以通过以下方式将类似的宏用于BeforeSave事件:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Dim rng As Range     Dim iCount As Integer     Dim sTemp As String

Set rng = Worksheets("MyData").Range("C4:C8")

iCount = Application.WorksheetFunction.CountBlank(rng)

If iCount <> 0 Then         sTemp = rng.Address & " has blank cells. " & vbCrLf         sTemp = sTemp & "The workbook will not be saved."

MsgBox sTemp         Cancel = True     End If End Sub

如果要确保例程选择了需要处理输入内容的单元格(作为最后一步),则可以在将Cancel变量设置为True的行之后,在这两个宏中添加以下行:

rng.Select

同样,请记住,由于您的工作簿基于模板,因此必须将其保存为启用了宏的模板才能正常工作。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(4364)适用于Microsoft Excel 2007、2010、2013和2016。