Правильный расчет DateDiff
на основе строк текстового поля
Хотя я обычно делаю советую против перезаписи оригинальных контрольных записей (дат) ) к переформатированной строке (date) в ваших текстовых полях, я демонстрирую возможный путь, очень близкий к вашему подходу. Это включает в себя некоторые положения для удобочитаемой строки даты, чтобы можно было вычислять DateDiff()
.
Глава объявления модуля кода UserForm
Для того, чтобы содержать правильные даты начала и окончания (как тип Date
и не как строку ), Я определяю структуру Type
, которую можно легко использовать в последующих процедурах.
Option Explicit
Private Type TThis
StartDate As Date
EndDate As Date
End Type
Dim this As TThis
Примеры процедур
Sub CheckDays()
вычисляет DateDiff
на основе записей в структуре типов, как указано выше. Он отличается от вашего кода, так как функция расчета вызывается каждый раз после выхода из текстовых полей. Function getDateString()
пытается преобразовать строки TextBox в тип Date, адаптируя результаты форматирования, которые могут привести к неправильному преобразованию даты. Окончательная проверка IsDate()
выполняется в процедурах обработки событий текстовых полей перед вызовом CheckDays
вычисления.
Private Sub CheckDays()
' Purpose: calculate DateDiff and enter result into TextBox22
' Note : called by TextBox20_Exit|TextBox21_Exit events
If this.StartDate > 0 And this.EndDate >= this.StartDate Then
TextBox22.Text = DateDiff("d", this.StartDate, this.EndDate, vbMonday)
End If
End Sub
Private Function getDateString(ByVal txt As String) As String
' Purpose: make (TextBox) string convertible to Date type, if possible
'a) remove leading day names (e.g. "Wednesday, 1 Jan 2020" ~> "1 Jan 2020")
If InStr(txt, ",") > 0 Then txt = Split(txt, ",")(1)
'b) add current year if missing (e.g. "1.1." ~> "1.1.2020")
If Not IsDate(txt) Then
If IsDate(txt & " " & Year(Now)) Then txt = txt & " " & Year(Now)
End If
getDateString = txt ' return function result
End Function
Процедуры обработки событий пользовательской формы
Эти процедуры оставлены почти без изменений, но включают
- a
DateString
назначение через `getDateString () для обеспечения конвертируемых строк даты, а также - вызов процедуры
CheckDays
для вычисления DateDiff
и введите результат в TextBox22
.
Дополнительное примечание: Вместо _Exit
событий можно было бы использовать _AfterUpDate
события, тоже.
Private Sub TextBox20_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With TextBox20
Dim DateString As String
DateString = getDateString(.Text) 'Make TextBox string convertible to Date type.
'check date format
If IsDate(DateString) Then 'Format as desired.
this.StartDate = CDate(DateString) 'Remember date (Date type).
.Text = Format(this.StartDate, "Dddd, d Mmm yyyy", vbMonday)
'========
CheckDays '<< Call procedure to calculate DateDiff.
'--------
Else
.Text = "" 'Clear the TextBox string
this.EndDate = 0
MsgBox "Por favor, ingresar una fecha valida."
Cancel = True
Exit Sub
End If
End With
End Sub
Private Sub TextBox21_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With TextBox21
Dim DateString As String
DateString = getDateString(.Text) 'Make TextBox string convertible to Date type.
'check date format
If IsDate(DateString) Then 'Format as desired.
this.EndDate = CDate(DateString) 'Remember date (Date type).
.Text = Format(this.EndDate, "Dddd, d Mmm yyyy", vbMonday)
'========
CheckDays '<< call procedure to calculate DateDiff
'--------
Else
.Text = "" 'Clear the TextBox string
this.EndDate = 0
MsgBox "Por favor, ingresar una fecha valida."
Cancel = True
Exit Sub
End If
End With
End Sub