データベース

データベースに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし)
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 で実現させるならば、以上のようなコードを
実行なさればよろしいでしょう。

投稿日時: 18/11/07 16:08:17
投稿者: yuki6982

sk様
 
返答が遅くなり、申し訳ございません。
急ぎの別件対応で長らく手を付ける事が出来ていませんでした。
早急にコメント頂いていたのに、失礼な事をしてしまい申し訳ございませんでした。
また、コードまで載せて頂いて本当にありがとうございます。
恥ずかしながら、コードの細かいところで「??」があるままで・・
ですが、おかげさまで、上手くCSV出力することが出来ました。
ついでに、EXCELでCSVを開くコードも出来ました!
ADOについては、以前からもう少し勉強しないと・・とは思っていたのですが、
コレを機に勉強させて頂こうと思いました。
少しづつですが、解読して行く形から・・。
 
また困った時には頼らせて頂くかと思います、本当にいつもありがとうございます。
 
どうもありがとうございました!!