我目前正在使用下面的脚本从另一个Excel工作簿中检索数据。我以适当的格式检索正确的日期。当我查询的工作簿“打开”检索到的数据“DATE”返回NUMBER“49802”(类似的东西)但是一旦我关闭工作簿我查询返回的“DATE”就变成了正常问题格式。
Sub Pull_Data_from_Excel_with_ADODB()
Dim cnStr As String
Dim rs As ADODB.Recordset
Dim query As String
Dim var1
Dim var2
var1 = Now() - 1
var2 = Now()
Dim fileName As String
fileName = "C:\Signin-Database\DATABASE\Signin-Database.xlsm"
cnStr = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & fileName & ";" & _
"Extended Properties=Excel 12.0"
query = "SELECT * FROM [Sheet1$D:H] WHERE [Time_in] < '" & var2 & "' AND [Time_in] > '" & var1 & "' AND [Time_out] is null"
Set rs = New ADODB.Recordset
rs.Open query, cnStr, adOpenUnspecified, adLockUnspecified
Cells.Clear
Range("A2").CopyFromRecordset rs
Dim Cell As Range, i As Long
With Range("A1").CurrentRegion
For i = 0 To rs.Fields.Count - 1
.Cells(1, i + 1).Value = rs.Fields(i).Name
Next i
.EntireColumn.AutoFit
End With
答案 0 :(得分:0)
尝试关闭您的记录集,看看是否&#34;制作&#34;日期变为应有的日期。
自动调整命令后
.EntireColumn.AutoFit
rs.Close
Set rs = Nothing
如果这不起作用,请尝试格式化具有日期的列。
ws.Range("A:A").NumberFormat = "yyyy-mm-dd"
ws.Range("E:E").NumberFormat = "yyyy-mm-dd"
如果您有一个标题行,并且您不希望格式化,则可以在您的范围内定义开始行和结束行
Dim lRow as Long
lRow = ws.UsedRange.Rows.count
ws.Range("A2:A" & lRow).NumberFormat = "yyyy-mm-dd"
ws.Range("E2:E" & lRow).NumberFormat = "yyyy-mm-dd"
答案 1 :(得分:0)
Excel将其日期值存储为数字 - 整数部分是从1900年1月开始计算的天数,小数部分是小时数。例如,49802.25将于早上6点在5/7/2036。因此,问题可能是由于.CopyFromRecordSet方法可能损坏的单元格格式。我在我的一些工作簿中也遇到过这个问题,如果它从Sql中提取日期字段,它将影响其他工作表上的单元格格式。
Excel table loses number formats when data is copied from ADODB recordset
https://dutchgemini.wordpress.com/2011/04/21/two-serious-flaws-with-excels-copyfromrecordset-method/ (这个缺陷#2)
对我有用的一个解决方法是让您的宏格式化受影响的单元格回到正确的格式,这可以使用.NumberFormat方法完成。