我正在使用 ADO ( ) 将电子表格从 Excel 2003 导入 Access 2003 Provider = "Microsoft.Jet.OLEDB.4.0"
。但是,我在日期字段中有一些文本条目。#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]
. 如果其中任何一个是Then 甚至对所有 Test1-5#Num!
执行以下结果,这反而证明了这个问题。:#Num!
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