Vba 显示多个错误时获取行号的消息框
每次在“W”列中插入文本时,我都会使用此代码接收错误消息。出现这种情况时,文本将被删除,并显示一条框消息:“W行”&r&“必须仅包含数字!”,该消息告诉错误的行号。r-设置为Target.Row 我的问题是,当我复制w10:w12范围内的文本时,我会收到3次错误消息,这很好。但是,在消息框中,它仅显示行编号w10-3次,即“行w10必须只包含数字!”。如何使代码显示带有w10的消息框,然后是w11,最后是w12Vba 显示多个错误时获取行号的消息框,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
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提出的问题。在我的回答中,我可以看到如何实施你的建议,其他人的可能不会。我想说的是,有那些人