【最大10000ポイント】当たる!!質問投稿キャンペーン!

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessでグローバル変数を宣言して定数を定義したい

Access97でグローバル変数を持ちたいと思ったのですが、
それらしきものが見つかりません。

Public変数というものがあるのですが、これはプロシージャ-単位で
しか定義できないようです。

ひとつのデータベース全体でグローバルに定義できる定数を持ちたいのです。
たとえば、データベース内で頻繁に読み込む必要があるファイルのPATH
"C:\Program Files\Netscape\Communicator\"を
固定で持っておきたい。

何か方法はないでしょうか?
よろしくお願いします。

Aベストアンサー

もし、定数でいいのであれば、
標準モジュールに、

Const DATAPATH = "C:\Program Files\Netscape\Communicator\"

のように書けば、どこからでもDATAPATHと言う名前で参照することができます。

変数である必要があるのなら、同じく標準モジュールに、

Global glbDataPath as String

Public Sub PathSet()

glbDataPath = "C:\Program Files\Netscape\Communicator\"

Exit

と書いておき、AutoExecマクロのモジュールを開くでPathSetサブルーチンを呼び出せばよいと思います。

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

使用しているのはAccess2000です。
クエリのレコードを、1レコードずつcsvにエクスポートしたいのですが、マクロなどで自動的におこなうことはできないでしょうか?

例.
クエリ名:test
レコード数:100件
フィールド名:ファイル名
testクエリの1から100までのレコードを、1件ずつcsvへエクスポートする。保存する際は「ファイル名」を参照して、csvファイル名とする。100件分のこれらの作業をすべてマクロ等で自動化したい。

VBAの知識はほとんどありませんが、VBAによる回答でも構いません。

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

Aベストアンサー

回答を間違っていました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

回答を間違っていましたm(_ _)m
テーブル(DB)とテキスト(CSV)が、ごちゃまぜでした。
入力=テーブルなので LINE INPUT は間違いでした。

色々やり方はあるのですが、DBのアクセスする所が、初めてだと判り辛いと思いまして。。。(^^;
簡単に作ってテストしてみましたので、フォームのコマンドボタンのイベントに貼り付けて下さい。

(1)フォーム・コマンドボタン→イベント・クリック時「イベントプロシージャ」→下記、処理を貼り付け
(2)テーブル名、項目名などは、変更して下さい
(3)...続きを読む

QAccessのテーブル、クエリをCSV形式でエクスポートしたい

マクロを使ってAccessのテーブルやクエリを、カンマ区切のCSV形式でマクロを使ってエクスポートしたいのですが、それらしいものが見つかりません。

どのようにするのでしょうか?


環境:Access 2003 、WindowsXP

Aベストアンサー

マクロの「アクション」で「テキスト変換」を指定し、画面左下に表示される
『変換の種類』引数に「区切り記号付きエクスポート」を指定すればOKです。
 *VBAの場合は「TransferText」になります。

その他の引数については事例毎に個別になりますので、詳細はヘルプを
参照して下さい。
(マクロ・VBAとも、「TransferText」で検索を掛ければ見られると思います;
 Access2000で確認)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング