Vba 显示多个错误时获取行号的消息框

Vba 显示多个错误时获取行号的消息框,vba,excel,row-number,msgbox,Vba,Excel,Row Number,Msgbox,每次在“W”列中插入文本时,我都会使用此代码接收错误消息。出现这种情况时,文本将被删除,并显示一条框消息:“W行”&r&“必须仅包含数字!”,该消息告诉错误的行号。r-设置为Target.Row 我的问题是,当我复制w10:w12范围内的文本时,我会收到3次错误消息,这很好。但是,在消息框中,它仅显示行编号w10-3次,即“行w10必须只包含数字!”。如何使代码显示带有w10的消息框,然后是w11,最后是w12 Private Sub Worksheet_Change(ByVal Target

每次在“W”列中插入文本时,我都会使用此代码接收错误消息。出现这种情况时,文本将被删除,并显示一条框消息:“W行”&r&“必须仅包含数字!”,该消息告诉错误的行号。r-设置为Target.Row

我的问题是,当我复制w10:w12范围内的文本时,我会收到3次错误消息,这很好。但是,在消息框中,它仅显示行编号w10-3次,即“行w10必须只包含数字!”。如何使代码显示带有w10的消息框,然后是w11,最后是w12

 Private Sub Worksheet_Change(ByVal Target As Range) Dim cell As Range
 Dim r As Long

 r = Target.Row

 Application.EnableEvents = False
 For Each cell In Target
     If Not Application.Intersect(cell, Range("w10:w10000")) Is Nothing Then   
        If Not IsNumeric(cell.Value) Then
           MsgBox "The row W" & r & " must contain only digits!"
           cell.Value = vbNullString
        End If
     End If
  Next cell
  Application.EnableEvents = True
[…]以在每次“W”列中插入文本时接收错误消息。发生这种情况时,文本将被删除,并显示一条框消息:“W行”&r&“必须仅包含数字!”

在这里正确的做法是使用数据验证,以限制单元格可能采用的值

如果给定无效值,可以指定Excel显示的错误消息:

…甚至在选定单元格时显示工具提示消息:

在这里,我为单元格A1配置了数据验证:

您可以使用VBA代码(使用
Range.Validation
API)完成所有这些,但实际上根本不需要

[…]以在每次“W”列中插入文本时接收错误消息。发生这种情况时,文本将被删除,并显示一条框消息:“W行”&r&“必须仅包含数字!”

在这里正确的做法是使用数据验证,以限制单元格可能采用的值

如果给定无效值,可以指定Excel显示的错误消息:

…甚至在选定单元格时显示工具提示消息:

在这里,我为单元格A1配置了数据验证:


您可以使用VBA代码(使用
Range.Validation
API)完成所有这些操作,但实际上根本不需要。

首先获取相交范围,然后检查这些单元格会更容易:

Sub F()

    Dim cell As Range
    Dim rngArea As Range
    Dim rngIntersect As Range

    Set rngIntersect = Intersect(Selection, [W10:W10000])
    If rngIntersect Is Nothing Then Exit Sub

    For Each rngArea In rngIntersect.Areas
        For Each cell In rngArea
            '// The code...
        Next
    Next

End Sub

首先获取相交范围,然后检查这些单元格会更容易:

Sub F()

    Dim cell As Range
    Dim rngArea As Range
    Dim rngIntersect As Range

    Set rngIntersect = Intersect(Selection, [W10:W10000])
    If rngIntersect Is Nothing Then Exit Sub

    For Each rngArea In rngIntersect.Areas
        For Each cell In rngArea
            '// The code...
        Next
    Next

End Sub


..&cell.row&..
..&cell.row&..
这太简单了。你真棒。谢谢大家!@geocc警告:您可以做您想做的事情,而无需编写一行VBA代码(请参见下面的答案)。首先获取相交范围,然后检查这些单元格(不要执行“无检查”):)<代码>用于Intersect中的每个rngArea(选择[W10:W10000])。区域:用于rngArea中的每个单元格:下一个:下一个@JohnyL,从长远来看,这可能会更快,尤其是当粘贴范围有大量不必要的单元格时。但总的来说,Mat'sMug的答案是最好的。在这种情况下,我只是回答了问题,并将优化留给OP。如果OP需要帮助优化,他们可以随时转到CodeReview,现在问题已经解决了。@JohnyL可以将您的方法作为答案。我不反对别人的答案,特别是如果他们是一条更好的路线,那太容易了。你真棒。谢谢大家!@geocc警告:您可以做您想做的事情,而无需编写一行VBA代码(请参见下面的答案)。首先获取相交范围,然后检查这些单元格(不要执行“无检查”):)<代码>用于Intersect中的每个rngArea(选择[W10:W10000])。区域:用于rngArea中的每个单元格:下一个:下一个@JohnyL,从长远来看,这可能会更快,尤其是当粘贴范围有大量不必要的单元格时。但总的来说,Mat'sMug的答案是最好的。在这种情况下,我只是回答了问题,并将优化留给OP。如果OP需要帮助优化,他们可以随时转到CodeReview,现在问题已经解决了。@JohnyL可以将您的方法作为答案。我对别人的答案投赞成票没有问题,特别是如果他们是一条更好的路线的话。@ScottCraner总是努力用最好的锤子来完成这项工作=)再说一遍,我太懒了。我知道最好的答案应该是什么,但回答的是被问到的问题,而不是隐含的问题。我希望我能强迫改变正确的答案,但有些事情告诉我,这将是社区投票高于公认答案的一种。如果可以的话,我会删除。@ScottCraner不,你的回答完全正确-我不会屏住呼吸在上面挂一个[民粹主义]徽章;-)@Mat的杯子-谢谢你的建议。我也意识到了这一点。我的想法是,我试图删除所有的数据验证,只是把所有的东西都放进去VBA@ScottCraner总是努力用最好的锤子来完成这项工作(再说一次,我太懒了。我知道最好的答案应该是什么,但回答的是被问到的问题,而不是隐含的问题。我希望我能强迫改变正确的答案,但有些事情告诉我,这将是社区投票高于公认答案的一种。如果可以的话,我会删除。@ScottCraner不,你的回答完全正确-我不会屏住呼吸在上面挂一个[民粹主义]徽章;-)@Mat的杯子-谢谢你的建议。我也意识到了这一点。我的想法是,我试图删除所有的数据验证,只是把所有的东西放在VBAThis是好的,但你不应该回答我,而是上面的问题。有些人可能会认为你没有回答OP提出的问题是错误的。删除了你的名字:)我投了更高的票,但我指的不是我的名字,我对自己的错误没有问题,希望更多人会这样做,这样我就可以学习了。我指的是OP提出的问题:
如何让代码显示带有w10的消息框,然后是w11和。。。然后是w12?
。这并没有回答OP提出的问题。在我的回答中,我可以看到如何实施你的建议,其他人的可能不会。我想说的是,有那些人