【发布时间】:2016-02-07 16:15:33
【问题描述】:
我的 VBA 代码通过 ADODB.Connection 和 "SAS.LocalProvider.1" 将 SAS 表传输到 Excel 表。两个 SAS 列是YYYY-MM-DD 格式的日期,如2015-09-01 和2015-09-30。
我还使用format 来处理我的VBA 代码中的那些列,例如Sheet2.Range(Range("C2"), Range("C2").End(xlDown)).NumberFormat = "YYYY-MM-DD"。然后应该将整个列转换为正确的日期格式。
但是,最后,我在 Excel 工作表中获得日期值,例如 1955-08-31 和 1955-09-29,而不是 2015-09-01 和 2015-09-30。
我检查了 SAS 表,两列均为 numeric,格式为 date 为 YYDDMM10.。
我在 VBA 代码中写为 YYMMDD 和 YY-MM-DD,因为它以 SAS 格式显示,但它没有帮助。它仍然给出了与 1955 年相同的年份(或仅 55 年)。
在代码中,您可以看到我尝试在“table-transer 之前”更改格式。但我也尝试过“在表转移之后”,但我得到了完全相同的结果。
Public Sub SASTransfer()
Dim rTarget1 As Range: Set rTarget1 = Sheet2.Range("A2")
Dim sSasTable1 As String: sSasTable1 = SASOutputPath & "\" & SASOutput1 & ".sas7bdat"
Sheet2.Range(Range("C2"), Range("C2").End(xlDown)).NumberFormat = "YYYY-MM-DD" ' This should change the format of the whole C-column
Sheet2.Range(Range("D2"), Range("D2").End(xlDown)).NumberFormat = "YYYY-MM-DD"
Dim con1 As New ADODB.Connection
Dim rs1 As New ADODB.Recordset
con1.Provider = "SAS.LocalProvider.1"
con1.Open
rs1.Open sSasTable1, con1, adOpenForwardOnly, adLockReadOnly, ADODB.adCmdTableDirect
rTarget1.CopyFromRecordset rs1
rs1.Close
Set rs1 = Nothing
con1.Close
Set con1 = Nothing
End Sub
【问题讨论】:
-
仅供参考,您看到这一点的原因是 SAS 将日期存储为 1960 年 1 月 1 日到相关日期之间的天数,而 Excel 将它们存储为 31/12/ 之后的天数1899.
-
@Rory,不,不是。这是因为 excel 需要一种日期格式,而 sas 提供另一种。
-
@NickDewitt 所以,结果日期的天数差异完全可以用它来解释,这完全是巧合吗?多么奇怪。
-
@rory 哦,是的,公平点,抱歉在我下班时匆忙发表评论 - 1960 年基准日期和 1900 年基准日期在技术上是不同的格式 ;-)