在Excel中以DD / MM / YYYY存储日期&计算日期差异

时间:2014-09-30 06:05:43

标签: excel vba

我有一张带有以下栏目的Excel表格。

 A            B                   C                 D
 Worker       Work Start Date     Work End Date     Working Period(B-C)
 1            1/1/2014            1/10/2014         0 Years 0 Months 10 Days
 2            1/1/2014            2/28/2014         0 Years 2 Months 00 Days

我的Userform将接受文本框中的这些值并存储在Excel工作表中。

问题是何时输入日期[以dd / mm / yyyy格式]为15/07/2014,它接受并以Excel表格中的DD / MM / YYYY格式将其保存为15/07/2014。

如果我给15/17/2014它会抛出错误日期应该是DD / MM / YYYY

同样的事情如果我在2014年7月15日给出日期,它接受日期并在Excel列中保存为2014年7月15日,因为我将格式设置为DD / MM / YYYY,因此显示为15/07/2014

我使用了以下验证。

If Me.txtStartDate.Value = "" Then
    MsgBox "Please enter Work Start Date."
    Me.txtStartDate.SetFocus
    Exit Sub
End If

If Not IsDate(Me.txtStartDate.Value) Then
    MsgBox "The Work Start Date Field must be in DD/MM/YYYY format"
    Me.txtStartDate.SetFocus
    Exit Sub
End If

理想情况下,这就是我所期待的。 只能通过表格输入有效日期。我使用文本框以DD / MM / YYYY格式输入日期。用户可能会在日期中输入01/12/2014或2014年1月12日。我的意思是DD和&可以输入或不输入前导零。 MM。

请告知我如何处理这个问题。 excel如何将日期实际存储在哪种格式中。

如何以年月日格式计算期间列。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我认为此函数应该适合检查文本框中的字符串是否正确。 如果没问题,则返回true,并在第二个参数中返回解析日期。

Option Base 0

Function GetDate(str As String, ByRef res As Date) As Boolean
    On Error GoTo Err

    Splits = Split(str, "/")
    If UBound(Splits) + 1 <> 3 Then
        Err.Raise 0
    End If

    ds = DateSerial(Splits(2), Splits(1), Splits(0))

    ' e.g. DateSerial(2014, 1, 32) would be interpreted as Feb 1, 2014; this is checked here
    If Month(ds) <> CInt(Splits(1)) Or Day(ds) <> CInt(Splits(0)) Then
        Err.Raise 0
    End If

    res = ds
    GetDate = True
    Exit Function
Err:
    GetDate = False
End Function

问题是您可以定义输出格式,但VBA会根据您计算机上的区域设置解析输入。如果您所需的格式与默认格式不同,则必须自己实现解析。

答案 1 :(得分:0)

几件事:

一个。您可以在代码中的适当位置使用(绕过验证检查代码)

With ActiveWorkbook.Worksheets("yourSheet") 
.Columns("B:B").NumberFormat = "mm/dd/yyyy;@"  
.Columns("C:C").NumberFormat = "mm/dd/yyyy;@"  
End With

湾您可以像这样使用datediff

ToDate = "10/09/2014"                  'use range("yourRange").value  
FromDate = "09/19/2014"                'use range("yourRange").value   

dayDiffered = DateDiff("d", ToDate, FromDate)
monthDiffered = DateDiff("m", ToDate, FromDate)
yearDiffered = DateDiff("yyyy", ToDate, FromDate)