• ベストアンサー

Access 1レコードずつcsvで出力したい

使用しているのはAccess2000です。 クエリのレコードを、1レコードずつcsvにエクスポートしたいのですが、マクロなどで自動的におこなうことはできないでしょうか? 例. クエリ名:test レコード数:100件 フィールド名:ファイル名 testクエリの1から100までのレコードを、1件ずつcsvへエクスポートする。保存する際は「ファイル名」を参照して、csvファイル名とする。100件分のこれらの作業をすべてマクロ等で自動化したい。 VBAの知識はほとんどありませんが、VBAによる回答でも構いません。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • arare2005
  • ベストアンサー率31% (63/199)
回答No.3

回答を間違っていましたm(_ _)m テーブル(DB)とテキスト(CSV)が、ごちゃまぜでした。 入力=テーブルなので LINE INPUT は間違いでした。 色々やり方はあるのですが、DBのアクセスする所が、初めてだと判り辛いと思いまして。。。(^^; 簡単に作ってテストしてみましたので、フォームのコマンドボタンのイベントに貼り付けて下さい。 (1)フォーム・コマンドボタン→イベント・クリック時「イベントプロシージャ」→下記、処理を貼り付け (2)テーブル名、項目名などは、変更して下さい (3)変更の必要な箇所は、※をコメントに入れています(念の為「※」で検索して下さい) (4)VBエディタ:ツール→参照設定→「Microsoft DAO 3.6 Object Library」  にチェックが入っている事をご確認下さい (DBをDAOで使用:標準でチェック済みとは思います) (5)不明な箇所が有りましたら、連絡用にこの投稿を閉じないで、再度コメントを入れて下さいネ  見ていれば、すぐに返事をいたしますので。。。(^^)  メールも届くので多分気が付くと思います (6)とりあえずデータは、mdbがあるフォルダの「\DAT」に作成する様にしています Private Sub コマンド1_Click() --- ここから --- Dim wCNN As Database 'データベース(テーブル) Dim wREC As Recordset 'レコード Dim wSQL As String 'SQL文等のワーク Dim I_CNT As Integer 'I/P COUNT Dim O_FNM As String 'O/P FILE NAME 'メッセージを表示 wSQL = "仕入先→CSVファイル" '※テーブル名 wSQL = wSQL & vbCrLf & vbCrLf & "作成しますか?" If MsgBox(wSQL, vbYesNo + vbQuestion) = vbNo Then Exit Sub 'いいえ-->終了 End If 'CSV定義(保存先・ファイル名の設定) wSQL = Application.CurrentProject.Path & "\DAT\" On Error Resume Next '念の為エラートラップ(削除時) If Dir(wSQL, vbDirectory) <> "" Then Call Kill(wSQL & "*.csv") '前回分は全て削除-->ごみ箱へ Else Call MkDir(wSQL) 'フォルダ作成 End If O_FNM = wSQL & "FILE_???.csv" 'CSV出力先、???=あとで置換 ※ファイル名 On Error GoTo sCSV_OP_ERR '念の為エラートラップ '接続 Set wCNN = CurrentDb 'テーブルを参照 wSQL = "SELECT [仕入先コード], [仕入先名]" '※[項目]数を増やす時 wSQL = wSQL & " FROM [仕入先]" '※[テーブル名] Set wREC = wCNN.OpenRecordset(wSQL, dbOpenForwardOnly) '(メイン処理)DBよりCSVを作成する I_CNT = 0 Do Until wREC.EOF '※条件があればここへ or XXX=??? I_CNT = I_CNT + 1 'FILE NAME 'wSQL = Replace(O_FNM, "???", Format(wREC(0), "000")) '編集あり wSQL = Replace(O_FNM, "???", wREC(0)) '編集なし 'CSV O/P Open wSQL For Output As #1 Write #1, wREC(0), wREC(1) '※[項目]数を増やす時 Close #1 wREC.MoveNext '次レコードへ Loop '終了 wREC.Close: Set wREC = Nothing wCNN.Close: Set wCNN = Nothing Call MsgBox(Format(I_CNT, "#,##0") & "件作成しました") Exit Sub sCSV_OP_ERR: Call MsgBox("(エラー発生)sCSV_OP" & vbCrLf & vbCrLf & wSQL, vbExclamation) Call MsgBox(Err.Number & " " & Err.Description) --- ここまで --- End Sub

ikdx
質問者

お礼

areare2005さん すごい!思い通りにできました! 本当にありがとうございます! コードの中に親切なコメントを書いていただけたので カスタマイズも自分でできました。 ---------------------------------------- ひとつつまづいたところがあったので、 ここに記しておきたいと思います。 >(4)VBエディタ:ツール→参照設定→「Microsoft DAO 3.6 Object Library」 >にチェックが入っている事をご確認下さい このチェックを入れて実行したところ、 エラーが出てしまいました。 「13型が一致しません」とのこと。 参照設定の中に 「Microsoft ActiveX Data Object 2.1 Library」 というのにもチェックが入っており、 それの優先順位を下げたところ、 問題なく実行できるようになりました。 ---------------------------------------- areare2005さん 本当にありがとうございました!

その他の回答 (2)

  • arare2005
  • ベストアンサー率31% (63/199)
回答No.2

ちょっと良く判らないのですが、1件1ファイルでファイル名に連番をはりCSV保存でしょうか? (VBA.例) 入力=LINE INPUT 出力=WRITE、PRINT 繰返=Do...Loop あとはヘルプを参考にしながらモジュールを組んでみましょう。 詳細が判らないので、マクロで対応できる処理かは、お答えしかねます m(_ _)m

ikdx
質問者

補足

areare2005さん おそらくareare2005さんのおっしゃってることで だいたい間違っていないと思うのですが, 説明不足でしたので補足させていただきます。 以下のようなテーブルがあるとします。 --------------- No 名前 1 北海道 2 青森 3 秋田 --------------- この3つのレコードのうち,ひとつだけ取り出して, csvファイルで保存したいと思います。 --------------- No 名前 1 北海道 --------------- csvファイルで保存する際に, 「No」にふられている番号を ファイルネームにしたいと思います。 ------------------------------ 1.csv(中身は「1,北海道」) ------------------------------ これを3回繰り返し,レコード分すべてを csvファイルにしたいと思います。 ------------------------------ 1.csv(中身は「1,北海道」) 2.csv(中身は「2,青森」) 3.csv(中身は「3,秋田」) ------------------------------ これら一連の作業を, マクロもしくはVBAで自動化できる方法を 探していました。 VBAについてはほとんど知識がないのですが, とりあえずareare2005さんの例を参考にして, 試してみたいと思います。 ありがとうございました。

noname#82027
noname#82027
回答No.1

ikdxさんこんにちは ACCESS使用経験ありなので回答出来ると思ったら マクロで自動になのですね。 もしかするとご存知かもしれませんが ACCESS CLUBというサイトがあります。 そこで検索、質問してみたら如何でしょうか? ACCESSで困ったときはほとんどこのサイトで解決致しましたので・・・

参考URL:
http://www.accessclub.jp/
ikdx
質問者

お礼

ednanさん,ありがとうございます。 そのサイトでも調べてみたのですが, どうもうまく解決できませんでした。 ただ,とても参考になりました。 今度Accessでわからないことがあったら そちらで質問してみようと思います。

関連するQ&A