首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VBA -如果单元格包含一个单词,那么messagebox只有一次

VBA -如果单元格包含一个单词,那么messagebox只有一次
EN

Stack Overflow用户
提问于 2021-01-23 04:42:34
回答 3查看 262关注 0票数 1

我的想法是,每当我在A列的单元格中输入单词“高”时(如果该单词包含在一个更长的字符串中),就会收到一个警告。只有当我编辑一个单元格并且我的文本包含“高”并且我确认(当我在单元格上按"enter“确认或者只是离开编辑的单元格时,该警告才会弹出)。所以我写了这段代码:

代码语言:javascript
复制
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列的一个单元格中输入“高”数字,并在确认离开单元格时收到警报。问题是,当我有一个“高”单元格时,在每个单元格中,我所做的每一次修改都会继续弹出警报。所以在工作表上工作是不可能的。我需要一个代码来确保,在数字“高”之后,我只收到一次警告,然后我在编辑任何单元格时不会收到其他警告,除非我在另一个单元格中输入“高”,或者我去修改一个已经包含“高”的单元格并再次确认它。我能做些什么?谢谢!!

EN

回答 3

Stack Overflow用户

发布于 2021-01-23 05:07:18

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

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

代码语言:javascript
复制
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

如果有效,请让我知道

票数 0
EN

Stack Overflow用户

发布于 2021-01-23 06:10:23

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

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

票数 0
EN

Stack Overflow用户

发布于 2021-01-23 07:57:56

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

  • 无论您输入的是一个标准值还是多个标准值,消息框都将只显示一次。

代码

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65852491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档