概要
実現方法・説明
Excel文書ファイルに含まれる複数シートを順次読み出して処理したい場合があると思います。
例えば、各月の売上を1シートずつ記入している場合は、年で集計したいとき、各シートの月間データを参照して合算したいですよね。
そんなときのやり方を簡単な例を使って説明します。
Excelのブックとシートの関係
まず、ブックとシートの関係を理解しましょう。
Excelは、オブジェクトの集まりです。
オブジェクトの集まりとか言われると
ぞっとしてしまう人たちがいるかもしれないけれど
難しく考えなくて大丈夫です。
オブジェクトという言葉はパーツに置き換えて理解するといいです。
言い換えれば、Excelはパーツの集まり、ということですね。
パーツの集まりとしてイメージ出来るようになると
簡単に処理を考えることが出来るようになります。
今回はブックとシートの関係を理解すると
ブックに含まれるシートの処理が理解しやすいです。
Excelの文書ファイルは、ブックです。
そしてご存じの通り、ブックの中には、シートがあります。
ひとつのブックにシートは複数持つことが出来ます。
こんな感じ(ブックにシートが3つあるときのイメージ)

BOOK:ブックオブジェクト
Sheet1~3:シートオブジェクト
さらに、シートの中にはセルがありますね
ひとつのシートにセルは複数持つことが出来ます。
ブックとシートを操作するVBAの例
このようにExcelはオブジェクトの集まりで出来ています。
そしてVBAで何かするときは、オブジェクトに対して何かする、ということになります。
例えば、ブックに含まれているシートの名前をすべて表示する処理は以下のようになります。
(ブックはあらかじめ開いている前提の処理です。)
Sub sample()
'bはブックオブジェクト型
Dim b As Workbook
'sはシートオブジェクト型
Dim s As Worksheet
'bにブックオブジェクトの実体をセット
Set b = Workbooks("samplebook01.xlsm")
'bに含まれるシートオブジェクトを
'ひとつずつ取り出してsにセットし順次処理
For Each s In b.Worksheets
'シートの名前をデバッグコンソールに表示
Debug.Print s.Name
Next
End
End Sub
使用例
Excel文書ファイルに含まれるシートを順次参照しながら処理をする例で説明します。
例で使用するExcel文書ファイル
以下のExcel文書ファイルを例(入力)として使用します。
・文書ファイル名:samplebook01.xlsm
・5つのシートで構成
(シート名:2020-01~2020-05)
・シートの内容:全シート共通、年月毎の金額を保持
(年月セル:B1 金額セル:B2)
例で作成するプログラムの仕様
・Excel文書ファイルに含まれるすべてのシートについて年月と金額を表示
・表示した金額の合算を表示
・処理終了後、終了のメッセージボックスを表示
具体的なExcel文書ファイルの内容
シート名:2020-01

シート名:2020-02

シート名:2020-03

シート名:2020-04

シート名:2020-05

サンプルプログラム
Sub sample()
'bはブックオブジェクト型
Dim b As Workbook
'sはシートオブジェクト型
Dim s As Worksheet
'bにブックオブジェクトの実体をセット
Set b = Workbooks("samplebook01.xlsm")
'シート毎の年月と金額
Dim ym As String
Dim amount As Currency
'金額合計
Dim total As Currency
total = 0
'bに含まれるシートオブジェクトを
'ひとつずつ取り出してsにセットし順次処理
For Each s In b.Worksheets
'シート毎の処理
'年月の取得
ym = s.Cells(1, 2)
'金額の取得
amount = Val(s.Cells(2, 2))
'金額合計
total = total + amount
'シート内容の表示(年月と金額)
Debug.Print ym, Format(amount, "###,###,###")
Next
'金額合計の表示
Debug.Print "合計", Format(total, "###,###,###")
MsgBox "おわり"
End
End Sub
実行結果

コード説明
全体的な説明は、コード中のコメントを参照ください。
今回のテーマである「ブックとシートの関係」で大切な部分は
・9行めでブックオブジェクトを取得して設定
・21行めでブックに含まれるシートを一つずつ取り出して繰り返し処理
をしているところになります。
今回の例ですと、23行~32行めまでがシート単位の処理になります。
業務でコードを書く場合、この部分はサブ化した方がいいと思います。
補足
VBAでフォルダ内に保存された複数のExcel文書ファイルを開いて中のシートを自由自在に取り回し出来るようになると、様々な事務処理を自動化することが出来ます。
人手で何日もかかっていたことが1時間で終わったりするようになるかもしれません。
ぜひ、いろいろ試してみてください。
