なぜINDIRECT関数が必要なのか?
実務において、月別や担当者別にシートが分かれたブックを扱うことは多いはずです。各シートのデータを集計表にまとめたいとき、単純なSUMIF関数だけでは、シートを切り替えるたびに数式を書き直す必要があり、非常に非効率です。
そこで役立つのがINDIRECT関数です。「文字列をセル参照に変換する」というこの関数の特性をSUMIF関数と組み合わせることで、シート名を動的に切り替えながら自動集計する仕組みを作ることができます。
基礎知識:INDIRECT関数とは
INDIRECT関数は、引数に指定した文字列を「セル参照」として解釈する関数です。
例えば、セルA1に「Sheet2!B2」という文字列が入力されている場合、INDIRECT(A1)と記述すると、Excelは「Sheet2のB2セルの値」を返します。
今回のケースでは、集計用シートの見出しにある「シート名」を文字列として利用し、SUMIFの範囲指定を柔軟に変更するために活用します。
実装のポイント:範囲を動的に指定する
SUMIF関数(範囲, 検索条件, 合計範囲)の「範囲」および「合計範囲」をINDIRECT関数で囲むことで、数式内でシート名を参照させます。
手順のヒント:
1. シート名が入力されているセル(例:B3)と、範囲となるセルアドレス(例:!C4:C39)を「&」で結合します。
2. その結果をINDIRECT関数の引数にします。
3. 数式をコピーする際、セル番地がずれないよう、列や行を固定する「複合参照($記号)」を適切に活用するのがコツです。
サンプルプログラム(VBAでのアプローチ)
今回は関数での解説でしたが、VBAで同様の処理を組むと、さらに柔軟な運用が可能です。以下は、指定したシート名からSUMIFの結果を取得する簡単な関数例です。
‘ ワークシート関数をVBAから呼び出し、別シートの集計を行う例
Function GetSumBySheet(sheetName As String, criteria As String) As Double
Dim ws As Worksheet
Set ws = Worksheets(sheetName)
‘ Application.WorksheetFunctionを使ってSUMIFを実行
‘ 範囲: C列、条件: criteria、合計範囲: D列 と仮定
GetSumBySheet = Application.WorksheetFunction.SumIf( _
ws.Range(“C4:C39”), criteria, ws.Range(“D4:D39”))
End Function
‘ 使い方: セルに =GetSumBySheet(“Excel”, “東京A”) と入力
応用・注意点:現場で陥りやすいバグの回避策
1. シート名の変更に注意: INDIRECT関数は文字列を参照するため、シート名を変更すると数式が壊れます。シート名が頻繁に変わる場合は、VBAでシートオブジェクトを直接指定する方が安全です。
2. ファイルを開いておく必要がある: INDIRECT関数は、参照先のブックが開かれていないとエラー(#REF!)を返します。複数のブックにまたがる集計には向かない点に注意してください。
3. 複合参照の活用: 数式をコピーして使う際、行($3)や列($A)を固定しないと、結果が正しく計算されません。F4キーを駆使して、どのセルを固定すべきか常に意識しましょう。
これらのテクニックを組み合わせれば、毎月の膨大な集計作業を劇的に減らすことができます。ぜひ、お手元のデータで試してみてください。
