Reputation: 1396
I've written the following code to find the oldest of five dates. It works as expected, but I'm curious if there's a more elegant way to compare five dates. Does anyone have any ideas?
Dim sTemp
sTemp = ""
If IsDate(dtOne) Then
If IsDate(dtTwo) Then
If CDate(dtOne) < CDate(dtTwo) Then
sTemp = dtOne
Else
sTemp = dtTwo
End If
Else
sTemp = dtOne
End If
ElseIf IsDate(dtTwo) Then
sTemp = dtTwo
End If
If IsDate(dtThree) Then
If IsDate(sTemp) Then
If CDate(dtThree) < CDate(sTemp) Then
sTemp = dtThree
End If
Else
sTemp = dtThree
End If
End If
If IsDate(dtFour) Then
If IsDate(sTemp) Then
If CDate(dtFour) < CDate(sTemp) Then
sTemp = dtFour
End If
Else
sTemp = dtFour
End If
End If
If IsDate(dtFive) Then
If IsDate(sTemp) Then
If CDate(dtFive) < CDate(sTemp) Then
sTemp = dtFive
End If
Else
sTemp = dtFive
End If
End If
Upvotes: 0
Views: 1793
Reputation: 7490
You asked for an elegant approach, then use an ArrayList, fill it and sort it. Underneath the proof of concept code, it does not handle exceptions like none of the dates are valid:
' Create a new arraylist
Set arrayList = createobject("System.Collections.ArrayList")
' Loop through all dates
For each d in array("23-5-2007", "28-6-2010", "16-9-2001", "32-12-2000")
' See if the date is valid. If true, convert it to a date and add it to the list
If isDate(d) Then arrayList.Add cDate(d)
Next
' Sort the list from oldest to newest date
arrayList.Sort
' Get the first item, it will be the oldest date (16-9-2001)
OldestDate = arrayList.Item(0)
Upvotes: 0
Reputation: 200443
I would use something like this:
sTemp = GetOldestOf(sTemp, dtOne) ' this instruction makes "dtOne" the current
' current oldest date, b/c "sTemp" is auto-
' initialized as Empty
sTemp = GetOldestOf(sTemp, dtTwo)
sTemp = GetOldestOf(sTemp, dtThree)
sTemp = GetOldestOf(sTemp, dtFour)
sTemp = GetOldestOf(sTemp, dtFive)
If isEmpty(sTemp) Then
WScript.Echo "No valid date found!"
Else
WScript.Echo "Oldest date is: " & sTemp
End If
' pre-condition: d1 is either Empty or the current oldest date
Function GetOldestOf(ByVal d1, ByVal d2)
GetOldestOf = d1 ' make d1 the default return value
If IsDate(d2) Then ' d2 is a valid date
d2 = CDate(d2)
If IsEmpty(d1) Then ' if d1 is empty, d2 is automatically oldest
GetOldestOf = d2
ElseIf d1 > d2 Then ' otherwise check if d2 is older
GetOldestOf = d2
End If
End If
End Function
GetOldestOf()
returns the second argument (converted to a date) if the argument is a valid date and the first argument is either Empty
or newer than the second argument. Otherwise the function returns the (unmodified) first argument, which by definition is either Empty
or the current oldest date.
Upvotes: 0
Reputation: 13132
How about something like this, it does each comparison and if neither passed variables are date it restores sTemp to "":
Dim sTemp
sTemp = ""
sTemp = OldestDate(dtOne, dtTwo)
sTemp = OldestDate(dtThree, sTemp)
sTemp = OldestDate(dtfour, sTemp)
sTemp = OldestDate(dtfive, sTemp)
Function OldestDate(dtOne, dtTwo)
If IsDate(dtOne) Then
If IsDate(dtTwo) Then
If CDate(dtOne) < CDate(dtTwo) Then
OldestDate = dtOne
Else
OldestDate = dtTwo
End If
Else
OldestDate = dtOne
End If
ElseIf IsDate(dtTwo) Then
OldestDate = dtTwo
Else
OldestDate = ""
End If
End Function
Upvotes: 1