2017-03-17 86 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").部分

相關問題