dポイントプレゼントキャンペーン実施中!

Access2000のVBAを使用してcsvファイルを用意されたテーブルにインポートをしたいのですが、
やっかいな条件があります。

ある決められたフォルダに複数のファイルが存在している、そこから全てのCSVファイルを読み込み、3フィールド目(1行目はタイトル行)の値が「"3"」のものだけインポートする。
あるフィールドには、255文字以上のフィールド(改行文字あり)があります。このフィールドはインポートしてもしなくてもよい

今までは、インポート定義を設定してインポートしていたのですが、csvファイルを判別して、インポート前にフィールドの判別をする方法がわかりません。また、255文字以上の対応もうまくいきません。

  

A 回答 (2件)

>ある決められたフォルダに複数のファイルが存在している、そこから全てのCSVファイルを読み込み、


Dir関数を使ってみてください。
http://homepage2.nifty.com/kasayan/vba/dir.htm

>3フィールド目(1行目はタイトル行)の値が「"3"」のものだけインポートする。
テーブルから”3”だけ選択ならクエリでなら出来ますよね?
それをアクションクエリにしてください。

>あるフィールドには、255文字以上のフィールド(改行文字あり)があります。このフィールドはインポートしてもしなくてもよい
どちらでも構わないのならメモ型としてインポートしてしまえば良いのでは。
消す方が後で付け足すよりも簡単です。

ループ開始
Dir関数で、CSVファイル名を一個ずつ取得して
それをあらかじめ作っておいた空の一時的なテーブルにインポートする。
クエリを走らせ、”3”だけのを本来のテーブルに格納する
RunSqlだと非同期的に行われるので
今回はDocmd.RunSql ではなく、Executeの方を使ってください。
http://www.geocities.jp/cbc_vbnet/Sql/action.html
一時テーブルのレコードを削除
次のループへ戻る。

ご参考まで。
    • good
    • 0
この回答へのお礼

ありがとうございます。
言葉足りずの所がありました。申し訳ございません。
インポート前に”3”を判別するのは、”3”とそれ以外ではインポートのフィールド数が異なるためです。また、Split関数を使用してフィールドの値を取得しようとしましたが、問題の255文字以上のフィールドに改行コードが入っていてうまく取得できません。

本当に言葉足りずですみませんでした。

お礼日時:2012/03/14 17:04

255文字以上のフィールドの中にある改行コードが、CRLF だと


どこまでが『一行』なのか判別つかないので
ADODB.Stream でも無理なんじゃないかな?

一旦、Accessにインポートしてから必要なフィールドだけを取り出すしか手は無いと思います。
”3”というのが左から三つ目のフィールドを指していて、そのフィールド名が不定名なら
currentdb.TableDefs("テーブル名").Fields(3).Name で取得できます。

256文字以上のフィールドは同様に
currentdb.TableDefs("テーブル名").Fields(Index番号).Type で取得できます。
12 (dbMemo)ならメモ型。
http://www.geocities.jp/cbc_vbnet/tips/Tabli_Fie …

あと、残る問題は、Access がCSVファイルをインポートする際に
データの空読みを行ってからデータ型を決定するのですが
最初の十数行の後に別のデータ型に相当するモノがあった場合には
既に決定されたデータ型とは異なるのでインポートエラーテーブルに出力されます。
これはレジストリの変更を行えば空読みの際に全てのレコードを読むように設定出来るらしい
(試してません)
http://office.microsoft.com/ja-jp/access-help/HP …

私からは以上です。
ご参考まで。
    • good
    • 0

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