【VBA】マクロファイルが置かれているディレクトリにある全xlsxファイルから、任意のシートをコピーしたい
■作る機能
このマクロファイルが置かれているディレクトリに置かれているファイル(この膜rファイル自身は含まない)から、指定のシート名のシートをコピーしてくる。
■作るための方法
ループの方法
特定のフォルダにあるファイル数分処理をしたいので、ループ処理が必要。VBAのループはわからないので調べてみたところ、以下4つくらい方法がありそう。
使い分けとしては、すごく端折ると、簡単なループはシンプルにForで良いらしい(それかDo Loop)。今回のように、フォルダ内のファイル分だけ処理を繰り返すものは、Do While。ただそれも、Do Loopでも実装は可能ということ。
ちなみに最初、Do Whileでやってみたが、ファイル名がnullのファイルを開こうとしてしまうエラー(後述)にぶち当たったので、Do Loopに変更。Do Whileはまだ早かったようだ・・ほかにもやりたいことがあるので、一旦Do Loopで実装が出来れば今回はよしとした。
- Do While
- Do Until
- Do Loop
- For
■完成コード
Sub SheetCopyVer4()
Dim macroWb As Workbook
Dim importWb As Workbook
Dim importPath As String
Dim SheetName As String
Dim buf As String
Set macroWb = ThisWorkbook
SheetName = Range("A2").Value
importPath = ThisWorkbook.Path
buf = Dir(importPath & "\*")
Do
If ThisWorkbook.Name <> buf Then
End If
buf = Dir()
If buf = "" Then Exit Do
MsgBox buf
Set importWb = Workbooks.Open(importPath & "\" & buf)
importWb.Worksheets(SheetName).Copy After:=macroWb.Worksheets("Sheet0")
importWb.Close
Loop
End Sub
■つまずいた箇所
ファイル名 = ””の時は処理を抜けるように書いたつもりなのに抜けられておらず、ファイル名が””のファイルを開こうとして落ちてしまう。
■原因
Exitの位置。
正:
Do
If buf = "" Then Exit Do
MsgBox buf
Set importWb = Workbooks.Open(importPath & "\" & buf)
importWb.Worksheets(SheetName).Copy After:=macroWb.Worksheets("Sheet0")
importWb.Closebuf = Dir()
Loop
End Sub
誤:これだと、ファイル名(bufが空白の場合も、Workbooks.Open処理を走らせてしまいエラーになる)
Do
MsgBox buf
Set importWb = Workbooks.Open(importPath & "\" & buf)
importWb.Worksheets(SheetName).Copy After:=macroWb.Worksheets("Sheet0")
importWb.Close
buf = Dir()If buf = "" Then Exit Do
Loop
End Sub
品質保証は未実施・・バグはあるかもだが、力尽きたので今日はここまで。