【发布时间】:2013-05-13 13:54:47
【问题描述】:
我正在使用 ADO (Provider = "Microsoft.Jet.OLEDB.4.0") 将电子表格从 Excel 2003 导入到 Access 2003。但是,我在日期字段中有一些文本条目。正如您所料,这些值以#Num! 的形式出现。
我想做的是将有问题的字段包装在IIf(IsDate(FIELDNAME),FIELDNAME,#1/1/1900#) 之类的东西中。但是,这仍然会导致#Num!。测试IsDate()、IsDate(CVar())、IsError()、IsError(CDat()) 和VBAFunctionThatReturns0GivenAnyValue(FIELDNAME) 也是如此。
任何人都知道我可以使用的包装函数来完成这项工作吗?我或多或少已经束手无策了?
请注意:我对导入的数据没有任何控制权,因此我无法修复电子表格,就像我想的那样。我还想避免导入函数本身的特定黑客行为(例如,改用 TransferSpreadsheet)。目标是使用相同的方法来引入数据,只是忽略不起作用的位。
还应该指出,这里的非日期值被丢弃是合适的。理想情况下,我希望避免以文本形式导入,因为它会进一步导致各种其他错误。
编辑:添加了 2003 年的规定。我还应该指出,安装在环境中的 .Net 框架版本不包括(或似乎不包括)ACE.12.0 提供程序。
编辑 2:根据要求,这是我正在执行的 SQL 的(稍微清理过的)版本。请注意,这不是确切的查询,但在同一个电子表格上运行它会导致相同的问题:
SELECT
CStr(Nz([Notes], "")),
[ID],
[Date]
INTO
[;DATABASE=C:\DatabaseTarget.Mdb].[tblImport]
FROM
[Excel 8.0;Database=C:\ExcelSheet.xls].[sheet1$]
WHERE
[ID] IS NOT NULL
可以通过删除INTO 子句并查看[Date] 的值来发现问题。如果它们中的任何一个是#Num!,那么即使对所有Test1-5 在#Num!s 中执行以下结果,也可以说明问题。:
SELECT
CStr(Nz([Notes], '')),
[ID],
CStr(Nz([Date],'')) As [Test1],
IsError([Date]) As [Test2],
IsDate([Date]) As [Test3],
IsNull([Date]) As [Test4],
IIf(True, 1, [Date]) As [Test5],
FROM
[Excel 8.0;Database=C:\ExcelSheet.xls].[sheet1$]
WHERE
[ID] IS NOT NULL
【问题讨论】:
标签: excel ms-access ado ms-access-2003