2017-03-17 89 views
2

我希望每次单元格包含特定文本时都会弹出消息。每当单词“红色级别”出现在这些单元格的任何一个中(I22,I23,I34,I35,I36),我想要出现一个MsgBox。 我在上面提到的所有单元格中使用数据验证列表,以确保单词“红色级别”始终相同。特定单元格包含特定文本时的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 
+2

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

回答

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 

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

+0

我正在考虑使用'Select Case'来做这个事情,并且做了一些像'Select Case'这样的事情来让它简单得多,但是想不出如何做到这一点。如果有人有想法,我个人很好奇将它视为解决方案。我正在考虑'选择案例范围(“I22”)。值或范围(“I23”)。值,...'除了'Select Case'之后只能有一个项目。这就是为什么我用数组/循环代替。 – BruceWayne

3

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

+0

这很好,聪明的想法!如果OP具有更大的检查范围,并且很可能比循环遍历单元更快,那么调整也更容易。 – BruceWayne

0

为什么不利用上找到想要的细胞范围是多少?

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").部分

相关问题