Формула DateDiff в пользовательской форме - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть два текстовых поля, которые содержат дату начала и дату окончания.

Я хочу получить число, которое представляет дни между этими двумя.

Private Sub TextBox20_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    'check date format
    With TextBox20
        If IsDate(TextBox20.Text) Then 'Format as desired.
            TextBox20.Text = Format(CDate(TextBox20.Text), "Dddd, d Mmm yyyy", vbMonday)
        Else
            TextBox20.Text = "" 'Clear the TextBox
            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)
    'check date format
    With TextBox21
        If IsDate(TextBox21.Text) Then 'Format as desired.
            TextBox21.Text = Format(CDate(TextBox21.Text), "Dddd, d Mmm yyyy", vbMonday)
        Else
            TextBox21.Text = "" 'Clear the TextBox
            MsgBox "Por favor, ingresar una fecha valida."
            Cancel = True
            Exit Sub
        End If    
    End With
End Sub

Private Sub TextBox22_AfterUpdate()
TextBox22.Value = DateDiff("d", CDate(TextBox20.Value), CDate(TextBox21.Value), vbMonday)    
End Sub

Я думал, что это потому, что я имел TextBoxes как .Text, а не .Value, но пока ничего не меняется.

1 Ответ

0 голосов
/ 11 февраля 2020

Правильный расчет 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...