Excelで複数のブックやシートをひとつにまとめたいことって、時々ありますよね?
そこで今回は「複数のエクセルファイルを1つのブックにまとめる方法(シート別)」をExcelマクロで解説していきたいと思います。
本記事でわかること
1.複数のエクセルファイルを1つのブックにまとめる(シート別)マクロの使い方
2.複数のエクセルファイルを1つのブックにまとめる(シート別)マクロの作り方
本記事で紹介するマクロを使うと、以下図のように複数のエクセルファイルを1つのブックにまとめる方法(シート別)ことができます。
■Before
複数点在しているExcelブックを・・・
■After
1つのブックにまとめられる!
目次
複数のエクセルファイルを1つのブックにまとめる(シート別)マクロの導入手順
ではさっそく、「複数のエクセルファイルを1つのブックにまとめるマクロの導入手順」をご紹介していきます。
いくつかの手順に分けてご紹介しますので、ひとつひとつ順番に実践してみてくださいね。
複数のエクセルを1つにまとめるマクロの導入手順
1.エクセルファイルを用意する
2.コードを「標準モジュール」に貼り付ける
3.実行ボタンを設置
手順①:エクセルファイルを用意する
まずはマクロを実行するためのエクセルファイルを用意しましょう。
1.「ファイル」タブを選択
2.「名前を付けて保存」を選択
3.保存したいフォルダを選択し、ダイアログを開く
4.「ファイルの種類」⇒「Excel マクロ有効ブック(*.xlsm)」⇒「保存」
5.タブエリアで右クリック ⇒ 「リボンのユーザー設定」を選択
6.「開発」にチェックをいれる ⇒ OK
7.タブエリアに「開発」が入っていることを確認しましょう!
以上で、エクセルマクロを実行するためのファイルを準備できました。
次はいよいよ、コードを挿入していきますよ!
といっても難しくないので、ひとつひとつやっていきましょう。
手順②:コードを「標準モジュール」に貼り付ける
1.「開発」タブ ⇒ 「Visual Basic」を選択し、VBE(Visual Basic Editor)を起動する
※ Alt + F11 でも起動できます。
起動すると、以下のような真っ白な画面が出てきます!
2.「挿入」タブ ⇒ 「標準モジュール」を選択し、標準モジュールを挿入する
「Module 1」が追加されたことを確認しましょう。
3.下記コードをすべてコピーする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Public Sub 複数ブックまとめる() Dim arrFileName As Variant 'ダイアログで選択した複数のブック名を配列で取得する 'GetOpenFilenameメソッドで、MultiSelect:=Trueとすると、ブックを複数選択できる。 arrFileName = Application.GetOpenFilename("Excelブック,*.xls?", MultiSelect:=True) 'ファイルを選択しなかった場合、処理を終了する If TypeName(arrFileName) = "Boolean" Then: Exit Sub Dim v As Variant '配列の各要素を格納する変数 Dim Flag As Boolean '最初に開いたブックか判定する変数 Dim wbTo As Workbook '2回目以降に開いたブックの参照用変数 Dim wbFrm As Workbook '最初に開いたブックの参照用変数 'GetOpenFilenameメソッドで取得した各ブックのフルパスの数だけループ For Each v In arrFileName Workbooks.Open Filename:=v 'Excelをひらく If Flag Then '最初に開いたブックは処理しない Set wbTo = ActiveWorkbook 'Moveメソッドで、2回目以降に開いたブックのすべてのシートを、最初に開いたブックのシート末尾に移動する wbTo.Worksheets.Move After:=wbFrm.Worksheets(wbFrm.Worksheets.Count) Else '最初に開いたブックの参照を割り当てる Set wbFrm = ActiveWorkbook End If Flag = True Next v End Sub |
4.VBEの右のウィンドウに貼り付ける ⇒ 上書き保存
以上で、コードの貼り付けが完了しました!
これで8割方終わったといってもいいでしょう。
ですが、最後の手順までもう少しお付き合いください。
手順③:実行ボタンを設置
最後のひと手間を加えて、実行しやすい環境を整えていきましょう。
1.「開発」タブ ⇒ 「挿入」 ⇒ 「ボタン(フォームコントロール)」
画面の適当なところでクリックしてみると・・・
「マクロの登録」というウィンドウが開きます。
2.「複数ブックまとめる」 ⇒ 「OK」
ボタンにマクロの実行名を紐づける、といったことを行います。
お疲れさまでした!
このようなボタンが画面上に挿入されたら、完成です!(ボタンに表示されているテキストは、自由に変えても大丈夫です)
では次に「複数のエクセルファイルを1つのブックにまとめる(シート別)マクロの使い方」について解説していきます。
複数のエクセルファイルを1つのブックにまとめる(シート別)マクロの使い方
さて、ここまでは「複数のエクセルファイルを1つのブックにまとめる(シート別)マクロの導入手順」を解説しました。
ここからは実際の使い方をご説明してきます。
使い方はとてもシンプルですので、安心してくださいね!
フォームボタンを押して、ダイアログを開く
さきほど作成したExcelマクロファイルを開いた状態からスタートしましょう。
「ボタン1」を押しダイアログを開いてみましょう。
ボタンを押すと、上図のようなダイアログが開かれます。
複数のエクセルをひとつにまとめるため、エクセルが保存されている該当のフォルダに移動しましょう。
ダイアログから、複数のExcelブックを選択する
ダイアログから選択する方法はいくつかあります。
以下の4つから試してみてくださいね。
複数のエクセルを選択するための4つの方法
■選択方法①:マウスドラッグで選択
■選択方法②:「左クリック」+「ctrl」で、エクセルを部分的に選択
■選択方法③:「左クリック」+「Shift」で、エクセルをまとめて選択
■選択方法④:「ctrl」+「A」で、すべてのエクセルを選択
以上が「複数のエクセルファイルを1つのブックにまとめるマクロ」の使い方になります。
ですが、1つのエクセルファイル内に大量の複数シートが挿入されることによって、シート間の移動がめんどくさくなりませんか?
たとえばシート数が100個くらいになると、そもそもどういった名前のシートが挿入されているのか把握しづらいし管理が大変になりますよね…。
1枚のシートに全シート分の目次などが一覧化されると便利なんですが…。
ということで、Excelで目次を自動生成する方法をマクロで解説しました。
こちらも実行ボタン一つだけで、ハイパーリンク付き目次を一括作成することができます!
これによって、複数シート間の移動がめちゃくちゃ楽になり、あなたの業務効率化をさらに加速させることが可能です。
>>Excelで目次を自動生成する方法は?ページ番号の振り方も解説!
複数のエクセルファイルを1つのブックにまとめる(シート別)マクロの解説!
さきほどは、Excelで複数のブックやシートをまとめるマクロの使い方をご紹介しました。
ここからは「マクロの使い方は分かったけど、マクロの解説もしてほしい!!」という方に向けて、コードの解説をしていきたいと思います。
といってもコード量も少ないですし、難しくはありません。
実は、たった2つのポイントを押さえるだけで、簡単に作成できるんですよ!
「Excelで複数ブックやシートをまとめるマクロ」の2つのポイント
1.Application.GetOpenFilenameメソッドで、MultiSelect:=Trueにする
2.WorkSheets.Moveメソッドを使う
以上2つになります。
ということで、各ポイントを解説していきますね。
ポイント①:Application.GetOpenFilenameで、MultiSelect:=Trueにする
ポイント①となる部分は、2行目の以下コードです。
以上のように記述すると、ダイアログから複数のブックを選択できるようになります。
こちらのコードについて、ひとつひとつ説明していきます。
■選択方法の指定
Application.GetOpenFilenameメソッドには、ブックを「ひとつだけ選択」または「複数選択」するか指定することができます。
具体的には、
- ひとつだけ選択 ・・・ 記述を省略、またはMultiSelect:=FalseとすればOK
- 複数選択 ・・・ MultiSelect:=TrueとすればOK
「True」か「False」にするだけですから、とてもシンプルですよね。
■変数の型
ただし、ダイアログで選択した複数ブックのパスを格納する「arrFileName」という変数は、「Variant」型としておく必要があります。
なぜかといいますと、Application.GetOpenFilenameメソッドで、複数ブックを選択した場合の戻り値は、「配列(Variant)」となるからですね。
■オブジェクトブラウザー
ちなみにオブジェクトブラウザーを確認すると、戻り値の部分に「(~~) as Variant」にはなっていません。
ですから、戻り値の型が分かりづらいんですよね。
その後、For Each In ~ Nextで、取得したブックのパス(配列)を1個ずつ処理していきます。
変数「Flag」にて、「1回目に開いたブック」、「2回目以降に開いたブック」かを判定する処理を入れています。
ポイント②:WorkSheets.Moveメソッドを使う
ポイント②となるのは、17行目の以下コードです。
以上のように記述してみましょう。
■ポイント②のコードを端的に説明すると
端的に表現するなら、
「2回目以降に開いたブックを、1回目に開いたブックに移動する」
ということになります。
■Worksheets.Moveメソッド
コード左側の、Worksheets.Moveメソッドは、「Worksheets(全シート).Move(移動する)」という風に読み替えて理解すればOKです。
そして今回のコードの意図としては、「2回目以降に開いたブックを1回目に開いたブックに移動する」ですよね。
ということはまず、「wbTo.Worksheets.Move」と書き込んでみましょう。
日本語で言い換えれば、「wbTo(2回目以降のブックの).worksheets(全シート).Move(移動する)」という意味になりますね。
■名前付き引数の指定
そして、名前つき引数※にて「Before」「After」のどちらに移動するかを指定しましょう。
※名前付き引数は、コロンイコールで記述します。(:=)
今回は、Afterとしてみましょう。
Afterの後に記述されているのは、「どこのブックの、どこのシートの前後に移動するか」というものになります。
つまり、
- どこのブック・・・wbFrm【1回目に開いたブックの】
- どこのシート・・・Worksheets(wbFrm.Worksheets.Count)【wbFrmの末尾のシートの】
と、言い換えることができます。
■シートの末尾の設定方法
ここでポイントになるのが、Worksheets(wbFrm.Worksheets.Count)としているところです。
つまり、2回目以降に開いたブックを、1回目に開いたブックへ移動すると、1回目に開いたブックのシート数が更新されてしまいますよね。
それを「Worksheetsコレクション.Countプロパティ」にて、1回目に開いたブックの現在の全シート数を毎回取得することで、末尾を指定することができます。
ご質問への回答
ここからは、頂いたご質問へ回答をさせていただきます!
情報のご共有ありがとうございます!
毎週、毎月このような業務を行っているので、とても時間短縮になりました。追加で、もしできたらいいなぁ、と思う事なのですが、
結合前のブック名を、そのままシート名に名づけることはできないでしょうか?日時:2022年10月4日
ご質問:しょー 様より
ご質問、ありがとうございます。
さっそく作成してみましたので、以下コードをそのままコピーして差し替えて実行してみてください!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
Public Sub 複数ブックまとめる() Dim arrFileName As Variant 'ダイアログで選択した複数のブック名を配列で取得する 'GetOpenFilenameメソッドで、MultiSelect:=Trueとすると、ブックを複数選択できる。 arrFileName = Application.GetOpenFilename("Excelブック,*.xls?", MultiSelect:=True) Dim v As Variant '配列の各要素を格納する変数 Dim Flag As Boolean '最初に開いたブックか判定する変数 Dim wbTo As Workbook '2回目以降に開いたブックの参照用変数 Dim strSheetName As String '2回目以降に開いたブック名を格納する変数 Dim wbFrm As Workbook '最初に開いたブックの参照用変数 Dim ws As Worksheet '2回目以降に開いたブックの複数シート名を設定するためのForEach用変数 Dim cSheetsCount As Long: cSheetsCount = 1 '2回目以降に開いたブックの複数シート名のインクリメント変数 'GetOpenFilenameメソッドで取得した各ブックのフルパスの数だけループ For Each v In arrFileName Workbooks.Open Filename:=v 'Excelをひらく If Flag Then '最初に開いたブックは処理しない Set wbTo = ActiveWorkbook '2回目以降に開いたブック名を変数に格納する strSheetName = Left(wbTo.Name, InStr(wbTo.Name, ".xls") - 1) If wbTo.Worksheets.Count > 1 Then For Each ws In wbTo.Worksheets ws.Name = strSheetName & cSheetsCount cSheetsCount = cSheetsCount + 1 Next ws Else ActiveSheet.Name = strSheetName End If 'Moveメソッドで、2回目以降に開いたブックのすべてのシートを、最初に開いたブックのシート末尾に移動する wbTo.Worksheets.Move After:=wbFrm.Worksheets(wbFrm.Worksheets.Count) Else '最初に開いたブックの参照を割り当てる Set wbFrm = ActiveWorkbook End If Flag = True Next v End Sub |
こちらのコードに差し替えて、再度実行いただくと、以下のような感じになります。
■結合前(例)
ブック1:a.xlsx ⇒ シート1:Sheet1
ブック2:b.xlsx ⇒ シート1:Sheet1 シート2:Sheet2
ブック3:c.xlsx ⇒ シート1:Sheet1
ブック4:d.xlsx ⇒ シート1:Sheet1
上記ブックやシートがあったとして、こちらを結合すると・・・
■結合後(例)
ブック1:a.xlsx
⇒ シート1:Sheet1 シート2:b1 シート3:b2 シート4:c シート5:d
以上の通り、2回目以降に開いたブック名をそのままシート名に設定できます。
ただし、「.xlsx」や「.xls」といった拡張子はおそらく不要かな?と思いましたので、省いています。
また、2回目以降に開いたブックに、複数シート存在(例のb.xlsxです)している場合を想定して、結合したシート名に「b1」や「b2」のように、「ブック名+シートカウント数」を付与しております。
なぜかというと、Excelは一つのブックに同じシート名が存在してはいけないルールがあるため、このような処理としてみました!
________________________________
ご質問への回答は以上ですが、このほかにも作ってほしいマクロ・解説してほしいマクロなどがありましたら、ぜひコメント欄へどうぞ!
筆者はExcelVBA(マクロ)だけで2000時間ほどの業務効率化を達成した実績がありますので、大体なんでも作成できたりします。
お気軽にお問い合わせくださいませ!^^
複数のエクセルファイルを1つのブックにまとめる(シート別)マクロのまとめ
今回は「複数のエクセルファイルを1つのブックにまとめる(シート別)マクロ」について解説しました。
今回のマクロでだいぶ業務効率化できると思うのですが…。
しかし、複数のエクセルファイルを1つのブックにまとめることによって、シート枚数が半端じゃない数になり、管理が大変になるといったデメリットもあるんですよね。
そこで、Excelで目次を自動生成する方法を解説していますので、こちらもマクロを使って解決しちゃいましょう。
>>Excelで目次を自動生成する方法は?ページ番号の振り方も解説!
今後もVBAに関するお役立ち情報を紹介していきたいと思いますので、お楽しみに!
今回は以上になります。最後までご覧いただきありがとうございました。