MsgBox特定的单元格包含特定的文本时

每当单元格包含特定文本时,我想要popup消息。 每次单词“红色级别”都在这个单元格中(I22,I23,I34,I35,I36),我想要一个MsgBox出现。 我在上面提到的所有单元格中使用了一个数据validation列表,以确保“红色级别”一词总是相同的。

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

下面是一个单元格的代码:

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 

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

 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 

您可以使用工作表的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")定义父工作Worksheets("A12") 。 我的代码已经删除了父工作表参考。

为此,您可以通过两种方式来完成(至less)。 如果你想留在If ,你需要很多Or

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

但是,正如你所看到的,这将是一条很长的路线,这不是最直接的阅读。 这是一个替代scheme:

 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 

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

为什么不使用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"). 部分

DATA选项卡有一个用于数据validation的向导。第一个选项卡允许您定义一个条件。 此向导的第三个选项卡用于popup消息。

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

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