UserForm VBA中的DateDiff公式

问题描述 投票:0回答:1

我有两个文本框,分别包含开始日期和结束日期。

从这两个中,我想得到一个代表这两个之间的天数的数字。这是我的代码:

```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而不是值,但没有变化。

date userform datediff
1个回答
0
投票

根据文本框字符串正确计算DateDiff

尽管我通常do建议不要在文本框中将(日期)原始控制项(日期)建议为重新格式化(日期)的字符串,但我展示了一种非常接近您的方法的方法。这包括一些有关可读日期字符串的规定,以允许进行DateDiff()计算。

UserForm代码模块的声明头

为了保留正确的开始日期和结束日期(作为Date类型,而

not

作为字符串),我定义了一个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

UserForm事件过程

这些过程几乎保持不变,但包括

    通过`getDateString()进行DateString赋值,以提供可转换的日期字符串以及
  • 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
© www.soinside.com 2019 - 2024. All rights reserved.