我有一张带有以下栏目的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如何将日期实际存储在哪种格式中。
如何以年月日格式计算期间列。
感谢您的帮助。
答案 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)