- 締切済み
ACCESS VBAで、CSVにデータを吐き出したいのです
ACCESS VBAで、CSVにデータを吐き出したいのですが、WORKのテーブルを作るのが面倒なので、変数にセットしたカンマ区切りのデータを直接CSVに吐き出したいと思っております。 TXT = .Height & "," & .Weight を Open "A:DATA.CSV" For Output As #Name へ一件ずつループで回して吐き出したいのですが、「型が一致しません」というエラーがでます。ご存知の方がいらっしゃいましたら、どいうロジックを書けば良いか教えて下さい。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
Public Function FileAppend(ByVal FileName As String, ByVal TEXT As String) As Boolean On Error GoTo Err_FileAppend Static isOpen As Boolean Static fso As FileSystemObject Static txs As TextStream If Not isOpen Then isOpen = True Set fso = New FileSystemObject Set txs = fso.CreateTextFile(FileName, True) End If If Len(TEXT) > 0 Then txs.WriteLine TEXT End If FileAppend = True Exit_FileAppend: On Error Resume Next If Len(TEXT) = 0 Then isOpen = False Set txs = Nothing Set fso = Nothing End If Exit Function Err_FileAppend: Resume Exit_FileAppend End Function 上記の FileAppend 関数を適当な標準モジュールに登録して下さい。 この一点がクリアできたら、先の回答のように、非常に簡単なコードで目的が達成できます。 [イミディエイト] ? FileAppend ("C:\TEMP\TEST.CSV", "100,200") True ? FileAppend ("C:\TEMP\TEST.CSV", "1000,2000") True ? FileAppend ("", "") True 次に、このように、イミディエイトウインドウで一応テストしてみて下さい。 FileAppend 関数は、引数を()で括れば、True/False などの結果を戻します。 メモ帳等で C:\TEMP\TEST.CSV を開けば、次のように書き込まれていることが確認されます。 100,200 1000,2000 初心者であれば、いきなりVBAコードを書くのでなく、イミディエイトウインドウでテストするのも手です。 VBAコードは、このテストを For ループで自動化するだけですから・・・。 なお、FileAppend関数に関しては、暇があったら、それぞれのステップをヘルプで確認したらいいです。 しかし、今回は、理解の度合いは問題ではありません。 要は、FileAppend関数を用いて非手続き的にVBAコードを書けたらそれで十分です。
初心者の方は、もっと、非手続き的な書き方をされたがいいです。 例えば、次のコードでも目的は達成されます。 Private Sub コマンド0_Click() Dim I As Integer Dim N As Integer Dim Datas(3) As String Datas(0) = "0,0" Datas(1) = "1,1" Datas(2) = "2,2" Datas(3) = "3,3" N = UBound(Datas()) ' 配列の大きさをNに代入 For I = 0 To N FileAppend "C:\Temp\DATA.CSV", Datas(I) Next I FileAppend "", "" ' ファイルを閉じる End Sub このコードですと、まず、どんな初心者の方でも書けます。 作成された Datas.csv を NOTEPAD で開くと次のようです。 [c:\temp\datas.csv] 0,0 1,1 2,2 3,3 条件1、Microsoft Scripting Runtime に [ツール][参照設定] レ点を付ける。 条件2、FileAppend 関数を標準モジュールに追加する。 朝礼が始まりますので、FileAppend 関数は後ほど。
- tom11
- ベストアンサー率53% (134/251)
こんにちは、 本題から、外れますが、VBAで、CSVを作らないといけないのですか?? プログラム経験が、少ない??ない?? のに、VBAで、にこだわる理由がわかりません。 単に、アクセスの機能を使って、選択クエリーで 必要な、データに絞って、CSVにエキスポートすれば、 単に、CSVファイルは、できると思うのですが、 VBAにこだわる理由は,何ですか??
- dsuekichi
- ベストアンサー率64% (171/265)
> 当方もともとPGではなく、本意ならぬ事をやらされておりまして。 だからと言って、「プログラム(AccessVBA)が、手加減してくれたり、大目に見てくれる」わけではありませんよ。 「厳密な規則どおりに、理屈に合った」指定をしない限り、まともに動作しないのがプログラムです。 > 「#Name」は何も(dimとかで)定義しておりません。 > これが原因でしょうか? その可能性が大きいですね。 変数名を「FNo」とかにして、 -------------------------------------------------- Dim FNo ' 変数宣言 ~ FNo=FreeFile '利用可能なファイル番号を求め、変数に設定 Open "A:DATA.CSV" For Output As #FNo '該当ファイル番号でファイルを開く ~ Close #FNo ' 指定したファイル番号のファイルを閉じる -------------------------------------------------- 等にするとどうなります?
- dsuekichi
- ベストアンサー率64% (171/265)
> Open "A:DATA.CSV" For Output As #Name ←落ちる あ! 1つ確認していませんでした。 「#Name」とありますが・・・ 変数「Name」はどうやって定義して、どういう値を設定していますか? #「Name」は、組み込み変数等でよく使われるので、 #別の名前にした方が余計なトラブルをまね回亜出すみます。
補足
>「#Name」とありますが・・・ >変数「Name」はどうやって定義して、どういう値を設定していますか? すみません;当方もともとPGではなく、本意ならぬ事をやらされておりまして。上記の件ですが、「#Name」は何も(dimとかで)定義しておりません。 これが原因でしょうか?ご回答ありがとうございます。
- dsuekichi
- ベストアンサー率64% (171/265)
> TXT = .Height & "," & .Weight を > Open "A:DATA.CSV" For Output As #Name へ > 一件ずつループで回して吐き出したいのですが、 実際に実行しているコードは、どういうコードで、 そのどこでエラーとなっていますか? またその際の「.Height」「.Weight」「TXT」の値はどうなっていますか?
補足
早速のご回答ありがとうございます。 実際は下記の所で落ちてしまいます。 TXT = .Height & "," & .Weight ' FD書き込み ' Open "A:DATA.CSV" For Output As #Name ←落ちる Close #Name .Height と .Weight の値は160と40で TXT の値は ”160,40”となっております。 DoCmd.TransferText acExportDelim, , TXT, "A:\IMPORT.TXT", True も試してみたのですが、やはりワークのテーブルを作らないと駄目らし く、DoCmd.TransferTextでは使えませんでした。 テーブルを使うのではなく、変数にセットしたカンマ区切りのデータを一行ずつdata.csvへ吐き出す方法を教えて下さい。 よろしくお願い致します。
お礼
ご回答ありがとうございます。 問題はなんとか解決いたしました。 ありがとうございます。