Excel-VBA将错误的日期值从SAS传输到Excel工作表

时间:2015-11-06 13:36:55

标签: excel vba excel-vba date sas

我的VBA代码通过ADODB.Connection"SAS.LocalProvider.1"将SAS表格传输到Excel表格。两个SAS列的日期格式为YYYY-MM-DD,如2015-09-012015-09-30

我也在format中使用Sheet2.Range(Range("C2"), Range("C2").End(xlDown)).NumberFormat = "YYYY-MM-DD"作为我的VBA代码中的列1955-08-31。然后它应该将整个列转换为正确的日期格式。

但是,最后,我在Excel表格中获取的日期值如1955-09-292015-09-01,而不是2015-09-30numeric

我检查了SAS表,两列都是date,格式为YYDDMM10.YYMMDD

我在VBA代码中写了YY-MM-DDPublic 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();
}

3 个答案:

答案 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。