- 締切済み
CSVファイルインポート時の制限について
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で作成できるとよいのですが、可能でしたら教えてください。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- piroin654
- ベストアンサー率75% (692/917)
もう一つのリンク先が同じところに なっていました。以下です。 http://oshiete1.goo.ne.jp/qa5784777.html ついでだから、方法を貼り付けておきます。 リンクの仕方は、データベースウインドウ を表示したままで、 (1)ツールバーのファイルから、 外部データの取り込み→テーブルのリンク (2)取り込み.CSVが置いてあるフォルダを 表示。 (3)ファイルの種類はテキストを選択。 (4)取り込み.CSVをクリック (5)テキストリンクウィザードが起動 (6)区切り記号つきを選択 (6)カンマ選択 先頭行をフィールド名として使う にチェック (7)次に進みIDの選択確認 (8)リンク終了のメッセージ確認 以上で取り込み.CSVがテーブルとして リンクされます。
- piroin654
- ベストアンサー率75% (692/917)
すみません。CSVをリンクさせる方法は 以下のところの下のほうに記述しています。 CSVファイルをリンクしたテーブルと同じ ように扱おうということです。 設定の初めのほうは普通の外部データベースの テーブルをリンクさせるのと同じです。 途中から、CSVファイルのフィールドの 見出しの設定などが出てきます。 http://oshiete1.watch.impress.co.jp/qa5784777.html 文字が見づらければ、以下のサイトは以前の 表示をしています。ただログインはここの IDが必要のようです。 http://oshiete1.goo.ne.jp/qa5786935.html IsNumeric関数は関数の引数が 数値型であるか判定する関数です。 IsNumeric(引数) CSVファイルのフィールドの型と 受け入れるテーブルの型が一致 していれば普通にテーブル間の データの移動と同じように出来ます。 一度、この方法で確かめてください。 インポート定義の方法は確認してみます。
- piroin654
- ベストアンサー率75% (692/917)
すみません、訂正です。 >インポートするテーブルを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列で、これの末尾のやつが問題となっています。 仕入日(日付/時刻型) 商品名(テキスト型) 登録日(日付/時刻型) 登録時間(日付/時刻型) 登録時価格(数値型) 更新日(日付/時刻型) 更新時間(日付/時刻型) 店頭価格(数値型) 商品説明(テキスト型) 備考(メモ型)
- piroin654
- ベストアンサー率75% (692/917)
方法はいろいろですが、一つの案として 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関数の使い方という ことで簡単にテーブルリンクで説明 しました。
お礼
朝早く(夜遅く?)に回答いただき、ありがとうございます。 教えていただいた方法を試してみます。 また確認した結果をご報告させていただきます。