避免excel中出现多个错误弹出消息

避免excel中出现多个错误弹出消息,excel,vba,Excel,Vba,我用上面的代码对4列进行了验证,即使验证通过了我也收到了4条错误弹出消息如何限制错误消息的数量 更新: 我从下拉列表中选择了该值,这是一个有效的选择,但我收到以下错误消息。 我正在使用以下代码如果您正在处理工作表的更改事件,那么我建议您查看 由于您只使用一张工作表,因此不需要此工作簿代码区域中的代码。如果您将其放在那里,那么代码将针对每个工作表运行。将代码放入相关工作表的代码区域。因此,如果验证在Sheet1中,则将代码放入Sheet1代码区域。请参见下面的屏幕截图 好,现在回答您的问题。您可

我用上面的代码对4列进行了验证,即使验证通过了我也收到了4条错误弹出消息如何限制错误消息的数量

更新:

我从下拉列表中选择了该值,这是一个有效的选择,但我收到以下错误消息。
我正在使用以下代码

如果您正在处理工作表的
更改
事件,那么我建议您查看

由于您只使用一张工作表,因此不需要
此工作簿
代码区域中的代码。如果您将其放在那里,那么代码将针对每个工作表运行。将代码放入相关工作表的代码区域。因此,如果验证在
Sheet1
中,则将代码放入
Sheet1
代码区域。请参见下面的屏幕截图

好,现在回答您的问题。您可以使用
布尔值
变量,然后在显示第一条消息后将其设置为
True
,这样消息就不会再次显示

试试这个(未经测试)


如果您正在处理工作表的
Change
事件,那么我建议您查看

由于您只使用一张工作表,因此不需要
此工作簿
代码区域中的代码。如果您将其放在那里,那么代码将针对每个工作表运行。将代码放入相关工作表的代码区域。因此,如果验证在
Sheet1
中,则将代码放入
Sheet1
代码区域。请参见下面的屏幕截图

好,现在回答您的问题。您可以使用
布尔值
变量,然后在显示第一条消息后将其设置为
True
,这样消息就不会再次显示

试试这个(未经测试)



验证是应用于所有工作表还是部分工作表,还是仅应用于一张工作表?@SiddharthRout验证是应用于所有工作表。此代码写在此工作簿选项卡下。因此,如果您看到1张工作表的消息,那么您不希望在第2张工作表中使用相同的消息框?@SiddharthRout抱歉,它适用于工作手册中的当前工作表。我的要求是限制预定义值的列粘贴到具有数据验证的单元格中。我已经准备好了答案。只需要根据你的评论进行调整。因此,请确认您是否需要消息框为所有工作表或仅为一个相关工作表显示一次?验证是否应用于所有工作表、某些工作表或仅一个工作表?@SiddharthRout验证应用于所有工作表。此代码写在此工作簿选项卡下。因此,如果您看到1张工作表的消息,那么您不希望在第2张工作表中使用相同的消息框?@SiddharthRout抱歉,它适用于工作手册中的当前工作表。我的要求是限制预定义值的列粘贴到具有数据验证的单元格中。我已经准备好了答案。只需要根据你的评论进行调整。因此,请确认是否需要为所有工作表或仅为一个相关工作表显示一次消息框?使用上述代码,我们可以从一个数据验证单元格复制到另一个具有数据验证的单元格。例如,我有一个数据验证列“B”具有不同的值集(在下拉列表中),列“I”具有另一组值(在下拉列表中)。如果我将列“I”单元格数据复制到列B的单元格中,则列B单元格中的数据将被列“I”的单元格值覆盖@Siddharthrout您可以使用INTERSECT方法检查用户是否试图在特定列中写入。我是VBA的新手,但作为我工作的一部分,我得到了一个要求,即我应该仅从下拉列表中限制单元格中的值,如图所示(更新的问题)。我是VBA的新手,但作为我工作的一部分,我得到了一个要求,即我应该仅从下拉列表中的可用值限制单元格中的值,(复制、粘贴不应在具有数据验证的单元格中工作),如图所示(更新的问题)@SiddharthRout
我是VBA的新手
你想要达到的目标有点复杂。让我想一个更好的方法来解释它。使用上面的代码,我们可以从一个数据验证单元复制到另一个具有数据验证的单元。例如,我有一个数据验证列“B”具有不同的值集(在下拉列表中),列“I”具有另一组值(在下拉列表中)。如果我将列“I”单元格数据复制到列B的单元格中,则列B单元格中的数据将被列“I”的单元格值覆盖@Siddharthrout您可以使用INTERSECT方法检查用户是否试图在特定列中写入。我是VBA的新手,但作为我工作的一部分,我得到了一个要求,即我应该仅从下拉列表中限制单元格中的值,如图所示(更新的问题)。我是VBA的新手,但作为我工作的一部分,我得到了一个要求,即我应该仅从下拉列表中的可用值限制单元格中的值,(复制、粘贴不应在具有数据验证的单元格中工作),如图所示(更新的问题)@SiddharthRout
我是VBA的新手
你想要达到的目标有点复杂。让我想一个更好的办法向你解释。
Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    'Does the validation range still have validation?
    If Not HasValidation(Range("A1:A1048576")) Then RestoreValidation
    If Not HasValidation(Range("C1:C1048576")) Then RestoreValidation
    If Not HasValidation(Range("I1:I1048576")) Then RestoreValidation
    If Not HasValidation(Range("P1:P1048576")) Then RestoreValidation
End Sub

Private Sub RestoreValidation()
    Application.EnableEvents = False
    'turn off events so this routine is not continuously fired
    Application.Undo
    Application.EnableEvents = True
    'and turn them on again so we can catch the change next time
    MsgBox "Your last operation was canceled." & _
    "It would have deleted data validation rules.", vbCritical
End Sub

Private Function HasValidation(r) As Boolean
    '   Returns True if every cell in Range r uses Data Validation
    On Error Resume Next
    Debug.Print r.Validation.Type    'don't care about result, just possible error
    If Err.Number = 0 Then HasValidation = True Else HasValidation = False
End Function
Dim boolDontShowAgain As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Whoa

    Application.EnableEvents = False

    If Not HasValidation(Range("A1:A1048576")) Then RestoreValidation
    If Not HasValidation(Range("C1:C1048576")) Then RestoreValidation
    If Not HasValidation(Range("I1:I1048576")) Then RestoreValidation
    If Not HasValidation(Range("P1:P1048576")) Then RestoreValidation

Letscontinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume Letscontinue
End Sub

Private Sub RestoreValidation()
    Application.Undo
    If boolDontShowAgain = False Then
        MsgBox "Your last operation was canceled." & _
        "It would have deleted data validation rules.", vbCritical
        boolDontShowAgain = True
    End If
End Sub

Private Function HasValidation(r) As Boolean
    On Error Resume Next
    Debug.Print r.Validation.Type
    If Err.Number = 0 Then HasValidation = True
End Function