2013-09-24 129 views
1
Option Explicit 

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    'Does the validation range still have validation? 
    If Not HasValidation(Range("A1:A1048576")) Then RestoreValidation 
    If Not HasValidation(Range("C1:C1048576")) Then RestoreValidation 
    If Not HasValidation(Range("I1:I1048576")) Then RestoreValidation 
    If Not HasValidation(Range("P1:P1048576")) Then RestoreValidation 
End Sub 

Private Sub RestoreValidation() 
    Application.EnableEvents = False 
    'turn off events so this routine is not continuously fired 
    Application.Undo 
    Application.EnableEvents = True 
    'and turn them on again so we can catch the change next time 
    MsgBox "Your last operation was canceled." & _ 
    "It would have deleted data validation rules.", vbCritical 
End Sub 

Private Function HasValidation(r) As Boolean 
    ' Returns True if every cell in Range r uses Data Validation 
    On Error Resume Next 
    Debug.Print r.Validation.Type 'don't care about result, just possible error 
    If Err.Number = 0 Then HasValidation = True Else HasValidation = False 
End Function 

我在上面的代碼中應用了4列的驗證,即使驗證通過了我得到4錯誤彈出消息如何限制錯誤消息的數量?避免excel中出現多個錯誤彈出消息

UPDATE:

我選擇從下拉這是一個有效的選擇的價值,但我得到了以下錯誤消息。 My sample excel我使用下面的代碼

+0

被應用到所有的片材或片材的一些或只是一個片材的驗證? –

+0

@SiddharthRout驗證適用於所有工作表。此代碼寫在ThisWorkBook選項卡下。 – MaheshVarma

+0

因此,如果您看到1張表的消息,那麼您不需要第二張表中的相同消息框? –

回答

1

如果您正在使用的紙張的Change事件工作,那麼我會建議在看看THIS

既然你只用一個片工作,那麼你不需要代碼在ThisWorkbook代碼區域。如果你把它放在那裏,那麼代碼將運行每個工作表。將代碼放入相關工作表的代碼區域。所以如果驗證是在Sheet1,那麼把代碼放在Sheet1的代碼區。請參閱下面的ScreenShot。

enter image description here

現在好了,以解決您的查詢。你可以做的是使用Boolean變量,然後將其設置爲True您展示的第一條消息之後,這樣的消息不會再次顯示。

嘗試此(UNTESTED)

Dim boolDontShowAgain As Boolean 

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error GoTo Whoa 

    Application.EnableEvents = False 

    If Not HasValidation(Range("A1:A1048576")) Then RestoreValidation 
    If Not HasValidation(Range("C1:C1048576")) Then RestoreValidation 
    If Not HasValidation(Range("I1:I1048576")) Then RestoreValidation 
    If Not HasValidation(Range("P1:P1048576")) Then RestoreValidation 

Letscontinue: 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume Letscontinue 
End Sub 

Private Sub RestoreValidation() 
    Application.Undo 
    If boolDontShowAgain = False Then 
     MsgBox "Your last operation was canceled." & _ 
     "It would have deleted data validation rules.", vbCritical 
     boolDontShowAgain = True 
    End If 
End Sub 

Private Function HasValidation(r) As Boolean 
    On Error Resume Next 
    Debug.Print r.Validation.Type 
    If Err.Number = 0 Then HasValidation = True 
End Function 
+0

使用上面的代碼我們可以從一個數據驗證單元複製到另一個具有數據驗證的單元。例如,如果我將列'I'的單元格數據複製到列B的單元格中,則我有一個包含不同數值(下拉)的數據驗證列'B'和另一組數值(下拉列表)的列'I'列B的單元格中的數據正在被列'I'的單元格值覆蓋。 @siddharthrout – MaheshVarma

+0

您可以使用INTERSECT的方法來檢查,如果用戶試圖在特定列寫。 –

+0

我是一個新手,以VBA,但作爲我工作的一部分,我得到了,我應該只從下拉限制在一個單元格的值的要求,如圖片所示(更新問題)。 – MaheshVarma