Accessのテーブルからtsvファイルを出力しようとしたところ、意外と簡単に出す方法がありませんでした。
備忘録のために残しておこうと思います。
※カンマ区切りのcsv出力はTransferTextでできるのですが、不便なので。
実際に作ったファイルはこちらから無料でダウンロードできます。
RecordSetからcsv、tsvファイルを出力のコード
やる処理はざっくり説明すると以下です。
①ヘッダーをRecordSetから区切り文字付きで取り出す
②データをRecordSetから区切り文字付きで取り出す
③ファイルにヘッダーとデータを出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
'============================================== '目的 :Accessファイルが配置されている場所にCsv or Tsvファイル出力する '引数 :Delimiter 区切り文字:vbTab(タブ) ,(カンマ) ' :Rs 出力するレコードセット '戻り値 : '============================================== Private Sub ExportRecordSet(Delimiter As String, Rs As DAO.Recordset) Dim strPath As String '出力先のパス Dim strTblName As String 'テーブル名 Dim Header As String 'テーブルのヘッダー行 Dim DataRecords As String 'テーブルのデータ行 Dim Extension As String 'ファイル拡張子 Dim RsCol As Long 'カラムカウント用 Dim loopcount As Long '出力パスを指定 strPath = CurrentProject.Path & "\" " strTblName = "テーブル" '拡張子をセット If Delimiter = "," Then Extension = ".csv" ElseIf Delimiter = vbTab Then Extension = ".tsv" End If '---------------ヘッダー行を格納する処理--------------- '列数分ループ For RsCol = 0 To Rs.Fields.Count - 1 Header = Header & Rs.Fields(RsCol).Name & Delimiter Next RsCol '行の最後に着いたカンマorタブを削除 Header = Left(Header, Len(Header) - 1) 'Rs.RecordCount取得用処理 Rs.MoveLast Rs.MoveFirst '---------------データ行を格納する処理--------------- ' 先頭レコードからEOFまで繰り返す Do Until Rs.EOF loopcount = loopcount + 1 '列数分ループ For RsCol = 0 To Rs.Fields.Count - 1 DataRecords = DataRecords & Rs.Fields(RsCol).Value & Delimiter Next RsCol '行の最後に着いたカンマorタブを削除 DataRecords = Left(DataRecords, Len(DataRecords) - 1) '最終行の時は改行しない、それ以外は改行する If Rs.RecordCount <> loopcount Then 'データ行を改行 DataRecords = DataRecords & Chr(13) & Chr(10) End If '次のレコードへ Rs.MoveNext Loop '---------------ファイルに出力--------------- Open strPath & strTblName & Extension For Output As #1 Print #1, Header & Chr(13) & Chr(10) & DataRecords Close #1 MsgBox "出力完了しました。" End Sub |
因みにRecordSetはAccessでもエクセルでも使うことはできます。
ただ、SQLの知識が少し必要なので、参考書やwebサイトで勉強した方が良いと思います。
VBA C# オススメ参考書プログラミングの参考書でオススメの紹介をしていきます。
それぞれ私が使っている言語のみです。
VBAのオススメ参考書をExc...
2020/06/13 追記
ダブルクォーテーションで区切るバージョンと区切らないバージョンの2つに変更しました。
購入者の方から、ダブルクォーテーションで区切って欲しいと声があったためです。
ダウンロード時には2種類のアクセスがダウンロードされます。
RecordSetからcsv、tsvの出力結果
実際に作った処理を動かしてみます。
テーブルの中身
出力元のテーブルは以下のようになっています。
supplier_cd | addr | post_num | tel | fax |
301101 | 明治屋 | 埼玉県川越市 | NULL | 03-****-**** |
301102 | パスコ | 東京都江戸川区 | NULL | 4-****-**** |
301103 | ライヘルフ | 大阪府東大阪市 | NULL | 5-****-**** |
301104 | リプトン紅茶 | 東京都港区 | NULL | 6-****-**** |
301105 | 上島珈琲 | 横浜市中区 | NULL | 7-****-**** |
301106 | 流通パートナーズ | NULL | NULL | 8-****-**** |
301107 | 全食 | 千葉市美浜区 | NULL | 9-****-**** |
301108 | 大地 | 新潟県新潟市 | NULL | 10-****-**** |
301109 | 明治乳業 | 東京都江東区 | NULL | 11-****-**** |
301200 | キッコーマン | 千葉県野田市 | NULL | NULL |
301201 | 片岡物産 | 川崎市川崎区 | NULL | NULL |
301202 | ロイヤル食品 | 福岡市那珂区 | NULL | NULL |
301203 | 東京製菓 | 東京都大田区 | NULL | NULL |
301204 | 武州フーズ | 埼玉県入間郡 | NULL | NULL |
301205 | コカコーラボトリング | NULL | NULL | NULL |
出力結果
キレイに出力することができました。
※RecordSetにテーブルのデータを取得する箇所は別のところで紹介します。
RecordSetにテーブルのデータを取得するC#やVB.netを経験してからVBAを扱うと、DataTableってVBAにはないの?と思ってしまいますよね。
DataTabl...
おすすめのプログラミングスクール めざせ就職・年収アップ!
プログラミングを独学でされている人は意外と多いです。
ただ、プログラミングの独学は簡単にはいきません。
自分だけの力...
プログラミング初心者の独学方法 文系卒の経験談
私はIT系の会社に勤めて4年目ですが、最初の1年は開発をさせてもらえませんでした。
文系卒でプログラミング経験はなかったの...
プログラミングの独学とはエラーとの闘い
プログラミングを勉強し始めた初心者の方はつまづくことが多いと思います。
私も最初はエラーが出るたびにいちいちビビッて、意味...