プロが教える店舗&オフィスのセキュリティ対策術

ACCESS VBAで、CSVにデータを吐き出したいのですが、WORKのテーブルを作るのが面倒なので、変数にセットしたカンマ区切りのデータを直接CSVに吐き出したいと思っております。 TXT = .Height & "," & .Weight を Open "A:DATA.CSV" For Output As #Name へ一件ずつループで回して吐き出したいのですが、「型が一致しません」というエラーがでます。ご存知の方がいらっしゃいましたら、どいうロジックを書けば良いか教えて下さい。

A 回答 (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コードを書けたらそれで十分です。
    • good
    • 0

初心者の方は、もっと、非手続き的な書き方をされたがいいです。


例えば、次のコードでも目的は達成されます。

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 関数は後ほど。
    • good
    • 0

こんにちは、



本題から、外れますが、VBAで、CSVを作らないといけないのですか??
プログラム経験が、少ない??ない??
のに、VBAで、にこだわる理由がわかりません。

単に、アクセスの機能を使って、選択クエリーで
必要な、データに絞って、CSVにエキスポートすれば、
単に、CSVファイルは、できると思うのですが、

VBAにこだわる理由は,何ですか??
    • good
    • 0

> 当方もともとPGではなく、本意ならぬ事をやらされておりまして。



だからと言って、「プログラム(AccessVBA)が、手加減してくれたり、大目に見てくれる」わけではありませんよ。

「厳密な規則どおりに、理屈に合った」指定をしない限り、まともに動作しないのがプログラムです。


> 「#Name」は何も(dimとかで)定義しておりません。
> これが原因でしょうか?

その可能性が大きいですね。

変数名を「FNo」とかにして、
--------------------------------------------------
Dim FNo ' 変数宣言

FNo=FreeFile  '利用可能なファイル番号を求め、変数に設定
Open "A:DATA.CSV" For Output As #FNo '該当ファイル番号でファイルを開く

Close #FNo ' 指定したファイル番号のファイルを閉じる
--------------------------------------------------
等にするとどうなります?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
問題はなんとか解決いたしました。
ありがとうございます。

お礼日時:2007/06/19 17:32

> Open "A:DATA.CSV" For Output As #Name ←落ちる



あ!
1つ確認していませんでした。

「#Name」とありますが・・・
変数「Name」はどうやって定義して、どういう値を設定していますか?

#「Name」は、組み込み変数等でよく使われるので、
#別の名前にした方が余計なトラブルをまね回亜出すみます。

この回答への補足

>「#Name」とありますが・・・
>変数「Name」はどうやって定義して、どういう値を設定していますか?

すみません;当方もともとPGではなく、本意ならぬ事をやらされておりまして。上記の件ですが、「#Name」は何も(dimとかで)定義しておりません。
これが原因でしょうか?ご回答ありがとうございます。

補足日時:2007/06/18 13:40
    • good
    • 0

> 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へ吐き出す方法を教えて下さい。

よろしくお願い致します。

補足日時:2007/06/18 12:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!