- ベストアンサー
複数のcsvファイルをマクロ(VBA)で取り込みたい
複数のcsvファイルをマクロ(VBA)で取り込みたい csvファイルの中身が、 20090507 120508 osaka 項目1,項目2,項目3,・・・・・,項目10 a1,a2,a3,・・・・・,a10 b1,b2,b3,・・・・・,b10 c1,c2,c3,・・・・・,c10 や 20090507 132529 hokkaido 項目1,項目2,項目3,・・・・・,項目10 d1,d2,d3,・・・・・,d10 e1,e2,e3,・・・・・,e10 f1,f2,f3,・・・・・,f10 となっているcsvファイルが特定のフォルダの中に100以上あります。 このcsvふぁいるの5行目だけをaccessに書き込んでテーブルに追加していきたいと思っています。 項目1,項目2,項目3,・・・・・,項目10 a1,a2,a3,・・・・・,a10 d1,d2,d3,・・・・・,d10 このようなテーブルができればいいのですが・・・ csvファイルを開く→5行目をテーブルに追加→csvファイルを閉じる(削除する)→次のcsvファイルを開く→5行目をテーブルに追加→csvファイルを閉じる(削除する) この流れでいいと思うのですが方法が分かりません。 丸投げですがよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
(ちょっとメモリを使うかもしれませんが) 以下は、フォルダ「E:\tmp2」にあるファイル全てを処理する参考例となります。 ファイル内容を全部読込み、改行コードで配列にします(buf) 5行以上あったら、4行目をテーブルのフィールド名として使います。 項目1,項目2,項目3,項目4,項目5,項目6,項目7,項目8,項目9,項目10 5行目を文字にしてレコードを追加します。(フィールド全てがテキスト型と仮定) a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 ↓ 'a1','a2','a3','a4','a5','a6','a7','a8','a9','a10' (, カンマの前後に空白がないことが前提で) 処理の終わったファイルは、フォルダ「E:\tmp2\処理済み\」へ移動します。 Private Sub Sample1() Dim oFso As Object Dim oFile As Object Dim buf As Variant Set oFso = CreateObject("Scripting.FileSystemObject") For Each oFile In oFso.GetFolder("E:\tmp2").Files With oFso.OpenTextFile(oFile.Path) buf = Split(.ReadAll, vbCrLf) .Close End With If (UBound(buf) >= 4) Then CurrentDb.Execute "INSERT INTO テーブル名 (" & buf(3) & _ ") VALUES ('" & Replace(buf(4), ",", "','") & "');" End If oFso.MoveFile oFile.Path, "E:\tmp2\処理済み\" Next Set oFso = Nothing End Sub ※ FileSystemObject の解説は以下が参考になります。 http://www.officetanaka.net/excel/vba/filesystemobject/index.htm
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
#1です >csvふぁいるの5行目だけを という条件が有るのですね。もらしていたので 各インプトファイルで4レコードは書かず5レコード目を私の例ではshuyaku.csvに書き出し、 そこでインプット・ファイルをクローズすればよい。そして次のループを繰り返す。 >accessに書き込んでテーブルに追加していきたいと 出来た5行目のみの集約CSVファイルをアクセスにインポートすればよい。 >accessに書き込んでテーブルに追加していきたいと ある時点で作業をやって、その後CSVファイルが増えて、増えたCSVの 第5行だけをテーブル追加と言うことを含んでいるとなると難しい。 追加のCSVファイルを見つける処理をどうするか。
お礼
早速の回答と補足有難うございます。 集約したCSVファイルからリンクテーブルを作って、後は追加クエリでいけそうです。書いてなかったですけど項目1が重複しないのでこれを主キーにしてできそうです。 有難うございました。
- imogasi
- ベストアンサー率27% (4737/17069)
先ほども、そっくりの質問があった。 エクセルに取り込んで、CSVファイル単位で下の行に取り込んで行く方法はあるが、 ーー テキストファイルを読んで、(A) 集約ファイルの後に追加s(Append)(B) テキストファイル(A)をCLOSE 次のテキストファイルを読んで、 Bの末尾に追加 繰り返して最後のテキストファイルを読み 追加が終わると、集約テキストファイル(B)を書き出し。 (B)をClose のやり方を勉強したら。 旧BASIC時代はこんなことばかりやっていたのだが、エクセルから入る世代には忘れられているようだな。 Googleで「APPENDモード」で照会のこと。 ーー 例コード エクセルの標準モジュールで出来た。 簡単なCSVファイル3つでテスト済み。 Sub test03() Dim fileNo1 As Integer: Dim fileNo2 As Integer fileNo1 = FreeFile: fileNo2 = FreeFile fn = Array("", "test01", "test02", "test03") Open "shuyaku.csv" For Append As #fileNo2 For i = 1 To 3 fileNo1 = FreeFile 'MsgBox fileNo1 & fn(i) Open fn(i) & ".csv" For Input As #fileNo1 While Not EOF(2) Line Input #fileNo1, A Print #fileNo2, A Wend Close #fileNo1 Next Close #fileNo2 End Sub ーー 集約ばかり説明したが、フォルダの中のファイルを捉えるコードは VBSCRIPT や DIR関数を Googleで照会のこと。 検索語は VBSCRIPT ファイル および DIR関数 WEBにコードがいくつも有るはず。
お礼
お礼が遅くなって申し訳ございません。ほとんど変更することなく望みどおりの結果ができました。1つずつ開いて閉じての繰り返ししかないと思っていたので目からうろこです。有難うございました。