Excel中日期值的ADO查询返回工作表中格式的字符串
我正在尝试使用ADO查询从Excel工作表中提取数据。但是,返回日期值的方式与工作表上的格式相同,而不是实际的日期值。例如,值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
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()
,然后在代码中合并结果。