当用户在VBA中点击Save时如何抛出错误

当用户在VBA中点击Save时如何抛出错误,vba,excel,Vba,Excel,在我的A列中,我有一个选项,允许用户选择“是”或“否”。两个选择都需要一个单元格 Example: If User selects "YES" Mandatory cells will be in Colum A, D and E If User selects "No" Mandatory cells will be in Colum B, C and G 假设在第1行中,用户选择“是”,并在A1和E1上输入值,但他忘记在单元格D1中添加值。 在第2行中,用户选择“否”,并在B2和C2上

在我的A列中,我有一个选项,允许用户选择“是”或“否”。两个选择都需要一个单元格

Example:
If User selects "YES"
 Mandatory cells will be in Colum A, D and E
If User selects "No"
 Mandatory cells will be in Colum B, C and G
假设在第1行中,用户选择“是”,并在A1和E1上输入值,但他忘记在单元格D1中添加值。 在第2行中,用户选择“否”,并在B2和C2上输入一个值,而忘记在单元格G2上输入一个值

当他点击save时,我想抛出一个错误,提示“输入以下单元格的值。D1,G2

我有以下代码:

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

    Dim Target As Range
    If Not Intersect(Target, Range("A:A")) Is Nothing Then

                If Target = "YES" Then

                     For i = 1 To 15
                        If Target.Offset(0, i).Value = "" Then
                         MsgBox "Enter values on the mandatory cells (green)", vbCritical, ""
                        End If
                     Next i
                        Cancel = True

                ElseIf Target = "NO" Then
                    For i = 16 To 30
                         If Target.Offset(0, i).Value = "" Then
                          MsgBox "Enter values on the mandatory cells (green)", vbCritical, ""
                        End If
                    Next i
                    Cancel = True
                End If
         End If
End Sub

使用工作簿beforeSave事件并相应地处理:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ 
        Cancel as Boolean) 
   'your code here
End Sub
编辑OP的新代码:


您从未在代码中定义目标,因此intersect方法始终不返回任何内容(如果它确实有效的话)。我认为您混淆了工作表更改方法(其中包括“目标”范围),使用Save。当BeforeSave方法运行时,您必须定义目标是什么。我建议在特定的值范围内运行一个循环,并检查是否满足所有需要的条件。如果某些条件不符合要求,则可以向用户显示一条消息,指出缺少的数据并阻止保存。

使用工作簿beforeSave事件并相应地处理:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ 
        Cancel as Boolean) 
   'your code here
End Sub
编辑OP的新代码:


您从未在代码中定义目标,因此intersect方法始终不返回任何内容(如果它确实有效的话)。我认为您混淆了工作表更改方法(其中包括“目标”范围),使用Save。当BeforeSave方法运行时,您必须定义目标是什么。我建议在特定的值范围内运行一个循环,并检查是否满足所有需要的条件。如果某些条件不符合要求,则可以向用户显示一条消息,指出缺少的数据并阻止保存。

试着用这两行中的一行。像这样抛出错误不是一个好主意,但是如果你想要这么多。。。 这是一个消息框:

msgbox "Enter a value of the following cells. D1 G2"
这是一个错误:

err.Raise 1, description:= "Enter a value of the following cells. D1 G2"

试着用这两行中的一行。像这样抛出错误不是一个好主意,但是如果你想要这么多。。。 这是一个消息框:

msgbox "Enter a value of the following cells. D1 G2"
这是一个错误:

err.Raise 1, description:= "Enter a value of the following cells. D1 G2"

我知道我会用那个,我的问题是,我怎么能看完整张表,然后得到丢失的手机地址呢value@PeterS如果知道要读取哪些单元格,则无需通读整个工作表。
如果Sheet1.Range(“D1”).Value=vbNullString或Sheet1.Range(“G2”).Value=vbNullString然后MsgBox“不,你不需要!“
@Mat'sMug我已经用我的代码更新了我的问题。你能帮我解决这个问题吗?@RGA我们不能在BeforeSave方法中使用这个目标范围吗?我应该对上面的代码做些什么来处理这个问题?@PeterS如上所述,在保存和检查你的条件时循环检查工作簿中的所有值。我知道我的问题是,如果我想用那张表,我怎么能看完整张表,然后找到丢失的手机地址呢value@PeterS如果您知道要读取的单元格,则无需通读整个工作表。
如果Sheet1.Range(“D1”).Value=vbNullString或Sheet1.Range(“G2”).Value=vbNullString,则MsgBox“不,您不需要!“
@Mat'sMug我已经用我的代码更新了我的问题。你能帮我解决这个问题吗?@RGA我们不能在BeforeSave方法中使用这个目标范围吗?我应该对上面的代码做些什么来处理这个问题?@PeterS如上所述,在保存和检查你的条件时循环检查工作簿中的所有值。为什么负数是?答案中有什么不完整?不是我的反对票(我实际上是+1,因为我区分了向用户发送消息和抛出错误),但是你的答案没有向用户提供他们可以复制和粘贴的代码,而不了解他们在做什么。公平地说,它实际上没有回答OP的问题,但IMO OP的问题是“gimmeh teh codez“并没有显示出太多的研究成果。好吧,我考虑了第一条评论,因此我想添加它,而不是重复它。为什么是负号?答案中有什么不完整?不是我的反对票(我实际上是+1,因为我区分了向用户发送消息和抛出错误),但您的答案并没有向用户提供他们可以复制和粘贴的代码,而不需要了解他们在做什么。公平地说,它实际上并没有回答OP的问题,但IMO OP的问题是“gimmeh teh codez”“而且没有显示出太多的研究成果。好吧,我考虑了第一条评论,因此我想添加到它,而不是重复它。