Excel中日期值的ADO查询返回工作表中格式的字符串

Excel中日期值的ADO查询返回工作表中格式的字符串,excel,vba,ado,adodb,Excel,Vba,Ado,Adodb,我正在尝试使用ADO查询从Excel工作表中提取数据。但是,返回日期值的方式与工作表上的格式相同,而不是实际的日期值。例如,值8/12/1929的格式为8/12/29,因此查询返回字符串“8/12/29”。这使得仅根据记录集数据很难确定正确的日期,因为在这种情况下,年份也可能是2029年 以下是ADO查询的代码: Function WorksheetRecordset(workbookPath As String, sheetName As String) As ADODB.Recordset

我正在尝试使用ADO查询从Excel工作表中提取数据。但是,返回日期值的方式与工作表上的格式相同,而不是实际的日期值。例如,值
8/12/1929
的格式为
8/12/29
,因此查询返回字符串“8/12/29”。这使得仅根据记录集数据很难确定正确的日期,因为在这种情况下,年份也可能是2029年

以下是ADO查询的代码:

Function WorksheetRecordset(workbookPath As String, sheetName As String) As ADODB.Recordset

Dim objconnection As New ADODB.Connection
Dim objrecordset As New ADODB.Recordset


'On Error GoTo errHandler

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1

objconnection.CommandTimeout = 99999999

objconnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=" & workbookPath & ";" & _
        "Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"

objrecordset.Open "Select * FROM [" & sheetName & "$]", _
    objconnection, adOpenStatic, adLockOptimistic, adCmdText

If objrecordset.EOF Then
    Set WorksheetRecordset = Nothing
    Exit Function
End If

Set WorksheetRecordset = objrecordset
On Error GoTo 0
Exit Function


errHandler:
Set WorksheetRecordset = Nothing
On Error GoTo 0

End Function
我正在使用,例如,获取值

Sub getValue(rs as ADODB.Recordset)

Debug.Print rs.Fields(0).Value

End Sub
部分问题可能是日期值在几行文本之后才开始,因此当ADO检测到字段类型为文本时,它可能只获取可见的格式化值。是否有方法检索实际日期值


编辑:刚刚意识到这与我之前问的这个问题类似:。但是我没有从那一个得到满意的答案,所以我还是要问这个问题。

因为您有58个字段,我认为最好是在包含数据的工作簿上构建一个字符串,运行以下代码:

Dim rng as Range
Dim val as Variant, txt as String
Set rng = Worksheets("sheetName").Range("A3:BF3")
For Each val In rng.Value
    txt = txt & "[" & val & "], "
Next val
Debug.Print txt
然后从即时窗口复制文本并粘贴到代码中,如下所示:

Dim strFields as String, strSQL as String
strFields = 'Paste the text here
'Note the FROM clause modification 
strSQL = "SELECT CDATE([myDate]), " & strFields & " FROM [" & sheetName & "$A3:BF]"
'...
objrecordset.Open strSQL, _
objconnection, adOpenStatic, adLockOptimistic, adCmdText

请注意,
FROM
子句的格式为
[表$A3:BF]
。这将第三行指定为包含数据的第一行。更多详细信息,请参见本节或本节

我认为问题在于您的
选择*
。假设列的标题(第一个单元格)是“myDate”。尝试使用[“&sheetName&“$”中的
SELECT CDATE([myDate])查看问题是否持续出现此问题是因为您在连接字符串中指定了
IMEX=1
,导致数据被解释为字符串(请参见)@kbsou,
CDATE([myDate])
方法成功地获取了实际日期。但我总共有58个字段要选择;有没有关于如何使用它并且在不必构建monster SQL语句的情况下仍然获得其余字段的想法?同时,我将尝试删除
IMEX
参数,看看会发生什么。@kbsou,删除IMEX不起作用,因为我需要获取日期行上方的文本行的内容(第三行有实际的字段名),如果让ADO猜测数据类型,则日期行上方的行将返回NULL。我可能需要执行两个单独的查询,一个用于所有内容,另一个用于
cdate()
,然后在代码中合并结果。