急ぎで解決したい課題があります。早く解決できればポイント送信にて多く差し上げます。
ファイルの検索が2つのフォルダで行うのでどういう処理にすればよいか困っています。
Aフォルダのファイルを順次開く
↓
Aフォルダの1つ目のファイルを開いたまま
↓
AフォルダのファイルとBフォルダのファイルの
ファイル名の頭から10文字ぐらいが一致しているファイルをBフォルダから検索する
↓
一致したらBフォルダのファイルのRange("A1") を Aフォルダのファイル Range("A1") に転記する
↓
Aフォルダのファイル2つ目を開く、繰り返し
よろしくお願いします。
イメージ的には下記ような処理になります。
Do While dataFile1 <> ""
With Workbooks.Open(dataPath1 & dataFile1)
tmp = Workbooks.Name
Do While dataFile2 <> ""
With Workbooks.Open(dataPath2 & dataFile2)
If True Then
'処理
Exit Do
End If
dataFile2 = Dir
End With
Loop
.Close
dataFile2 = Dir
End With
.Close
dataFile1 = Dir
Loop
デバッグしてません。あしからず。
Sub Macro1() Dim fso, dataFilesB, fA, fB, tmp ' ファイルを扱うオブジェクトを取得する Set fso = CreateObject("Scripting.FileSystemObject") ' あらかじめBフォルダのファイル一覧を取得しておく Set dataFilesB = fso.GetFolder(dataPathB).Files ' Aフォルダのファイル毎に繰り返す For Each fA In fso.GetFolder(dataPathA).Files For Each fB In dataFilesB ' 一つ一つBフォルダのファイルと比較する If nearly(fA.Name, fB.Name) Then ' おおよそ同じファイル名なら値をコピーして保存する With Workbooks.Open(fB.Path) tmp = .ActiveSheet.Range("A1").Value .Close End With With Workbooks.Open(fA.Path) .ActiveSheet.Range("A1").Value = tmp .Save End With Exit For End If Next fB Next fA End Sub ' 比較関数:適宜作ってください Function nearly(nameA, nameB) If nameA.left(10) = nameB.left(10) Then nearly = True Else nearly = Fales End If End Function
ファイルは毎回開く必要はないですよね?
一致した時だけ開いてコピーします。
本当はファイルをソートしておくとか比較回数を減らす方法がありますが、そこまではやりませんでした。
忘れてました。参考リンクです。
http://home.att.ne.jp/zeta/gen/excel/c04p24.htm
http://officetanaka.net/excel/vba/filesystemobject/index.htm
デバックできました。
補足
・pathは絶対パスに変更
・letfの使い方は If Left(nameA, 10) = Left(nameB, 10) Then
・tmpはobjectは使えないので、variantに変更
ありがとうございます。
2011/11/09 02:20:44Leftの使い方が……ぼけてましたね(^^;
GetFolderについては、リファレンスには相対もOKとありますが、カレントディレクトリの問題とかかもしれませんね。GUIだとそのあたり、曖昧になりがちなので絶対指定の方が確実かもしれません。
いずれにしろ、お手数おかけしました。
2011/11/09 18:53:19