VBA(マクロ)を用いて一括でブックを操作する

スポンサーリンク

今回紹介するVBA(マクロ)の内容

VBA(マクロ)では複数のブック(Excelファイル)に対して繰り返し作業を行うこともできます。
今回紹介するコードは私が初めてネットで調べたコードを加工して作ったもので「一つのフォルダにあるファイルを順に開けて、中にあるシートを一つのファイルにまとめる」という作業をしてくれます。

使用方法

①名前はなんでもよいのでフォルダを作成し、まとめたいファイルをその中に入れておきます。
②後に記すVBAのコードを実行します。
③フォルダの選択画面が立ち上がるので、まとめたいファイルをいれたフォルダの中にあるファイルのうちどれか一つを選択します。
④順番にファイルを開いてシートを新しいファイルにコピーしていくVBAが実行されます。

スポンサーリンク

コードの詳細

作成したコードは以下になります。作成した当時勤めていた会社で商品の売り上げデータを集めていたのですが、一つのファイルに1週間分のデータしか記載されていなかったので、まとめたいという気持ちで作成しました。

Sub 一つのフォルダからシート取り出す()
Workbooks.Add
’新しいブックの追加:コピー先のファイルを作成する
Dim FolderName As String
’文字列を入れる変数として「FolderName」を使う
Dim index As Integer
’数字を入れる変数として「index」を使う
Dim FileName As String
’文字列を入れる変数として「FileName」を使う
FolderName = Application.GetOpenFilename
’ダイアログを用いて選択したファイルのパスをFolderNameとする①
If FolderName = “False” Then
’FolderNameが選択されていなければ作業を終了する
Exit Sub
End If
index = InStrRev(FolderName, “”)
’②FolderNameのうちフォルダを示す部分を取り出す(1)文字数をカウントする
FolderName = Left(FolderName, index)
’③(2)カウントした文字数のところまで抜き出す
FileName = Dir(FolderName & “*”)
’④フォルダの中に入っているファイル全てを順にFileNameに当てはめていく
Do While FileName <> “”
’FileNameがなくなるまで継続する
シートコピー (FileName)
’⑥FileNameのファイルに対して、下に記すVBA「シートコピー」を実行する
FileName = Dir()
’⑤次のファイルに移る
Loop
Worksheets(“sheet1”).Delete
’最初にブックを追加した際に元々あるシートを削除する
End Sub
Private Sub シートコピー(FileName2 As String)
’⑥コードをまたいで渡された変数を受け取る側の変数はFileName2とする
Dim ws As Worksheet
Workbooks.Open FileName2
’FileName2で指定しているファイルを開く
For Each ws In Workbooks(Workbooks.Count).Sheets
’コピー元として開いたファイルの各シートに対して、作業を行う
ws.Copy After:=Workbooks(Workbooks.Count – 1).Worksheets(1)
’⑦コピー元として開いたファイルのシートを最初に開いたコピー先のファイル(VBAの1行目のコードで追加したファイル)の1つ目のシートの後にコピーしていく
Next
Workbooks(Workbooks.Count).Saved = True
’開いたファイルを保存せずに閉じるようにする
Workbooks(Workbooks.Count).Close
’開いたファイルを閉じる
End Sub

VBAコードの解説

①FolderName = Application.GetOpenFilename

ファイルを開くダイアログを表示して、選択したファイルのパス(C:Users○○Desktop○○など、ファイルのある場所を表すもの)を読み込みます。

②index = InStrRev(FolderName, “”)

①で読み込んだファイルの情報から入っているフォルダの情報を取り出すための作業。右から数えて「」が表示されるまでがフォルダの情報になるので、その位置をindexという変数に当てはめています。

③FolderName = Left(FolderName, index)

①で調べたパスの中から、②で調べた一番右の「」までの文字列を抜き出すコードです。抜き出したものをFolderNameに入れることでFolderNameを変更します。

④FileName = Dir(FolderName & “*”)

Dirは指定した条件に当てはまるパスをもつファイル名を答えてくれる関数です。これでFileNameという変数に一つのファイルがセットされます。

⑤FileName = Dir()

繰り返しを指定し、次のファイルをFileNameにセットする際に使うコードです。これで次のファイルがセットされます。

⑥シートコピー (FileName) → Private Sub シートコピー(FileName2 As String)

「Private Sub シートコピー」で記しているコードを実行するコードです。()の中に入っている変数FileNameはそのままその値が、シートコピーの中に記されているFileName2に当てはめられます。

⑦ws.Copy After:=Workbooks(Workbooks.Count – 1).Worksheets(1)

それぞれのシートをコピーして、VBAで作成したコピー先のファイルの1つ目のシートの後に追加するコードです。
Workbooks.Countは開かれているExcelのファイル数を表します。

個人用マクロブックを開く設定にしているかどうかで値が変わります。個人用マクロブックを開く設定にしていると開かれているファイルが一つ多くなるので、4で、開かない設定にしていると3になります。いずれにしても「一番最後に開く」コピー元ファイル(Workbooks(Workbooks.Count))から「その1つ前に開く」コピー先ファイル(Workbooks(Workbooks.Count – 1))にコピーをするので、以上のような記載をしておくと便利だと思います。

⑧.Saved = True

確認メッセージを表示せずに変更しないファイルを閉じるときに使うコードです。「.Save(保存する)」とは意味が全然違います。

VBA(マクロ)記載ファイルの投稿

このコードは少し複雑で理解するのに時間がかかりましたが、色んなケースで使える便利なコードなので、紹介したくて記載しました。VBA(マクロ)を含むファイルなので、不安を感じる方はダウンロードを控えていただく方が良いですが、「そもそもどこにコードを書けばよいかわからない」という方のためにサンプルファイルアップしておきます。

ファイルを開いて、表示されるボタンを押せばVBA(マクロ)が実行されます。
(セキュリティの設定をされていない方は設定をお願いします。)

複数のファイルのシートを一つのファイルに集めるマクロ

おすすめ書籍 (広告)

コメント