概要
実現方法・説明
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時間で終わったりするようになるかもしれません。
ぜひ、いろいろ試してみてください。