我的VBA代码通过ADODB.Connection
和"SAS.LocalProvider.1"
将SAS表格传输到Excel表格。两个SAS列的日期格式为YYYY-MM-DD
,如2015-09-01
和2015-09-30
。
我也在format
中使用Sheet2.Range(Range("C2"), Range("C2").End(xlDown)).NumberFormat = "YYYY-MM-DD"
作为我的VBA代码中的列1955-08-31
。然后它应该将整个列转换为正确的日期格式。
但是,最后,我在Excel表格中获取的日期值如1955-09-29
和2015-09-01
,而不是2015-09-30
和numeric
。
我检查了SAS表,两列都是date
,格式为YYDDMM10.
为YYMMDD
。
我在VBA代码中写了YY-MM-DD
和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格式显示,但它没有帮助。它仍然与1955年(或仅55岁)同年。
在代码中,您可以看到我尝试在table-transer"之前更改格式"。但是我也在桌子转移之后尝试了#34;同样,但我得到了完全相同的结果。
/**
* Load page into url
*
* @param url The url to load
*/
function loadPage(url) {
var xmlhttp = new XMLHttpRequest();
// Callback function when XMLHttpRequest is ready
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState === 4){
if (xmlhttp.status === 200) {
document.getElementById('container').innerHTML = xmlhttp.responseText;
}
}
};
xmlhttp.open("GET", url , true);
xmlhttp.send();
}
答案 0 :(得分:3)
在Excel中设置显示格式不会改变识别单元格中值的方式。
您需要在adodb连接上设置日期格式,而不是在工作表中的单元格上设置日期格式。
请参阅http://support.sas.com/documentation/tools/oledb/ddh001.htm
您需要向记录集添加一个属性,告诉它如何在导入日期时格式化日期(将datecolumnname替换为日期列的名称,您可以通过用逗号分隔列表来定义多个列。< / p>
rst.Properties("SAS Formats") = "datecolumnname=ddmmyy8."
这将以dd / mm / yyyy格式导入日期。
您需要设置传入数据的格式以匹配您的区域设置,然后Excel将正确解释日期并按照您的单元格格式显示它。
编辑1
SAS提供以下示例来提取格式化数据,他们建议在执行查询之前设置记录集的activeconnection:
' obConnection is an open Connection object.
Dim obRecordset As New ADODB.Recordset
obRecordset.ActiveConnection = obConnection
obRecordset.Properties("SAS Formats") = "saledate=mmddyy8.,+price=dollar8.2."
' The second parameter on the Open method must remain empty.
obRecordset.Open "sales", , adOpenStatic, adLockReadOnly, adCmdTableDirect
答案 1 :(得分:3)
SAS使用1/1/1960作为第0天的参考日期。
Excel使用1/0/1900(即12/31/1899)作为第0天的参考日期。
1960年1月1日至1899年12月31日之间的天数是21,916。
由于您要从SAS转到Excel,请在SAS日期中添加21916。
data excel_export;
set have;
Excel_Date = SAS_Date + 21916;
format Excel_Date mmddyy10.;
run;
答案 2 :(得分:2)
来自About SAS Date, Time, and Datetime Values:
SAS日期值是一个值,表示1960年1月1日到指定日期之间的天数。 SAS可以在A.D. 1582到A.D.19,900之间的日期进行计算。 1960年1月1日之前的日期是负数;日期之后是正数。
如果找不到转换因子,您可能希望将实际的基于数字的日期转换为本地计算机的MDY与DMY区域格式中的字符串类似日期,并允许Excel处理它们在即时。不是最好的解决方案,但数字日期总是超过60年而没有转换因子,因为Excel日期在1899年12月31日之后的每一天都表示为1。