1

SQL Server から Microsoft Excel 2007 にデータを取り込もうとしています。接続がセットアップされており、タイムスタンプ以外はすべて正常に動作しているようです。対応する時間、分、または秒ではなく、日付のみを取得できます。Excel ODBC クエリ ツールを使用して SQL データベースからデータを取得でき、そこに時間と分が表示されます。さまざまな CAST() オプションを試しました。それらのどれも私の問題を解決していません。Windows XP を実行しています。サーバーで実行されている Microsoft SQL のバージョンがわかりません。私のコードを以下に示します。

 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
4

1 に答える 1

2

ニック、私はあなたのための解決策を見つけたと思います:)
私のサンプルデータを使って実演させてください。
デフォルトでは、Excel にはDateTimeセル形式がありません。これは、1 つのセル内に日付と時刻を格納できないことを意味します。データの表示に関しては、Excel は最も認識しやすい形式 (日付) のみを使用しようとしているようです。時間は引き続き保存されますが、セルが日付形式にフォーマットされ、時間が失われる/削除されます。

以下のスクリーンショットを見てください:
サンプル
ご覧のとおり、セルに表示されたデータは通常の日付のように見えます。しかし、数式バーを見ると、時間は存在しますが、表示されていません。

あなたのコードの最後に、次のDebug.Print行を追加しました:
Debug.print Range("B6").Value & vbCrlf & Range("B6").Value2
the results I have
25/06/2013 16:00:27
41450.6669791667
gotExcelのセルに表示されているものは、参照されているものとは正確には異なります


次のステップは、セルを反復処理して書式設定と表示内容を変更する関数を作成することでした。両方を
達成するために、1 つのセルで、セルを としてフォーマットすることにしました。datetimeText

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

注: 結果を示すためにサンプルで他のパラメーターを送信しましたが、上記はあなたの場合に機能します

わかりました、コードを実行した後、次のような結果が得られるはずです
注: 違いを示すために、サンプルの列に対してのみこれを実行しました。B

結果1
注:Bこれを列と列の両方で実行しましたC 結果2


あなたの完全なソリューション:

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


この回答が役に立った場合は、承認および/または賛成票を投じてください! :) ありがとう、そして幸運を祈ります

于 2013-07-03T08:17:02.503 に答える