• ベストアンサー

エクセル:マクロでの同名ファイル検索

お世話になります。 あるフォルダの中に、たくさんフォルダが入っています。 子フォルダのファイルを全て親フォルダに移すのですが、同名ファイルがある可能性があります。 同名ファイルは枝番をつけるなどして処理するのですが、あらかじめ同名ファイルがあるかどうかを調べたいのです。 親フォルダの中にエクセルを入れておき、マクロの実行の結果、エクセルのシートに同名ファイルの情報を表示できればと思っています。 例)もし同名ファイルがあった場合、 まずセルA1にファイル名、B1に拡張子を表示する。123.xlsの場合 A1に123 B1に.xls そしてそのファイルが入っているフォルダ名をB2以降のB列に表示する。 3つのフォルダにA1のファイル名のデータがあれば、B2,B3,B4にそのフォルダ名が表示される。 もちろん同名ファイルが1組とは限りません。 2つ目以降はB列のフォルダ名が入った下の行のA列(上の例だとA5)にファイル名が入る。 この繰り返しです。 また、もし1つの同名ファイルがなかった場合は、A1に「同名ファイルなし」と表示させます。 ちなみに重複の場合の枝番の付け方に規則性がないため手作業で行いますが、枝番をつけて同名ファイルを無くした あとにまとめて親フォルダに全データを移すこともマクロで可能ならアドバイスください。 フォルダ構成は1つの親フォルダに対して複数の子フォルダで、孫フォルダはありません。 OSはWinXP、Excelは2002です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

No.2です。 ファイル移動のマクロで、移動中のファイルの進行状況を左下のステータスバーに表示し、終了したらダイアログを出すとともにB1に「移動完了しました」と出すようにしてみました。マクロを以下のものに差し替えて試してください。 Sub ファイル移動()  Dim RootPath As String  Dim i As Integer  Dim FSO As Object  Dim D As Object, F As Object    Set FSO = CreateObject("Scripting.FileSystemObject")  RootPath = ThisWorkbook.Path & "\"    i = 1  For Each D In FSO.GetFolder(RootPath).SubFolders   For Each F In FSO.GetFolder(RootPath & D.Name).Files    Application.StatusBar = "ファイル移動中: " & i & "ファイル完了 "    Name RootPath & D.Name & "\" & F.Name As RootPath & F.Name    i = i + 1   Next  Next  Set FSO = Nothing  Application.StatusBar = ""  MsgBox ("終了しました。")  ActiveSheet.Range("B1").Value = "移動完了しました。" End Sub

HGK
質問者

お礼

ありがとうございました。希望通りにいきました。

その他の回答 (2)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

ちょうど先日に同じようなものを作ったので、それを流用して作ってみました。 ●同名ファイルの抽出マクロ Sub 重複ファイル抽出()  Dim RootPath As String  Dim i As Integer  Dim IsDuplicated As Boolean  Dim FSO As Object  Dim D As Object, F As Object  Dim r As Range  Dim TmpWS As Worksheet, WS As Worksheet    Application.ScreenUpdating = False  Set WS = ActiveSheet  WS.Cells.ClearContents    'ワーク用のテンポラリシートを追加  Set TmpWS = Worksheets.Add    Set FSO = CreateObject("Scripting.FileSystemObject")  RootPath = ThisWorkbook.Path & "\"    'ファイル一覧をテンポラリシートに出力  'A列:フォルダー名、B列、ファイル名  i = 1  For Each D In FSO.GetFolder(RootPath).SubFolders   For Each F In FSO.GetFolder(RootPath & D.Name).Files    Cells(i, "A").Value = D.Name    Cells(i, "B").Value = F.Name    i = i + 1   Next  Next    'ファイル名をキーにしてソート  Columns("A:B").Sort Key1:=Range("B1")    '同名ファイルがあるかチェック  i = 0: IsDuplicated = False  For Each r In Range("B1", Cells(Rows.Count, "B").End(xlUp))   If StrConv(r.Value, vbLowerCase) = StrConv(r.Offset(1).Value, vbLowerCase) Then    If IsDuplicated = False Then     i = i + 1     WS.Cells(i, 1).Value = FSO.GetBaseName(r.Value)     WS.Cells(i, 2).Value = FSO.GetExtensionName(r.Value)     IsDuplicated = True    End If    i = i + 1    WS.Cells(i, 2).Value = r.Offset(, -1).Value   ElseIf IsDuplicated Then    i = i + 1    WS.Cells(i, 2).Value = r.Offset(, -1).Value    IsDuplicated = False   End If  Next    If i = 0 Then   WS.Range("A1").Value = "同名ファイルなし"  End If    'テンポラリシートを削除  Application.DisplayAlerts = False  TmpWS.Delete  Application.DisplayAlerts = True  Set FSO = Nothing End Sub ●子フォルダ配下のファイルをまとめて移動するマクロ Sub ファイル移動()  Dim RootPath As String  Dim i As Integer  Dim FSO As Object  Dim D As Object, F As Object    Set FSO = CreateObject("Scripting.FileSystemObject")  RootPath = ThisWorkbook.Path & "\"    i = 1  For Each D In FSO.GetFolder(RootPath).SubFolders   For Each F In FSO.GetFolder(RootPath & D.Name).Files    Name RootPath & D.Name & "\" & F.Name As RootPath & F.Name    i = i + 1   Next  Next  Set FSO = Nothing End Sub

HGK
質問者

補足

回答ありがとうございます。試した結果、両方とも問題なく動作してくれました。ありがとうございます。ちなみに「子フォルダ配下のファイルをまとめて移動するマクロ」で処理完了後にB1セルに「移動完了しました」などと表示できますか?数千件のデータを移動させたりするので・・・

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

ここまでガチガチに個人的なAPを要求するのですか^^; 別の方法をお教えしますので試してみてください。 COMMAND画面を起動して >D: Enter → 目的のドライブ名 >CD \aaa Enter → 親フォルダ名 >TREE /F > D:\TREE.TXT Enter → ファイルTreeを二にのファイルに書きだす >EXIT → COMMANDを終わる これでD:\TREE.TXTというファイルができあがります。内容をみると子フォルダも含めてファイルリストが入っているはずです。 これをEXCELで読み込みます。すると全てがA列に読み込まれるはずです。(テキストファイルウィザード経由です) 次に何文字か置換します。置換ウィザードはCtrl+Hで起動します。 「─」 → 「\」(置換後の文字に半角¥を指定) 「│」 → 「ブランク」(置換後の文字に何も入れずに置換) 「├」 → 「ブランク」 「└」 → 「ブランク」 「半角スペース」→「ブランク」 ここまでの操作でA列にファイル名がきれいに入ります。頭に「¥」が着いているのは子フォルダです。 B1に以下の式を入れて下方向にコピーすると、結果が2以上の項目が重複している項目ということになります。 =COUNTIF(A:A,A1)

HGK
質問者

お礼

ありがとうございました。