2013-07-03 114 views
1

我想將一些數據從SQL Server拉到Microsoft Excel 2007.我有連接設置和一切似乎工作正常,除了時間戳。我只能得到日期,而不是相應的小時,分​​鍾或秒。我可以使用Excel ODBC查詢工具從SQL數據庫中提取數據,並在那裏列出小時和分鐘。我嘗試了各種不同的CAST()選項。他們都沒有解決我的問題。我正在運行Windows XP。我不知道服務器上運行的Microsoft SQL版本是什麼。我的代碼如下所示。不完整的時間戳使用ADODB與VBA的Excel

Sub Populate_Sheet(theSheet As Worksheet) 

    'Declare variables' 
     Dim objMyConn As ADODB.Connection 
     Dim objMyCmd As ADODB.Command 
     Dim objMyRecordset As ADODB.Recordset 
     Set objMyConn = New ADODB.Connection 
     Set objMyCmd = New ADODB.Command 
     Set objMyRecordset = New ADODB.Recordset 

     Dim executeThisSQLStatement As String 
     'Dim target As Worksheet 
     'Set target = theSheet 

     executeThisSQLStatement = "SELECT CAST(DateHour_CPT AS TIMESTAMP) FROM EnergyData_v" 

    'Open Connection' 
     objMyConn.ConnectionString = "driver={SQLServer};Data Source=DataMart;User ID=acctname.value;Password=mypass.value;" 

     objMyConn.Open 

    'Set and Excecute SQL Command' 
     Set objMyCmd.ActiveConnection = objMyConn 
     objMyCmd.CommandText = executeThisSQLStatement 
     objMyCmd.CommandType = adCmdText 

    'Open Recordset' 
     Set objMyRecordset.Source = objMyCmd 
     objMyRecordset.Open 

    'Copy Data to Excel' 
     theSheet.Range("A6").CopyFromRecordset objMyRecordset 

End Sub 
+0

你的意思是轉換爲DATETIME而不是TIMESTAMP? SQL Server在命名TIMESTAMP類型時犯了一個很大的錯誤 - 它聽起來就像ANSI SQL類型,它代表着與日期和時間有關的事情,它與任何一個都沒有關係。試着在查詢窗口中忽略所有的VBA和Excel干擾:'SELECT CAST(GETDATE()as TIMESTAMP);' –

+1

另外,你不應該說「我不知道我正在運行哪個版本」 - 使用'SELECT @@ VERSION;'這樣做很簡單。 –

+0

它可能是Excel格式化的問題。嘗試將日期列單元格的格式更改爲「yyyy-mm-dd hh:mm:ss」 – Vasanth

回答

1

尼克,我想我已經找到了解決辦法爲你:)
讓我演示使用我的樣本數據。
默認情況下,Excel沒有DateTime單元格格式。這意味着它不能在一個單元內存儲日期和時間。在數據展示方面,似乎Excel試圖使用最可識別的格式 - 這是日期。它仍然存儲時間,但將格式格式化爲日期格式,丟失/ 時間爲

看看下面的截圖:
sample
正如你可以看到在單元格中顯示的數據看起來就像一個正常的日期。但是,如果你看看公式欄 - 時間存在,但沒有顯示。

在你的代碼的末尾,我加了Debug.Print線:
Debug.print Range("B6").Value & vbCrlf & Range("B6").Value2
我有
25/06/2013 16:00:27
41450.6669791667
因此結果,我都符合該你是在看在Excel中的單元格不完全是它所指的


ne xt的一步是編寫一個函數來遍歷單元格,並改變格式和被查看的內容。
爲了在一個單元中同時實現 datetime,我決定將該單元格格式化爲 Text

Private Sub FormatDateAndTime(ByRef sheet As Worksheet, start As Long, column As String) 
    Dim i As Long, rng As Range 
    For i = start To sheet.Range(column & Rows.Count).End(xlUp).Row 
     Set rng = sheet.Range(column & i) 
     Dim str As String 
     str = Split(rng.Value, " ")(0) & " " & Split(rng.Value, " ")(1) 
     rng.NumberFormat = "@" 
     rng = str 
     Set rng = Nothing 
    Next i 
End Sub 

FormatDateAndTime()函數有3個參數:
- 活動工作表
- 起始行
- 與日期列
調用該函數在代碼中End Sub前添加此行

// Copy Data to Excel 
     theSheet.Range("A6").CopyFromRecordset objMyRecordset 

    // this is the line you want to add 
    FormatDateAndTime sheet:=theSheet, start:=6, column:="A" 

End Sub 

說明:我有我的樣本發送其他參數demontrate結果,但上面的會在你的情況下工作

好,運行代碼後,你應該得到的結果如下:
注:我在我的示例中僅運行了此列,以顯示區別B

results1
注:我跑這一個兩列BC results2


您的完整的解決方案:

Sub Populate_Sheet(theSheet As Worksheet) 

'Declare variables' 
    Dim objMyConn As ADODB.Connection 
    Dim objMyCmd As ADODB.Command 
    Dim objMyRecordset As ADODB.Recordset 
    Set objMyConn = New ADODB.Connection 
    Set objMyCmd = New ADODB.Command 
    Set objMyRecordset = New ADODB.Recordset 

    Dim executeThisSQLStatement As String 
    'Dim target As Worksheet 
    'Set target = theSheet 

    executeThisSQLStatement = "SELECT CAST(DateHour_CPT AS TIMESTAMP) FROM EnergyData_v" 

'Open Connection' 
    objMyConn.ConnectionString = "driver={SQLServer};Data Source=DataMart;User ID=acctname.value;Password=mypass.value;" 

    objMyConn.Open 

'Set and Excecute SQL Command' 
    Set objMyCmd.ActiveConnection = objMyConn 
    objMyCmd.CommandText = executeThisSQLStatement 
    objMyCmd.CommandType = adCmdText 

'Open Recordset' 
    Set objMyRecordset.Source = objMyCmd 
    objMyRecordset.Open 

'Copy Data to Excel' 
    Range("A6").CopyFromRecordset objMyRecordset 

    FormatDateAndTime sheet:=theSheet, start:=6, column:="A" 
End Sub 

Private Sub FormatDateAndTime(ByRef sheet As Worksheet, start As Long, column As String) 
    Dim i As Long, rng As Range 
    For i = start To sheet.Range(column & Rows.Count).End(xlUp).Row 
     Set rng = sheet.Range(column & i) 
     Dim str As String 
     str = Split(rng.Value, " ")(0) & " " & Split(rng.Value, " ")(1) 
     rng.NumberFormat = "@" 
     rng = str 
     Set rng = Nothing 
    Next i 
End Sub 


如果這個答案對你有幫助,請接受和/或upvote it! :)謝謝,祝你好運

+1

我複製了你的代碼,它在第一次嘗試中完美運行。非常感謝。這真的幫了我很多!我無法贊成,因爲我沒有足夠的聲譽,但這正是我所需要的。 – NickVise

+0

很高興我能幫上忙。 – 2013-07-03 12:26:55