アプリ版:「スタンプのみでお礼する」機能のリリースについて

複数の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ファイルを閉じる(削除する)

この流れでいいと思うのですが方法が分かりません。

丸投げですがよろしくお願いします。

A 回答 (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/filesystem …
    • good
    • 0
この回答へのお礼

お礼が遅くなって申し訳ございません。ほとんど変更することなく望みどおりの結果ができました。1つずつ開いて閉じての繰り返ししかないと思っていたので目からうろこです。有難うございました。

お礼日時:2009/05/13 11:20

#1です


>csvふぁいるの5行目だけを
という条件が有るのですね。もらしていたので
各インプトファイルで4レコードは書かず5レコード目を私の例ではshuyaku.csvに書き出し、
そこでインプット・ファイルをクローズすればよい。そして次のループを繰り返す。
>accessに書き込んでテーブルに追加していきたいと
出来た5行目のみの集約CSVファイルをアクセスにインポートすればよい。
>accessに書き込んでテーブルに追加していきたいと
ある時点で作業をやって、その後CSVファイルが増えて、増えたCSVの
第5行だけをテーブル追加と言うことを含んでいるとなると難しい。
追加のCSVファイルを見つける処理をどうするか。
    • good
    • 0
この回答へのお礼

早速の回答と補足有難うございます。
集約したCSVファイルからリンクテーブルを作って、後は追加クエリでいけそうです。書いてなかったですけど項目1が重複しないのでこれを主キーにしてできそうです。
有難うございました。

お礼日時:2009/05/11 16:45

先ほども、そっくりの質問があった。


エクセルに取り込んで、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にコードがいくつも有るはず。
    • good
    • 0

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