We have a lot of automated spreadsheets that extract data, calculate forecasts, publish web pages, etc. It’s a really messy system, and I’d love to redo it (with, say, a real web service), but we don’t have permission to do that.
We run Excel 2007, with most of the spreadsheets converted to .xlsms.
Anyway, for some reason unknown to me, certain spreadsheets will format certain numeric cells as dates at seemingly random times. As you might imagine, the problem is difficult to track down, and usually I only find out when someone has written a nasty email about our data reading 3-Feb-1901 when it should read 400 (apparently Excel thinks there was a leap year in 1900).
I’ve explicitly set the cells in question to numeric format several times, only to find them filled with dates a week later.
I’ve scanned the macros (many are in the ancient Excel 4.0 macro language), they appear to be clean of any formatting changes. All copy/pastes are done as values and do not preserve source cell formatting.
There are no conditional formatting rules in the sheets in question.
Adding a little VBA to format the cells as desired in the Auto_Open subroutine appears to work around the issue.
Is this fix good enough, or in a week will I find the date format is appearing mid-calculation? If not, what is the root cause and how I can fix it?
One thing: I just read from this source that Excel ’07 may spontaneously change Normal-styled cells to the format [$-409]m/d/yy h:mm AM/PM;@. Some of my cells that have changed were definitely styled Normal, but evidently not all.
I’m assuming the cells in question are the receipients of copied/pasted data, or external/queried data?
Whenever you add pasted data to a cell in excel, it runs througha routine to determine the best format for anything that’s listed as “general” format, even if the source is “general” or “number”. Sometimes even setting the destination cells to “number” format does not clear up this issue. But I’ve found the only way to to get this to work the way you need it to is to explicitly declare the format (in the macro) to the destination range in question before the paste/update/refresh operation.
I also think there’s a way to disable date recognition within your VBA, but I can’t remember the exact code. Try recording a macro while doing manually importing or performing your update and you should be able to use what comes up.
Edit: just did a test run, and after your connection string and destination add:
That should definitely do the trick if you’re pulling data in from an external source and not copy/pasting.