エクセルVBAについて質問です。【良回答500~250ポイント】

急ぎで解決したい課題があります。早く解決できればポイント送信にて多く差し上げます。
ファイルの検索が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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/11/09 02:15:54
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:TransFreeBSD No.1

回答回数668ベストアンサー獲得回数268

ポイント500pt

デバッグしてません。あしからず。

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

他1件のコメントを見る
id:pochi1234

デバックできました。

補足

・pathは絶対パスに変更

・letfの使い方は If Left(nameA, 10) = Left(nameB, 10) Then

・tmpはobjectは使えないので、variantに変更

ありがとうございます。

2011/11/09 02:20:44
id:TransFreeBSD

Leftの使い方が……ぼけてましたね(^^;

GetFolderについては、リファレンスには相対もOKとありますが、カレントディレクトリの問題とかかもしれませんね。GUIだとそのあたり、曖昧になりがちなので絶対指定の方が確実かもしれません。

いずれにしろ、お手数おかけしました。

2011/11/09 18:53:19

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません