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