データベース

データベースに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし)
SQLServerのクエリのCSVデータを、AccessVBAで出力したい
投稿日時: 18/08/22 15:09:29
投稿者: yuki6982

皆様、お世話になります。
 
OSはWin7、SQLServer2008-R2とAccess2003をADPで繋いでデータベースを作成しています。
AccessVBAを使用してSQLServerのクエリデータをCSVをして出力したいのですが
上手く行きません・・。
ちなみに、EXCEL2003に書き出すことは出来ています。
 
※変数「strSQL」にはCSVとして出力したいクエリのSQL文を代入します。
    Dim strSQL As String
            strSQL = "××"
        Dim objEXCEL As Object
          Set objEXCEL = CreateObject("Excel.Application")
          objEXCEL.Workbooks.Add
        Dim xlSheet As Excel.Worksheet
          Set xlSheet = objEXCEL.Worksheets(1)
        Dim rs As New ADODB.Recordset
          rs.Open strSQL, CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
          xlSheet.Range("A2").CopyFromRecordset rs
          rs.Close
          Set rs = Nothing
 
このような感じで、EXCELには上手くペーストされるですが
CSVとして出力する方法が、色々調べたのですがわかりません・・・
ADOを使うように思うのですが、勉強不足のため良く理解出来ておらず、
何かヒントか分かり易い解説のあるホームページなど教えて頂けますと嬉しいです。
 
何卒宜しくお願い致します。

回答
投稿日時: 18/08/22 16:39:11
投稿者: sk

引用:
OSはWin7、SQLServer2008-R2とAccess2003をADPで繋いでデータベースを作成しています。
AccessVBAを使用してSQLServerのクエリデータをCSVをして出力したいのですが
上手く行きません・・。

出力する CSV ファイルの文字セット(Shift_JIS, UTF8 など)や、
テキスト区切り記号(ダブルクォーテーションの有無など)に関して
特に指定はないのでしょうか。
 
引用:
ちなみに、EXCEL2003に書き出すことは出来ています。

Excel の CSV 出力仕様のままで問題がないのであれば、
Worksheet オブジェクトの SaveAs メソッドによって
ファイルを新規保存する際に、引数 FileFormat に
xlCSV などの定数(と同じ値)を渡すようになさればよいでしょう。
 
引用:
ADOを使うように思うのですが、勉強不足のため良く理解出来ておらず、
何かヒントか分かり易い解説のあるホームページなど教えて頂けますと嬉しいです。

類似記事:
http://www.moug.net/faq/viewtopic.php?t=77189
 
T'sWare より:
http://tsware.jp/tips/tips_170.htm
 
以上のように GetString メソッドによって取得した文字列を
新規作成したテキストファイルに書き出す、という方法もあるでしょう。

投稿日時: 18/09/06 12:04:24
投稿者: yuki6982

長らく当該案件に手が付けられず、返信が遅れてしまい申し訳ございません。
 
CSVの出力ですが、出来ればEXCELを介さない方法が希望です。
実は上記に書いたコードは、EXCEL2003でないと上手く動かないので
バージョンが上のEXCELを使用しているPCではEXCELを介した動きが使えません。
 
ですが、AccessVBAから直接CSVファイルを作成する方法がよくわからず
質問をさせていただきました。
 
出力する CSV ファイルの文字セットは特に指定無し(指示必要であればShift_JIS)、
テキスト区切り記号は特に不要です。
どこかにインポートして使用する訳ではなく、
どのバージョンのEXCELでも開けるようにしたいという目的で作成しようとしています。
ですのでカンマ区切りに出来さえすればOKです。
 
色々とアドバイス頂きましてありがとうございます、
宜しくお願い致します。
 

回答
投稿日時: 18/09/06 14:22:49
投稿者: sk

引用:
CSVの出力ですが、出来ればEXCELを介さない方法が希望です。
実は上記に書いたコードは、EXCEL2003でないと上手く動かないので
バージョンが上のEXCELを使用しているPCではEXCELを介した動きが使えません。

Excel のバージョンに依存しているようなコードが
記述されている箇所は特に認められませんので、
恐らく別の要因によるのではないかと思いますが。
 
引用:
OSはWin7、SQLServer2008-R2とAccess2003を
ADPで繋いでデータベースを作成しています。

引用:
出力する CSV ファイルの文字セットは特に指定無し(指示必要であればShift_JIS)、
テキスト区切り記号は特に不要です。

(標準モジュール)
-------------------------------------------------------------
Sub subExportRecordset()
On Error GoTo Err_subExportRecordset
 
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim fld As ADODB.Field
    Dim strm As ADODB.Stream
     
    Dim strSQL As String
    Dim strHeader As String
    Dim strFileName As String
     
    Set cn = CurrentProject.Connection
     
    Set rs = New ADODB.Recordset
    With rs
        Set .ActiveConnection = cn
        'SQL 文は適宜修正すること
        strSQL = "SELECT * FROM [テーブル名]"
        .Source = strSQL
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockReadOnly
        .Open
         
        '列見出しとして出力するテキストの生成
        For Each fld In .Fields
            strHeader = strHeader & _
                         "," & fld.Name & ""
        Next
        strHeader = Mid(strHeader, 2)
    End With
     
    Set strm = New ADODB.Stream
    With strm
        .Charset = "Shift_JIS"
        .LineSeparator = adCRLF
        .Open
        '列見出し行の書き込み
        .WriteText strHeader, adWriteLine
        'データ行の書き込み
        .WriteText rs.GetString(adClipString, -1, ",", vbCrLf), adWriteChar
        'ファイルパスの生成
        strFileName = CurrentProject.Path & "\" & _
                      "test" & Format(Now(), "yyyymmddhhnnss") & ".csv"
        'ファイルとして保存
        .SaveToFile strFileName, adSaveCreateOverWrite
    End With
     
    'イミディエイトウィンドウに
    '出力先ファイルパスを出力
    Debug.Print "出力先ファイルパス: " & strFileName
     
    '出力した CSV ファイルを notepad で開く
    Shell "notepad.exe """ & strFileName & """"
     
Exit_subExportRecordset:
On Error Resume Next
     
    strm.Close
    Set strm = Nothing
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
     
    Exit Sub
     
Err_subExportRecordset:
     
    MsgBox Err.Number & ": " & Err.Description, _
           vbCritical, _
           "実行時エラー(subExportRecordset)"
     
    Resume Exit_subExportRecordset
End Sub
-------------------------------------------------------------
 
ADO で実現させるならば、以上のようなコードを
実行なさればよろしいでしょう。

トピックに返信