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

AccessVBAでcsvファイルをインポートするマクロを作っています。
現在、インポート定義を利用して、データ型を指定したインポートができているのですが、1点だけ問題があり、質問します。

インポートするcsvファイルのA列にIDが入力されています。
そのA列の末尾に、ID(数値型)ではない「<b>32</b><br />」という値が入っています。
Accessのテーブルでは、このIDのフィールドは数値型で管理している為、この1レコードだけ
エラーとなり、エラーテーブルが作られ、また、インポート先のテーブルには空のレコードができてしまいます。
この末尾の行については、IDではない「<b>32</b><br />」以外は何もデータが入っていない為、
インポートする必要がありません。
もし可能であれば、csvファイルのA列(Accessテーブルでは数値型のIDというフィールド)が数値ではない場合、
その行のインポートをスキップするような処理がVBAで作成できるとよいのですが、可能でしたら教えてください。

A 回答 (4件)

もう一つのリンク先が同じところに


なっていました。以下です。

http://oshiete1.goo.ne.jp/qa5784777.html

ついでだから、方法を貼り付けておきます。

リンクの仕方は、データベースウインドウ
を表示したままで、
(1)ツールバーのファイルから、
 外部データの取り込み→テーブルのリンク

(2)取り込み.CSVが置いてあるフォルダを
表示。

(3)ファイルの種類はテキストを選択。

(4)取り込み.CSVをクリック

(5)テキストリンクウィザードが起動

(6)区切り記号つきを選択

(6)カンマ選択
先頭行をフィールド名として使う
 にチェック

(7)次に進みIDの選択確認

(8)リンク終了のメッセージ確認

以上で取り込み.CSVがテーブルとして
リンクされます。
    • good
    • 0

すみません。

CSVをリンクさせる方法は
以下のところの下のほうに記述しています。
CSVファイルをリンクしたテーブルと同じ
ように扱おうということです。
設定の初めのほうは普通の外部データベースの
テーブルをリンクさせるのと同じです。
途中から、CSVファイルのフィールドの
見出しの設定などが出てきます。


http://oshiete1.watch.impress.co.jp/qa5784777.html

文字が見づらければ、以下のサイトは以前の
表示をしています。ただログインはここの
IDが必要のようです。

http://oshiete1.goo.ne.jp/qa5786935.html


IsNumeric関数は関数の引数が
数値型であるか判定する関数です。
IsNumeric(引数)

CSVファイルのフィールドの型と
受け入れるテーブルの型が一致
していれば普通にテーブル間の
データの移動と同じように出来ます。
一度、この方法で確かめてください。
インポート定義の方法は確認してみます。
    • good
    • 0
この回答へのお礼

朝早く(夜遅く?)に回答いただき、ありがとうございます。
教えていただいた方法を試してみます。
また確認した結果をご報告させていただきます。

お礼日時:2010/03/30 08:30

すみません、訂正です。



>インポートするテーブルをTABLEとし、
>フィールドは適当にAA,BB,CCとします。

の部分をID,AA,BBとします。

コードの中ではわかりやすくということで
ID,AA,BBにしています。
以上です。

この回答への補足

piroin654様、早速の回答、ありがとうございます。
教えていただいた方法を試すべく、IM.csvファイルにA、B、Cのフィールドを用意し、TABLEにID、AA、BBを用意してコードの実行を行ってみたのですが、「実行時エラー '3078': 入力テーブルまたはくえり'IM'が見つかりませんでした。そのテーブルやクエリが存在していること、または名前が正しいことを確認してください。」というエラーが出て、実行できませんでした。

アクセスを最近始めたばかりですべて手探り状態の為、やり方が間違っているのかもしれないのですが、テーブルリンクという方法を実行するのに、
IM.csvとTABLEを用意して、コードを実行するだけではいけなかったのでしょうか?

また現在は以下のコードでインポートを行っています。
※csvかxlsファイルを任意の場所から選択し、商品登録簿(テーブル)へインポートする。
Dim FN As String
Dim Res As Integer

WizHook.Key = 51488399
Res = WizHook.GetFileName(0, "", "", "", FN, "", _
"csv;xlsファイル(*.csv;*.xls)|*.csv;*.xls", 0, 0, 4, True)
WizHook.Key = 0
If Res = 0 Then
If Right(FN, 4) = ".csv" Then
DoCmd.TransferText , "csvインポート定義", "商品登録簿", FN
Else
DoCmd.TransferSpreadsheet , , "商品登録簿", FN, True
End If
MsgBox Right(FN, 3) & "ファイルをインポートしました", vbOKOnly
End If

このコードにIf IsNumeric(rs!ID) Thenというものを使用してみたのですが、やはりダメでエラーが出てしまいました。
Dim FN As String
Dim Res As Integer
Dim db As Database
Dim rs As Recordset

WizHook.Key = 51488399
Res = WizHook.GetFileName(0, "", "", "", FN, "", _
"csv;xlsファイル(*.csv;*.xls)|*.csv;*.xls", 0, 0, 4, True)
WizHook.Key = 0
If Res = 0 Then
If Right(FN, 4) = ".csv" Then
Set db = CurrentDb
Set rs = db.OpenRecordset(FN)
If IsNumeric(rs!ID) Then
  DoCmd.TransferText , "csvインポート定義", "商品登録簿", FN
End If
Else
DoCmd.TransferSpreadsheet , , "商品登録簿", FN, True
End If
MsgBox Right(FN, 3) & "ファイルをインポートしました", vbOKOnly
End If

いろいろと知識がなくて折角いただいた回答を生かせず申し訳ないのですが、もしよろしければ、また回答いただけると幸いです。

下記、テーブル構成です。
AutoID(オートナンバー型)主キー:csvファイルにはないフィールドです。
ID(数値型):csvファイルのA列で、これの末尾のやつが問題となっています。
仕入日(日付/時刻型)
商品名(テキスト型)
登録日(日付/時刻型)
登録時間(日付/時刻型)
登録時価格(数値型)
更新日(日付/時刻型)
更新時間(日付/時刻型)
店頭価格(数値型)
商品説明(テキスト型)
備考(メモ型)

補足日時:2010/03/30 01:38
    • good
    • 0

方法はいろいろですが、一つの案として


IsNumeric関数を使ってみます。

CSVファイルをIM.csvとし、フィールドは
適当にA,B,Cとします。
インポートするテーブルをTABLEとし、
フィールドは適当にAA,BB,CCとします。
CSVファイルのA列について判断しながら
インポートする方法ですが、一応
CSVファイルをテーブルとしてリンク
して使用する方法でコードを出してみます。

Sub funcインポート()
Dim db As Database
Dim rs As Recordset
Dim rst As Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset("IM")
Set rst = db.OpenRecordset("TABLE", dbOpenDynaset)

rs.MoveFirst
Do Until rs.EOF
If IsNumeric(rs!A) Then
rst.AddNew
rst!ID = rs!A
rst!AA = rs!B
rst!BB = rs!C
rst.Update
Else
End If
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
rst.Close
Set rst = Nothing
db.Close
Set db = Nothing
End Sub

以上はIsNumeric関数の使い方という
ことで簡単にテーブルリンクで説明
しました。
    • good
    • 0

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

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