I\'m trying to convert a string into date
a = Datumo: 16.09.2012.
d = Mid(a, 9, 2) \' 16 - should be the day
m = Mid(a, 12, 2) \' 09 - month
y = Mid(a, 15, 4)
Thats not a correct use of DateValue
, replace
dt = DateValue(d, m, y) ' Error line
dt = DateAdd("d", 1, dt) ' should be 17.09.2012.
with
dt = DateSerial(y, m, d)
dt = DateAdd("d", 1, dt)
or
dt = 1 + DateAdd("d", 1, dt)
VBA/Excel will often attempt to determine dates and get it wrong.
Eg
dt = DateSerial(2012, 14, 42) 'returns #14/03/2013#
dtReal = IsDate("09 / 14 / 2012") 'returns TRUE when we really wanted to test dd/mm/yyyy - there's no 14th month.
I often use the code below which is a longer but foolproof method of determining if a string date is real and return it as a date.
Option Explicit
Sub test()
Dim testDate As Boolean
Dim dt As Date
testDate = IsTextDate("05/07/2012", dt, "dd/mm/yyyy") 'Could pass "mm/dd/yyyy" instead
If testDate = True Then
Debug.Print "Valid Date " & Format(dt, "dd-mmm-yyyy")
Else
Debug.Print "Invalid Date"
End If
End Sub
Function IsTextDate(ByVal str As String, ByRef dt As Date, Optional dtFormat As String = "dd/mm/yyyy") As Boolean
Dim D As Date
Dim day As Integer
Dim month As Integer
Dim year As Long
Dim daysinFeb As Integer
Dim dtArray() As String
'Test input string mask matches date format
If Not (str Like "##/##/####") Then
'Debug.Print "Invalid Date"
Exit Function
Else
'split string on delimiter and extract correct 'dd' and 'mm' based on UK/US format
dtArray = Split(str, "/")
year = CInt(dtArray(2))
If dtFormat = "dd/mm/yyyy" Then
day = CInt(dtArray(0))
month = CInt(dtArray(1))
Else
day = CInt(dtArray(1))
month = CInt(dtArray(0))
End If
'determine days in Feb for year given.
If IsDate("2/29/" & year) Then
daysinFeb = 29
Else
daysinFeb = 28
End If
'determine if date is valid
Select Case month
Case 9, 4, 6, 11
'30 days
If day <= 30 Then IsTextDate = True
Case 1, 3, 5, 7, 8, 10, 12
'31 days
If day <= 31 Then IsTextDate = True
Case 2
'either 28 or 19 days
If day <= daysinFeb Then IsTextDate = True
End Select
If IsTextDate Then dt = DateSerial(year, month, day)
End If
End Function
Look at the DatePart
function ;)
From exccel-help:
Dim Datum1 As Date ' Variablen deklarieren.
Dim Msg
Datum1 = InputBox("Geben Sie ein Datum ein:")
Msg = "Quartal: " & DatePart("q", Datum1)
MsgBox Msg
Also there are specific function to retrieve parts of a valid date:
Day()
Month()
Year()
Example from excel-help:
Dim Datum1, Tag1
Datum1 = #12. Februar 1969# ' Datum zuweisen.
Tag1 = Day(Datum1) ' Tag1 enthält 12.