搜索多个字符串,找到时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 Booleanokay = 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的主要内容,如果未能解决你的问题,请参考以下文章

c# 使用sharpPcap制作的网络监视器应用程序,每次调用应显示一个msgbox的方法每次调用显示多个msgbox

如果找不到值,则显示消息框

VBA消息框(MsgBox)

多个文件存在检查?更好的方法?

VBA Excel 错误对象变量或未设置块变量

Python 的 list.index() 函数,当没有找到时不会抛出异常