搜索多个字符串,找到时msgbox,如果没有则调用其他sub
Posted
技术标签:
【中文标题】搜索多个字符串,找到时msgbox,如果没有则调用其他sub【英文标题】:Search for multiple strings, msgbox when found, call other sub if not 【发布时间】:2022-01-22 19:27:19 【问题描述】:不得不扩展我以前的子。 需要找到三个字符串中的任何一个(错误,但存储为文本)。 如果找到,带有警告的 msgbox 并停止子。 如果找不到,请调用其他子。
以下是我目前的代码。 问题是,当找到字符串时,我也会调用另一个 sub。
Sub Z_ZWR_sprawdzbledy()
Dim MyAr(1 To 3) As String
Dim ws As Worksheet
Dim aCell As Range, bCell As Range
Dim i As Long
Set ws = ThisWorkbook.Sheets("komunikat_OS_zwroty")
MyAr(1) = "#VALUE!"
MyAr(2) = "#N/A"
MyAr(3) = "#REF!"
With ws
'~~> Loop through the array
For i = LBound(MyAr) To UBound(MyAr)
Set aCell = Worksheets("komunikat_OS_zwroty").Cells.Find(What:=MyAr(i), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not aCell Is Nothing Then
Set bCell = aCell
MsgBox "UWAGA! Znaleziono bledy!" & vbNewLine & vbNewLine & "SPRAWDZ KOMORKI Z #N/A!, #N/D! lub #REF!"
Else
End If
Next
Call zwrot2
End With
End Sub
【问题讨论】:
a) 找到错误字符串后,简单的Exit Sub
怎么样?否则你会得到消息框,但继续循环。 b) 如果您想交替执行Exit For
(即在For .. Next
块之外),则必须在块代码内分配一个布尔值(例如Dim ok as Boolean
、okay = False
,并在外部添加一个条件(即在Next
之后)像If okay Then zwrot2
一样仅在出现no 错误时启动zwrot2。
【参考方案1】:
一种可能的解决方案。代码在给定的范围内循环,如果有错误,将出现消息并将变量“blnCheckErrors”设置为true。
循环结束后,if 语句将检查“blnCheckErrors”。如果它是假的,那么给定的过程/子将被执行。
Sub Z_ZWR_sprawdzbledy()
Dim MyAr(1 To 3) As String
Dim ws As Worksheet
Dim aCell As Range, bCell As Range
Dim i As Long
Dim blnCheckErrors as boolean
Set ws = ThisWorkbook.Sheets("komunikat_OS_zwroty")
MyAr(1) = "#VALUE!"
MyAr(2) = "#N/A"
MyAr(3) = "#REF!"
With ws
'~~> Loop through the array
For i = LBound(MyAr) To UBound(MyAr)
'我稍微优化了这里的代码,因为你确实使用了与上面相同的语句(ThisWorkbook.Sheets("komunikat_OS_zwroty"))
Set aCell = .Cells.Find(What:=MyAr(i), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
If Not aCell Is Nothing Then
Set bCell = aCell 'Edit: What is this for? It seems that you don't use it again
MsgBox "UWAGA! Znaleziono bledy!" & vbNewLine & vbNewLine & "SPRAWDZ KOMORKI Z #N/A!, #N/D! lub #REF!"
blnCheckErrors = true
End If
Next
“调用”语句不再需要,只需使用子/函数的名称
if blnCheckErrors = false then zwrot2
End With
End Sub
【讨论】:
【参考方案2】:从表面上看,zwrot2 无论如何都会被调用。 您需要将 Call zwrot2 移动到 For 循环中,然后(我猜)在 ELSE 之后的 IF 语句中。
【讨论】:
这样不行,然后执行3次,但应该只执行一次。 好点 - 作为退出子的替代方案,您还可以添加一个计数器。首先将其设置为 0,然后在找到要查找的字符串之一时将其递增。在循环之后,添加一个 IF 计数器 > 0 然后调用 zwrot2 ;并通过从计数器 >0 上的 IF 语句调用它来显示该消息框一次以上是关于搜索多个字符串,找到时msgbox,如果没有则调用其他sub的主要内容,如果未能解决你的问题,请参考以下文章