VBA Date code returning error

I have the following code.  My workbook has multiple worksheets with dates as the names.  I am getting an error when testing this code in the immediate window to get the most recent date.  I can't figure out what is wrong.  Please help!

Function getMostRecentDate()
    Dim wsSheet As Worksheet
    Dim datMostRecent As Date
    Dim datTestDate As Date
   
    datMostRecent = 0
    For Each wsSheet In Worksheets
        datTestDate = CDate(wsSheet.Name)
        If datTestDate > datMostRecent Then
        datMostRecent = datTestDate
        End If
    Next wsSheet
    getMostRecentDate = datMostRecent
   
End Function
karaflanaganAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

karaflanaganAuthor Commented:
I am getting a Run-time error '13'
Type mismatch
Anthony BerenguelCommented:
What is the date format you're using in your worksheet names? Remember that value (worksheet.name) is a string so you need to keep that in mind when you use that value to populate a date variable.
karaflanaganAuthor Commented:
23-Aug-13
Your Guide to Achieving IT Business Success

The IT Service Excellence Tool Kit has best practices to keep your clients happy and business booming. Inside, you’ll find everything you need to increase client satisfaction and retention, become more competitive, and increase your overall success.

byundtMechanical EngineerCommented:
I assume that the error occurs on the CDate statement. If so, what is the value of wsSheet.Name?

Just for grins, I tested CDate("2-29-14") in the Immediate pane--and got a Type 13 Type Mismatch error. But DateSerial(2014, 2, 29) returned March 1, 2014 (as it should in a non-Leap Year).
byundtMechanical EngineerCommented:
?CDate("23-Aug-13") is working in Excel 2013 (32-bit) for me in the Immediate pane.

Which version of Excel are you using?
karaflanaganAuthor Commented:
Excel 2010 not sure if it is 32 bit or 64 bit
Jesus RodriguezIT ManagerCommented:
You're declaring
Dim datMostRecent As Date
and then Assign the value of 0 here  datMostRecent = 0 ??
byundtMechanical EngineerCommented:
I also have 32-bit Excel 2010, and ?CDate("23-Aug-13") is working for me there, as well.

The statement flagged by Jesus Rodriguez is working fine in that test workbook.
karaflanaganAuthor Commented:
byundt, I am trying to actually run the GetMostRecentDate Function and have it return a value, not CDate.
karaflanaganAuthor Commented:
Jesus - Excel reads dates as serial numbers.
byundtMechanical EngineerCommented:
Could you post a workbook that demonstrates the problem? It doesn't need to have any data in the worksheets, and it doesn't need to include any code other than the function being discussed.
byundtMechanical EngineerCommented:
If one of the worksheet names is not a date, then CDate will fail. A worksheet formula referencing your function will return #VALUE! error, and the Immediate pane will return a Type 13.

Should this be a concern, you can add "On Error Resume Next" to handle the possibility of worksheet names that aren't dates.
Function getMostRecentDate()
    Dim wsSheet As Worksheet
    Dim datMostRecent As Date
    Dim datTestDate As Date
    
    On Error Resume Next
    datMostRecent = 0
    For Each wsSheet In Worksheets
        datTestDate = CDate(wsSheet.Name)
        If datTestDate > datMostRecent Then
            datMostRecent = datTestDate
        End If
    Next wsSheet
    On Error GoTo 0
    getMostRecentDate = datMostRecent
    
End Function

Open in new window

karaflanaganAuthor Commented:
Here is an example.  I am not done with the project yet but I don't want to continue with these functions still not working.
Test-Workbook.xlsm
byundtMechanical EngineerCommented:
You have a worksheet named Reports. This will cause a run-time error with CDate.  As a workaround, I added a test for the worksheet name beginning with a number.

You also put the functions in the code pane for a userform. I moved them to a regular module sheet (which I named modFunctions).

The function getEarliestDate referred to an undeclared variable datMostRecent. I changed that reference to datEarliest.
Function getMostRecentDate()
    Dim wsSheet As Worksheet
    Dim datMostRecent As Date
    Dim datTestDate As Date
    
    datMostRecent = 0
    For Each wsSheet In Worksheets
        If Val(wsSheet.Name) > 0 Then
            datTestDate = CDate(wsSheet.Name)
            If datTestDate > datMostRecent Then
                datMostRecent = datTestDate
            End If
        End If
    Next wsSheet
    getMostRecentDate = datMostRecent
    
End Function
Function getEarliestDate()
    Dim wsSheet As Worksheet
    Dim datEarliest As Date
    Dim datTestDate As Date
    
    datEarliest = 99999
    For Each wsSheet In Worksheets
        If Val(wsSheet.Name) > 0 Then
            datTestDate = CDate(wsSheet.Name)
            If datTestDate < datEarliest Then
                datEarliest = datTestDate
            End If
        End If
    Next wsSheet
    getEarliestDate = datEarliest
    
End Function

Open in new window

Test-WorkbookQ28335626.xlsm

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft Excel

From novice to tech pro — start learning today.