• ベストアンサー

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

お世話になります。 あるフォルダの中に、たくさんフォルダが入っています。 子フォルダのファイルを全て親フォルダに移すのですが、同名ファイルがある可能性があります。 同名ファイルは枝番をつけるなどして処理するのですが、あらかじめ同名ファイルがあるかどうかを調べたいのです。 親フォルダの中にエクセルを入れておき、マクロの実行の結果、エクセルのシートに同名ファイルの情報を表示できればと思っています。 例)もし同名ファイルがあった場合、 まずセル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です。 よろしくお願いします。

  • HGK
  • お礼率69% (138/199)

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

  • ベストアンサー
  • 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
質問者

お礼

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

関連するQ&A

  • EXCELで同名のファイルを開く

    無理かもしれないのですが、質問します。 *Excelでメニューということで、シート上にボタンを5個つけて、クリックするとそれぞれExcelファイルを開くようにしています。(メニューのファイル名はMainmenu.xls) *そしてそのメニューを終了するときに、そのメニューとメニューから開くExcelファイルたちを同ディレクトリ内にBackupというフォルダを作成してすべてコピーするようにマクロを組んでいます。 ここで質問なのですが、メニューからBackupフォルダ内にコピーしたメニュー(Mainmenu.xls)を開くことはできるでしょうか。やはり、ファイル名が同名なので無理でしょうか。できれば別にExcelを起動させて開ければいいな、と思うのですが。何かテクニックはないでしょうか。。。。 よろしくお願いします。

  • マクロ VBA ファイル名を連番でつけたいのですが

    マクロ初心者なので教えて頂けるとうれしいです。 保存先フォルダにファイル名を自動で名前をつけて保存させるところまでできたのですが、 保存先フォルダに同名フォルダがある場合に、 もともと指定しているファイル名のお尻に連番をつけていくようにしたいのですが・・・ 例) 選択したシートをコピーして、 「A1+B1+見積書.xls」 という名前をつけて毎回保存していくのですが、 同名のファイルがある場合、 「A1+B1+見積書+1.xls」 「A1+B1+見積書+2.xls」 「A1+B1+見積書+3.xls」    …というふうにお尻に自動で連番をつけて 保存できるようにしたいのです。 宜しくお願い致します!

  • エクセルマクロ 次のようなプログラム教えてください

    エクセルのマクロで、次のようなことをしたいと思っていますが、 素人でわかりません。 教えていただけますか。 ---------------------------------- o動かしているファイルをa.xlsとします。  a.xlsは、3行目からA列に名前、B列~D列にデータが入っていて、  各行ごとのファイルを作りたい。(行数は決まっていない)  なお、セルE1にある文字が入っている。 o各ファイルは、原紙としてgensi.xlsとして保存されているファイルに、  a.xlsのB~D列のものを入力したものを作りたい。  (B~D列のデータは、gensi.xlsのそれぞれセルC7・C8・C9に入力する)   gensi.xlsは、a.xlsと同じフォルダにあります。 o作成場所は、「C:\date」の中に、セルE1にある文字のフォルダ、A列に  ある名前のフォルダに作りたい。 (セルE1の文字のフォルダは、マクロを初めて実施するときは無いと思います  が、2回目からは存在すると思います。A列の名前のフォルダはマクロ実施時  にはありません。作成するファイル名は、A列の名前と同じ(フォルダ名と同じ).xls にします。) o実行ボタンを3つ作って、1つは今選択されている行のフォルダ・ファイルを作る。  2つ目は数字を入力させて、今選択されている行から入力した数字の行までを一括  で作成する。  3つ目は、3行目から現在入力されている行すべてを一括で作成する。 ------------------------------- 上記のことをしたいと思っています。 よろしくお願いします。 駄文ですみません。 なお、エクセルは古いバージョンでエクセル2000です。

  • エクセルでのファイル名の一括変更 マクロ

    皆様お世話になります。 あるフォルダーの下位にユニークに名前の付けられた900個ほどのフォルダーがあり それれぞれの、フォルダーの中にA,Bというフォルダーがあります。 その中にa.xls,b.xlsなどというファイルが存在しています。 そのa.xlsやb,xlsの名称を変換したいのですが数量が非常に多いためマクロか、何かで変更する方法がありますか? ファイル名の条件として 開いたエクセルのC,4とH,4を合体させたファイル名にすると、非常にありがたいのですが。 よろしくお願いします。

  • エクセル2000マクロ検索方法

    Aのファイル a.xls シート名 aaa Bのファイル b.xls シート名 bbb Aのファイルに下記のデータベースがあります。   A列 B列   0001 100   0002 200   0004 300 Bのファイルに下記のデータベースがあります。   A列 B列   0001 300   0002 200    抽出条件方法 AのファイルとBのファイルのA列を参照して違うものだけを、Aのファイルから 別のファイルに取り出す方法をマクロでの記述方法を教えてください。 別のファイルに取り出すデータは、下記の通リです。   A列 B列   0004 300 以上よろしくお願いします。

  • 同じフォルダ内にあるファイルを開くマクロ

    いつもお世話になります。 EXCEl2000で、フォルダ内に2コのエクセルファイル「A.xls」「B.xls」があり、「A.xls」でマクロを実行する際に、「B.xls」を開きたいのですが、ファイルのパスを設定すると、フォルダを別の場所に動かしたり、別のパソコンにコピーすると開けなくなります。 「同じフォルダの中にある「B.xls」を開く」という命令文の作成は可能でしょうか。

  • エクセルでマッチング

    2つのエクセルファイルの内容をマッチングさせたいんですけど、 例えば、aaa.xlsとbbb.xlsというのがあって、 aaa.xlsのA列とbbb.xlsのA列にファイル名、 bbb.xlsのB列にパッケージ名が格納されていて、 aaa.xlsのA列の1行目から順に、bbb.xlsのA列と 同じファイル名が存在するかマッチングさせていき、 マッチした場合にマッチした行のパッケージ名を aaa.xlsのB列に表示させたいんですけど、 関数なりマクロなりを使ってなんとかならないでしょうか?

  • エクセル マクロで特定ファイル名だけを開く

    エクセルのマクロで 特定のファイル名だけをフォルダの中から探して 開くというものを作りたいのですが うまくできません。 フォルダを指定して 「060927.xls」というエクセルファイルだけを 開きたいのですが この日付のところが毎日変わるので 「06XXXX.xls」というような 最初が06であと4つの文字が入ってるファイル名だけを 流動的に指定できるようにするには どのようなVBAマクロにすればよいのでしょうか? とても困っています。 是非教えてください!宜しくお願いします。

  • Excelマクロについて教えてください。

    Excelマクロについて教えてください。 フォルダ内にある全てのファイルのA列にAを追加したいのですが、 下記だとA1にAを上書きしてしまいます。 book.Sheets(1).Range("A1") = "A" '最初のシートのA1に"A"を フォルダ内のファイルのA列に値がある場合、Aを追加する場合のマクロを教えてください。 例) test.xls A列 →A列 12345 →A12345 55555 →A55555 Sub sample() Dim dataFolder As String Dim file As String Dim book As Workbook Dim fileName As String Dim fileExt As String dataFolder = "C:\test\" 'excelがあるフォルダ file = Dir(dataFolder & "*.xls") '最初のexcelファイル名 Do While file <> "" 'ファイル名がある間 '内容変更 Set book = Workbooks.Open(dataFolder & file) 'ブックを開く book.Sheets(1).Range("A1") = "A" '最初のシートのA1に"A"を book.Close True '上書きして閉じる file = Dir '次のファイル名 Loop '繰り返す End Sub 教えてください。

  • エクセルマクロによるハイパーリンクの方法

    はじめて投稿します。 エクセルマクロを始めたばかりですが、よろしくお願いします。 Fileフォルダ内にマクロ.xlsとdataフォルダがあり、 dataフォルダ内には複数のPDFファイルがあります。 マクロ.xlsのセルA1~A10に適当な英数字の文字列(例えばA123,B243,C072…など)が書かれていて dataフォルダ内にはセルA1~A10に書かれている文字列に少し文字が追加された名前のPDFファイル (例えばセルの文字列が"A123"なら"A123(OK).pdf")があります。 これをマクロを使ってA1~A10の文字列にハイパーリンクさせて、 セルに書かれている文字列をクリックして開きたいのですがどうすればよいでしょうか? A1~A10に書かれている文字列を変数cellnameに代入し、 PDFファイルをcellnameにワイルドカードを使って変数pdfnameに代入できずにつまずいています…。 どなたかご解答の程宜しくお願いいたします。

専門家に質問してみよう