DataWright Information Services

Consulting and Resources for Excel and Access




Transferring Times From Excel To Access

Application: Access and Excel

I recently came across an annoying problem when transferring dates and
times from Excel to Access. I had created a list of time intervals varying
from 0 to about 2 weeks, formatted them as dates, and imported them into
Access with the accompanying table. Trouble is, Access starts its calendar
one day earlier than Excel. Although the dates looked the same, the
underlying values were one day higher than the originals, for all time
intervals greater than one day. As these times formed the basis of a
scheduling application, that was a problem.

First workaround: Next idea was to format the intervals in General format in Excel, import
the numbers and convert them to dates during import. No good. All but about
10 of the records generated errors.

Second workaround: The data was imported into a field formatted as Double (double-precision
floating point, the default number format in Excel, also compatible with
dates), and I used an
expression in an Update query to convert the imported values to dates. Then
something really strange happened. The number 6.58333 converted correctly to
5-Jan-1900 14:00 but the number 6.25 converted to 6:25 (on 31-Dec-1899).
This also happened to 5.25, 4.25, 15.25…

Dates are really just numbers with a special format. In Excel, if you
create a date and time and then convert it to General format, you will see a
number with a decimal. The integer portion of the number represents the
date; the decimal is the fraction of a single day, and represents the time.
So, you would expect .25 to display as 6:00 AM and .75 to display as 6:00
PM.

The solution: Because Access was misinterpreting the imported values, the solution was
to  create a custom
function that converts any Double value to its corresponding date value.
This gives the expected time interval, every time.

The code

Function DblToDate(dblValue As Double) As Date
   Dim dblInterval As Double
   Dim lngDays As Long
   Dim intHours As Integer
   Dim intMinutes As Integer

   'convert value to minutes
   dblInterval = dblValue * 24 * 60
   'grab day value
   lngDays = dblInterval  1440
   'grab hour value
   intHours = (dblInterval Mod 1440)  60
   'grab minute value
   intMinutes = (dblInterval Mod 1440) Mod 60

   DblToDate = lngDays + TimeSerial(intHours, intMinutes, 0)
End Function

Using the code

To use, paste into a code module and create a query expression like
NewDate:DblToDate([SomeNumberField]).