2016-02-19 210 views
2

因此,我已經瀏覽了本網站上的許多問題以回答此問題,並且我相信我的代碼是正確的,但它仍然無法正確驗證。我不明白爲什麼。使用VBA檢查日期是否在兩個日期之間

我所試圖做的事:

我在Excel中使用用戶窗體。我有一個日期輸入框和日曆選取器。當其中一個更改時,另一個更新。我正在嘗試驗證輸入框中輸入的日期是否爲有效日期,並在兩年時間範圍內,如果是,則更新日曆選擇器。

錯誤:

  1. 如果一個錯誤的日期輸入到輸入框中,然後該程序 出現了錯誤,因爲它不能與無效 日期更新日曆選取。 (這是一箇舊的錯誤,因此我做了驗證檢查)
  2. 如果輸入任何有效日期,它將不會在「If」語句中正確驗證。

例如:

如果我進入2016年2月18日,應該看到它是一個有效的日期,遲於oldDate,比lateDate更近。然後使用輸入框的值更新日曆選取器。但是,使用此代碼時,它總是重置輸入框的值並給出它未驗證的消息。

代碼:

Private Sub weekInput_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    Dim tempDate 
    Dim oldDate 
    Dim lateDate 

    tempDate = weekInput.Value 
    oldDate = Date - 365 
    lateDate = Date + 365 

    'Doing this to try and error check if an invalid date is given. Doesn't work for some reason. 
    If IsDate(tempDate) And tempDate > oldDate And tempDate < lateDate Then 
     'Find date of that week's Monday 
     weekPicker.Value = weekInput.Value 
    Else 
     weekInput.Value = weekPicker.Value 
     MsgBox "Didn't verify" 
    End If 
End Sub 
+0

添加另一個問題。有沒有辦法驗證2/18/16是否與2/18/2016相同? –

+1

是weekInput.Value真實日期還是真實日期的文本表示?通過將tempDate,oldDate和lateDate聲明爲Date類型,而不是鍵入Variant,會更好。 –

+1

對於你在評論中的第二個問題:'#2/18/16#=#2/18/2016#' –

回答

1

謝謝@RonRosenfeld他在對這個問題的評論答案。這是更正的代碼,它的作品。如果日期未通過更改用戶窗體上的文本顏色從混合到背景變爲紅色進行驗證,則添加的代碼還會顯示錯誤消息。

變化說明:

所做的第一個變化就是宣佈什麼類型的變量tempDateoldDatelateDate人。之前,沒有宣佈他們是變種。這確保它們被記錄爲日期類型,因此可以像我正在嘗試的那樣進行比較。

所以:

Dim tempDate 
Dim oldDate 
Dim lateDate 

變爲:

Dim tempDate As Date 
Dim oldDate As Date 
Dim lateDate As Date 

第二個變化是移動IsDate()自身的If聲明。這是因爲如果輸入的文本不是日期,它會在達到其他If語句之前導致致命錯誤,因爲它試圖將非日期保存到日期類型的變量。所以tempDate = weekInput.Value成爲:

​​

其餘的保持不變。除我刪除MsgBox並通過從混合到後臺爲紅色改變的錯誤消息的顏色通過將這些行的代碼由一個更好的,不太突兀錯誤消息:

dateError.ForeColor = &H80000004 
dateError.ForeColor = &HFF& 

答案:

以下是完整的代碼:

Private Sub weekInput_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    Dim tempDate As Date 
    Dim oldDate As Date 
    Dim lateDate As Date 

    If IsDate(weekInput.Value) Then 
     tempDate = weekInput.Value 
    End If 

    oldDate = Date - 365 
    lateDate = Date + 365 

    If tempDate >= oldDate And tempDate <= lateDate Then 
     weekPicker.Value = weekInput.Value 
     dateError.ForeColor = &H80000004 
    Else 
     weekInput.Value = weekPicker.Value 
     dateError.ForeColor = &HFF& 
    End If 
End Sub 
相關問題