プロが教えるわが家の防犯対策術!

お世話になります。
Windows XP SP3、Access2003 で
CSVファイルをインポートする処理をつくっています。

読み込むCSVファイルが大きく、必要ないフィールドが多いのですが、
下記のようにLine Input で全部読み込んで
Splitでカンマ区切りでバラしてvarData(Variant型)にいれて
レコードセット(インポート先の既存テーブル)に入れる時に、
必要に応じてデータ型を変更して
フィールド指定ししていれるようにしています。

ところが、CSVファイルの中のデータで数件ほど
ちゃんと読み込めないものがあり、
レコードセットにいれるときにエラーでとまってしまいます。

調べてみると、フィールドで取得した値がずれており、
前の方の複数のフィールドでNull値があった場合?に
ずれ込むことがあるようです。

どうしたらこの現象はなおせるのか教えてください。


それとも・・・
このようにフィールド指定してレコードセットに入れ込むよりも
一度CSVファイルの全レコードを他のテーブルにインポートして、
そこからインポート先の既存の本テーブルにいれたほうがいいのでしょうか?

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


Open ---- For Input As----

Line Input #lngFileNum, strData

インポート先のテーブルをレコードセットで開く
DAO、トランザクション使用

Do Until EOF(lngFileNum)
Line Input #lngFileNum, strData

'データを配列へ
varData = Split(strData, ",")

With rs
.AddNew
!番号 = CLng(varData(0))
!名称 = varData(1)
!受付日 = DateValue(varData(8))
!種別 = varData(10), ""
!登録番号 = CLng(varData(11))
          (以下略)

教えて!goo グレード

A 回答 (5件)

No4です。


No4の続きとして。

フィールド名は質問の通りの抜き出し番号になっていませんが、
リンクしたCSVをT1、追加先テーブルをT2として、以下のようなクエリ
で追加。


INSERT INTO T2 ( 番号, 名称, 受付日, 種別, 登録番号 )
SELECT CLng([フィールド1]) AS F1, T1.フィールド2, DateValue([フィールド3]) AS F3, T1.フィールド4, CLng([フィールド5]) AS F5
FROM T1;


あるいは、

>前の方の複数のフィールドでNull値があった場合

この意味が分かりづらいのですが、もしかしたら、
インポートしようとしているフィールドにNullデータ
が存在する、という意味ならば、

INSERT INTO T2 ( 番号, 名称, 受付日, 種別, 登録番号 )
SELECT IIf(IsNull([フィールド1]),Null,CLng([フィールド1])) AS F1, IIf(IsNull([フィールド2]),Null,[フィールド2]) AS F2, IIf(IsNull([フィールド3]),Null,DateValue([フィールド3])) AS F3, IIf(IsNull([フィールド4]),Null,[フィールド4]) AS F4, CLng(Nz([フィールド5])) AS F5
FROM T1;

これで対応できるものかな、というところですかね。
    • good
    • 0

CSVをリンクテーブルとしてはどうですか。



「外部データの取り込み」から「テーブルのリンク」
を選択し、「ファイルの種類」を「テキストファイル」
とし、ファイルのあるフォルダを選択し、当該ファイルを
クリックするとウィザードが表示されます。

そこで、設定を選択し、フィールド区切り記号、
文字列の引用符を設定し、フィールドの情報で、
必要のないフィールドにチェックを入れてスキップ
を設定し、OKとして最後まで進み、リンクを設定します。

あとは、普通のテーブルとして別テーブルに
追加クエリなりでデータを移し変えて加工するなり、
そのまま参照テーブルとして使用することも
できます。
    • good
    • 0

前述のリンクです。


http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …

>前の方の複数のフィールドでNull値があった場合?に
>ずれ込むことがあるようです。

原因がはっきりしていないので、はっきりさせること。

インポート機能は、あくまでも標準機能。
ちょっとイレギュラー、不正データがあると対応できないものも多いです。

カンマ区切りがどうしてもダメなら
1行単位で読み込むとか一時的にスペース等にして代替処理、
別のアプローチも検討です。
    • good
    • 0

今の方向で進めるなら・・・


Ubound(varData) で確認して×ならレコードセットに入れないで
エラー行として別のテキストファイルに書き込んでから
次の行に進むとか。
varDataの要素を一個ずつチェックするのは面倒ですねぇ。
ん~後は何だろ。

別案を検討されていますが、こちらでも
テキストを Access にインポートした際に 区切り位置がずれる場合の対処方法
http://support.microsoft.com/default.aspx?scid=k …
などがありますので、『前門の狼、後門の虎』かもしれない。
試してみる価値は大いにありそうですけどね。
インポートさえ出来てしまえば、あとは焼くなと煮るなとこっちの勝手気まま (^^ゞ

具体的に何処のステップで止まってしまうのか。
(エラールーチンはコメントアウトして)エラー番号。
エラーになる実際のstrDataの内容とかが分かれば識者から回答があるかもしれない。
    • good
    • 0

参考



エクセルでお仕事
のサイト、VBA応用を参考


ズレるなら
それを使わない手でやる

それでやってもいいように仕向ける

怪しいと思われる,,を,"",に変えても同じですか。
    • good
    • 0

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

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

教えて!goo グレード

関連するカテゴリからQ&Aを探す


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

人気Q&Aランキング