2015-08-20 81 views
3

在我的表格列B:C中允許日期。我試圖創建一個檢查,看看在C中輸入的日期是否比B更新,如果這麼好,還會提醒用戶並清除內容。 我的代碼返回運行時錯誤91在application.intersect行:Excel VBA在比較日期的兩個單元格時出錯

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim Dates As Range 
    Set Dates = Range("C4:C12") 

    If Target.Cells.Count > 1 Or IsEmpty(Target) Then 
    Exit Sub 
    End If 
    If Not Application.Intersect(Dates, Range(Target.Address)).Value > ActiveCell.Offset(0, -1).Value Then 
    GoTo DatesMissMatch 
    Else 
     Exit Sub 
    End If 

DatesMissMatch: 
    Target.ClearContents 
    ActiveCell.Value = "A2" 
    MsgBox "Please re-check dates" 
End Sub 
+0

你會得到什麼錯誤? – MatthewD

+0

當然,對不起...如果不Application.Intersect(日期,範圍(Target.Address))。值> ActiveCell.Offset(0,-1).Value然後 轉到DatesMissMatch –

回答

2

我改變了你的方法,但這似乎是工作。

我還注意到您正在編寫A2ActiveCell而不是Target。如果輸入了無效數據,您是否希望C列中的單元格更新?或者您是否打算將它移動到更改的那個單元格中?

無論如何,這裏有一個方法,我想出了它

Private Sub Worksheet_Change(ByVal Target As Range) 

     If Target.Cells.Count > 1 Or IsEmpty(Target) Then 
       Exit Sub 
     End If 

     If Target.Column = 3 Then 'Check to see if column C was modified 
       If Target.Value < Target.Offset(0, -1).Value Then 
         Target.ClearContents 
         Target.Value = "A2" 
         MsgBox "Please re-check dates" 
       End If 
     End If 

End Sub 

如果你想堅持目前你正在做的方式,那麼我認爲你需要檢查的交集不是空作爲另一個答案的結論。

+0

這個工程很神奇。非常感謝! –

+1

沒問題,如果你不介意點擊綠色複選標記來接受我的答案(如果這對你有用),我將不勝感激。我喜歡假的互聯網點! :P – Soulfire

1

你可以只環行和比較的日期。

Dim ws As Excel.Worksheet 
Set ws = Application.ActiveSheet 

Dim lRow As Long 
lRow = 4 
Do While lRow <= ws.UsedRange.Rows.count 
    If ws.Range("C" & lRow).Value > ws.Range("B" & lRow).Value then 
     GoTo DatesMissMatch 
    End if 
lRow = lRow + 1 
Loop 
+0

謝謝MatthewD,關於輸入數據列BI得到一個運行時錯誤424在行:Do而lRow <= ws.UsedRange.Rows.Count –

+0

作出更改。您需要添加昏暗的ws並設置ws行。所以ws會是當前的工作表。 – MatthewD

+0

像我這樣的初學者,修改這段代碼會讓我陷入各種循環,但是我無法讓它工作:)似乎我應該更好地定義工作範圍以及循環何時停止。 –

1

我相信你只需要檢查相交比做比較。

Sub Worksheet_Change(ByVal Target As Range) 

    Dim Dates As Range 
    Set Dates = Range("C4:C12") 

    If Target.Cells.Count > 1 Or IsEmpty(Target) Then 
    Exit Sub 
    End If 

    If Not Application.Intersect(Dates, Range(Target.Address)) Is Nothing Then 
     If Target.Value < Target.Offset(0, -1).Value Then 
      GoTo DatesMissMatch 
     Else 
      Exit Sub 
     End If 
    End If 

DatesMissMatch: 
    Target.ClearContents 
    ActiveCell.Value = "A2" 
    MsgBox "Please re-check dates" 
End Sub 
+0

我不知道爲什麼,但這讓我陷入了一些循環。 –