人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

csvファイルがデスクトップにあります。これをアクセスのテーブルにインサートとアップデートをかけたいです。アクセスの機能をつかったインポートではなくVBAを使った方法です。例えばテーブルABCがあります。各フィールドは文字列型、数値型でnullは禁止にしていません。CSVはカンマ区切りで行の最後は改行になっています。各行の中には、
"abc,def,hij,,,,,,,,,klmn,,,op,,,qr"などになっています。1行読み込んでは次の行を読み込んでアクセスのテーブルにいれるという方法です。レコードセットを使ってinsertするのは理解できますが、どうやってcsvをうまく読み取ってテーブルに反映させればいいでしょうか?何か不具合などは生じないでしょうか?このサイトを参考にしようと思っています。http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_020.html

●質問者: akaired
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:ABC CSV def OP QR
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● degucho
●35ポイント

参考サイトにあるように、CSVといってもいろいろあるので、

Accessで直接インポート出来るフォーマットファイルであれば

DoCmd,TransferTextを使って一旦別のテーブルに取り込んでから

処理するのが速度や機能の変更の面で楽だと思います。

(取り込み前に加工してもいい。場合によってはクエリで済むかもしれない)


ファイルを読む場合、

Access2000以降であれば例示のInputステートメントより

LineInputで一行読んでSplit関数で分けて配列で処理したほうが

Recordset.Fieldsコレクションとインデックスで対応させられるから

プログラムしやすいかもしれません。

例示の行だと行頭と行末の"を取ってやらないといけませんが


不具合というのがなにを想定しているのかがわかりませんが

(レコードセットでAddNew/Updateは出来るんですよね?)

よくある処理だと思います。

Accessの文字列型はNullと""(空文字)を区別しますのでNullを入れたいときは

プログラムで意図的に判断してやる必要があるかとおもいます


2 ● SALINGER
●150ポイント ベストアンサー

csvを読み込むことで想定される問題は、データが""で囲んでたりcsvによって仕様が違う場合があること。

データベースの数値型に文字型を代入してしまうなどの、データ型の問題。

主キーに設定されたフィールドが重複していた。

NULL禁止のフィールドに値が設定されなかった。などがあります。


参考のリンク先はExcelに表示するサンプルですが、それを参考にコードを考えてみます。

まず、コードではGetOpenFilenameはそのまま使えないので削除。

Excelに出力してる部分をデータベースに読み込むようにコードを変えるだけです。

リンク先はフィールド数が固定の場合のサンプルなので、フィールド数は5個と固定しています。

下のコードでは読み込めなかった行がわかるようにしてみました。

(Updateを何度もしてるのでオーバーヘッドではありますが)


Option Explicit

' CSV形式テキストファイル(5カラム)読み込みサンプル
Sub READ_TextFile()
 Const cnsTITLE = "テキストファイル読み込み処理"
 Const cnsFILTER = "全てのファイル (*.*),*.*"
 Dim intFF As Integer  ' FreeFile値
 Dim strFILENAME As String  ' OPENするファイル名(フルパス)
 Dim X(1 To 5) As Variant  ' 読み込んだレコード内容 ' ?
 Dim GYO As Long  ' 収容するセルの行
 Dim lngREC As Long  ' レコード件数カウンタ
 
 Dim db As Database
 Dim rs As Recordset
 Dim i As Integer
 
 Set db = CurrentDb
 Set rs = db.OpenRecordset("テーブルABC", dbOpenTable)

  'csvファイルのパスを指定
 strFILENAME = "C:\Documents and Settings\hogehoge\デスクトップ\sample.csv"
 
  ' FreeFile値の取得(以降この値で入出力する)
 intFF = FreeFile
  ' 指定ファイルをOPEN(入力モード)
 Open strFILENAME For Input As #intFF
 GYO = 0
  ' ファイルのEOF(End of File)まで繰り返す
 Do Until EOF(intFF)
  ' レコード件数カウンタの加算
 lngREC = lngREC + 1
  ' レコードを読み込む(このサンプルは5項目のCSV)
 Input #intFF, X(1), X(2), X(3), X(4), X(5)  ' ?
 
 GYO = GYO + 1
 
 rs.AddNew
 For i = 1 To 5
 rs.Fields(i - 1) = X(i)
 Next i
 On Error Resume Next
 rs.Update
 If Err.Number > 0 Then
 MsgBox GYO & "行目を読み込むことができませんでした"
 lngREC = lngREC - 1
 End If
 On Error GoTo 0
 Loop
  ' 指定ファイルをCLOSE
 Close #intFF
  ' 終了の表示
 
 rs.Close
 Set rs = Nothing
 Set db = Nothing
 
 MsgBox "ファイル読み込みが完了しました。" & vbCr & _
 "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE
End Sub
◎質問者からの返答

ご回答ありがとうございます!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ