【问题标题】:VBA - if cell contains a word, then messagebox just one single timeVBA - 如果单元格包含一个单词,那么消息框只有一次
【发布时间】:2021-04-27 08:28:32
【问题描述】:

我的想法是每次在 A 列的单元格中输入“高”一词时都会收到警报(如果该词包含在更长的字符串中)。仅当我编辑一个单元格并且我的文本包含“高”并且我确认时才会弹出此警报(当我在单元格上按“输入”以确认或离开编辑的单元格时会显示警报)。所以我做了这个代码:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not IsError(Application.Match("*high*", Range("A:A"), 0)) Then
       MsgBox ("Please check 2020 assessment")
End If
End Sub

代码似乎运行良好。我在 A 列的单元格中输入“高”,并在我确认离开单元格时收到警报。 问题是,当我有一个“高”单元格时,警报会继续在我所做的每一个修改中弹出,在每个单元格中。所以不可能在工作表上工作。 我需要一个代码来确保在数字“高”之后,我只收到一次警报,然后在编辑任何单元格时我不会收到其他警报,除非我在另一个单元格中数字“高”,或者我去修改一个已经包含“高”的单元格,我再次确认。 我能做什么?谢谢!!

【问题讨论】:

    标签: excel vba if-statement text msgbox


    【解决方案1】:

    这将设置一个目标(监控范围)并检查更改的第一个单元格是否包含单词

    请注意,如果您不想在修改范围时检查每个更改的单元格(例如,当您复制和粘贴多个单元格时),则必须使用循环

    Private Sub Worksheet_Change(ByVal Target As Range)
        
        ' Set the range that will be monitored when changed
        Dim targetRange As Range
        Set targetRange = Me.Range("A:A")
        
        ' If cell changed it's not in the monitored range then exit sub
        If Intersect(Target, targetRange) Is Nothing Then Exit Sub
        
        ' Check is cell contains text
        If Not IsError(Application.Match("*high*", targetRange, 0)) Then
            ' Alert
            MsgBox ("Please check 2020 assessment")
        End If
        
    End Sub
    

    让我知道它是否有效

    【讨论】:

      【解决方案2】:

      我试过你的代码;现在,如果“A”列有一个“高”单元格,则警报正确弹出,如果我在“A”列以外的列中编辑单元格,我不会收到警报,所以这是个好消息!

      坏消息是,如果我在 A 列中有一个“高点”,当我在“A”列本身编辑任何其他单元格时,我仍然每次都会收到警报。

      【讨论】:

        【解决方案3】:

        工作表更改:目标包含字符串

        • 无论您输入一个或多个条件值,消息框都只会显示一次。

        守则

        Option Explicit
        
        Private Sub Worksheet_Change(ByVal Target As Range)
            
            Const srcCol As String = "A"
            Const Criteria As String = "*high*"
            
            Dim rng As Range: Set rng = Intersect(Columns(srcCol), Target)
            If rng Is Nothing Then
                Exit Sub
            End If
            
            Application.EnableEvents = False
            
            Dim aRng As Range
            Dim cel As Range
            Dim foundCriteria As Boolean
            For Each aRng In rng.Areas
                For Each cel In aRng.Cells
                    If LCase(cel.Value) Like LCase(Criteria) Then
                        MsgBox ("Please check 2020 assessment")
                        foundCriteria = True
                        Exit For
                    End If
                Next cel
                If foundCriteria Then
                    Exit For
                End If
            Next aRng
            
            Application.EnableEvents = True
            
        End Sub
        
        Sub testNonContiguous()
            Range("A2,A12").Value = "high"
        End Sub
        

        【讨论】:

        • 谢谢。代码完美运行!还有一个问题:如果我要添加另一个标准(如果单元格包含单词“high”,但如果它包含单词“critic”,则提醒)..您说此代码也可以使用更多标准,我尝试了“并且, "or", "& _", 在第一个条件 Const Criteria As String = "high" 之后,但似乎没有任何效果......任何提示?
        • 通过多个标准值我的意思是如果你例如复制/粘贴 50 个包含标准值的单元格,不会有 50 个(烦人),而只有一个消息框。您可以就新要求提出另一个问题,并在此页面上发布指向它的链接,例如在您的 cmets 中,因此任何关注此问题的人都会收到通知。
        • 感谢您的提示。这是我在工作和家里进行了几个月的 vba 测试后在这个论坛上的第一篇文章。我又问了一个问题,链接是stackoverflow.com/questions/65857382/…
        猜你喜欢
        • 2016-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        • 2016-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多