试图找到代码,强迫用户不要让单元格无人居住

时间:2016-01-20 09:58:11

标签: excel-vba vba excel

谢谢你们。如果我尝试保存一个或多个指定单元格留空的工作表,我使用以下代码来获取弹出的错误消息。但是,当我返回并填充所有指定的空白单元格,然后保存时,我仍然收到错误消息。我哪里错了?

Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Cell As Range
Dim flag As Boolean
flag = False
If Cells(1, 1) = "" Then flag = True
For Each Cell In Range("C9:C14")
If Cell = "" Then
flag = True
Exit For
End If
Next Cell
For Each Cell In Range("C18:C25")
If Cell = "" Then
flag = True
Exit For
End If
Next Cell
For Each Cell In Range("C30:E35")
If Cell = "" Then
flag = True
  Exit For
End If
Next Cell
Cancel = flag
If flag Then MsgBox "error message"
End Sub

1 个答案:

答案 0 :(得分:0)

以下是2个小函数,用于检查"范围"包含任何空单元格,如果是"一个范围的总和"等于"另一个范围"的总和。我说这有点抽象,因为你明天的范围可能会更大或者位置不同,你可能不想重新编写你的应用时间&试。

Function IsFilled(TestRange As Range) As Boolean
Dim C As Range

    IsFilled = True
    For Each C In TestRange.Cells
        If C = "" Then
            IsFilled = False
            Exit For
        End If
    Next C
End Function

Function IsSum(TestRange As Range, TestSum As Range) As Boolean

    IsSum = (Application.WorksheetFunction.Sum(TestRange) = Application.WorksheetFunction.Sum(TestSum))

End Function

在您的上下文中,两个函数必须求值为True才能使用户输入有效。

现在你可以

  • 将这些功能输入到工作表的两个单元格中(例如=isfilled(A2:A7)=issum(A3:A7;A2))并告诉用户他们必须努力制作True
  • 在任何适当的事件Sub()中评估上述两个结果,例如在Worksheet_Deactivate()Workbook_BeforeSave()中(我更喜欢BeforeSave over BeforeClose,因为用户可能想要逃避而不保存,在这种情况下我不需要验证)
  • 直接调用并评估适当事件中的这两个函数,而不在工作表中使用它们
  • 在任何情况下,验证Sub()必须终止其默认操作,并在验证失败时显示MsgBox()