【问题标题】:MsgBox when specific cells contain specific text特定单元格包含特定文本时的 MsgBox
【发布时间】:2017-03-17 19:45:58
【问题描述】:

我希望每次单元格包含特定文本时都会出现一条弹出消息。每次在任何一个单元格(I22、I23、I34、I35、I36)中出现“红色级别”这个词时,我都希望出现一个 MsgBox。 我在上述所有单元格中使用了数据验证列表,以确保“红色级别”一词始终相同。

我写了一些代码,但只有在我的范围内有 1 个单元格时才有效。当我尝试将其他单元格号码添加到我的代码中时,它仍然只适用于第一个单元格,而不适用于其余单元格。

以下是适用于一个单元格的代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
    If Worksheets("A12").Range("I22").Value = "Red Level" Then
         MsgBox ("Please call maintenance immediately to refill reservoir")
    End If 
End Sub

我以为我可以将其余的单元格添加到我的代码范围内,但这不起作用。 这就是我所做但没有工作的(只有当“红色级别在 I22 上而不是在其他单元格中”这个词时才会出现 MsgBox):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Sheets("A12").Range("I22,I23,I34,I35,I36").Value = "Red Level" Then
         MsgBox ("Please call maintenance immediately to refill reservoir")
    End If
End Sub

【问题讨论】:

  • 你确定是I22,I23,I34,I35,I36 不是I22,I23,I24,I25,I26 吗?因为在后一种情况下解决方案会容易得多。

标签: vba excel


【解决方案1】:

您可以使用工作表的 MATCH,但它不适用于不连续的单元格,因此必须进行两次检查。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    if not iserror(application.match("red level", Range("I22:I23"), 0)) or _
       not iserror(application.match("red level", Range("I34:I36"), 0)) then
         'Red Level is is at least one of the discontiguous cells
         MsgBox ("Please call maintenance immediately to refill reservoir")
    end if
End Sub

目前尚不清楚是什么真正驱动“红色级别”出现在范围内(“I22:I23,I34:I36”)。作为 Worksheet_Change,这可能会更好。照原样,如果一个或多个单元格保持“红色级别”,用户将无法浏览工作表。

在相关说明中:这是否在 A12 工作表的代码表中?如果是这样(作为工作表代码表中的私有子),则无需使用 Worksheets("A12") 定义父工作表。我的代码已删除父工作表引用。

【讨论】:

  • 这很好,聪明的想法!如果 OP 有更大的检查范围,也更容易调整,并且很可能比循环遍历单元格更快。
【解决方案2】:

为此,您可以通过两种方式(至少)做到这一点。如果你想留在If,你需要很多Or

If Sheets("A12").Range("I22").Value = "Red Level" or Sheets("A12").Range("I23").Value = "Red Level" or ... Then

但正如您所看到的,这将是一个非常长的行,这不是最容易阅读的。这是另一种选择:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False

Dim addr() As Variant
Dim hasPrompted As Boolean

hasPrompted = False

addr = Array("$I$22", "$I$23", "$I$34", "$I$35", "$I$36")
Dim i As Long
For i = LBound(addr) To UBound(addr)
    If Range(addr(i)).Value = "Red Level" And Not hasPrompted Then
        MsgBox ("Please call maintenance immediately to refill reservoir")
        hasPrompted = True
    End If
Next i
Application.EnableEvents = True
End Sub

注意第二个只会触发一次,即使所有单元格都有“红色级别”,或者只有一个单元格有它。如果你想提醒用户哪些单元格有它,你可以添加它,让我知道。

【讨论】:

  • 我正在考虑为此使用Select Case,并执行Select Case 之类的操作以使其更简单,但想不出怎么做。如果有人有想法,我个人很想将其视为解决方案。我在想Select Case Range("I22").Value or Range("I23").Value, ... 除了Select Case 之后只能有一项。这就是我改用数组/循环的原因。
【解决方案3】:

为什么不在想要的单元格范围上使用 find ?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Worksheets("A12").Range("I22,I23,I34:I36").Find(what:="Red Level", LookIn:=xlValues, lookat:=xlWhole) Is Nothing Then MsgBox "Please call maintenance immediately to refill reservoir"
End Sub

并且,正如@Jeeped 已经说过的,如果您正在监视的工作表以“A12”命名,那么您可以省略Worksheets("A12"). 部分

【讨论】:

    【解决方案4】:

    DATA 选项卡有一个数据验证向导, 第一个选项卡允许您定义条件。 此向导的第三个选项卡用于弹出消息。

    你不需要为此编写代码,它已经内置在 excel 中。

    http://www.excel-easy.com/basics/data-validation.html

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 2020-01-20
      • 2017-06-08
      相关资源
      最近更新 更多