セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)
数式の参照範囲を可変対応させます。
つまり、入力データにより自動で拡張・縮小されるように関数を設定します。
集計範囲は固定になっているため、データの追加時に計算範囲が違ってきてしまう事になります。。
数式が参照しているセル範囲の直ぐ下にデータを追加した場合は、セルの参照範囲は広がってくれません。
これは非常に都合が悪いです。
入っている数式を意識しなければ、データの追加もままならないという事になってしまいます。
セルの参照範囲を可変にする為に使用する関数は、
これらを組み合わせることで、セルの参照範囲を可変にする事ができます。
以下の解説は、上記の関数についてある程度理解していることを前提にしていますのでね
これらの関数が良く分からない場合は、まずは上記のページをお読みください。
また、
こちらも参考にして下さい。
説明で使用するエクセル表

E3、E4には、日付の、入力規則のリストを設定
E5には、指定期間の売上合計
OFFSET関数
行数
列数
高さ
幅
MATCH関数
検査範囲
検索の型
1を指定すると、検査値以下の最大の値が検索されます。
0を指定すると、検査値に一致する値のみが検索の対象となります。
-1を指定すると、検査値以上の最小の値が検索されます。
省略すると1を指定したものと見なされます。
COUNTA関数
COUNTA 関数では、エラー値や空の文字列 ("") を含め、すべての種類のデータを含むセルが計算の対象となります。
値2, ...
セルの参照範囲を可変にする数式の解説
全合計(E3)
開始日(E4)
終了日(E5)
期間合計(E5)
それぞれの設定方法について、以下で順に説明します。
全合計(E3)の数式
=SUM(B:B)
これでもちろん良いのですが、
今回セル範囲を可変にする方法の解説として、
データ範囲だけをSUMするようにしてみました。
$B$2,0,0
B2から、下に0、右に0移動、
つまり、B2になります。
A列にあるデータの個数です。
1行目が見出しになっていますので、1引いています。
上の図では、11になります。
従って11-1=10が、OFFSETの高さになります。
B列でもよいです、ここでは日付を基準にしているだけです。
つまり、
B2から、高さ10、幅1のセル範囲になります。
つまり、
B2~B11になります。
結局は、
=SUM(B2:B11)
となるわけです。
データの追加・削除に自動で対応されるようになります。
開始日(E4)と終了日(E5)に名前定義とリストを設定
日付の範囲に名前定義を作成
Ctrl+F3で名前定義を起動し、新規作成。
- 「名前」に「日付」と入力。
- 2007以降の場合、範囲は「ブック」、2003にはありません。
- 「参照範囲」に「=OFFSET($A$2,0,0,COUNTA($A:$A)-1,1)」
- OK」
=OFFSET($A$2,0,0,COUNTA($A:$A)-1,1)
A2からデータ個数分のセル範囲を決定しています。
E4とE5にリストを設定
- E4、E5セルを選択
- [データ]-[入力規則]
- [設定]の[入力値の種類]で[リスト]を選択
- [元の値] に「日付」と入力。F3を押すと名前定義の一覧から選択できます。
- 「OK」
期間合計(E5)の数式
この一番外側のOFFSETは、
B2のセルを、開始日までずらし、終了日までの高さのセル範囲を求めています。
作る時は、以下のように順番に作成します。
=SUM(B4:B8)
このB4:B8を可変にすれば良いわけです。
B4:B8のセル範囲は適当で良いです、この範囲を可変にするのですから。
↓
=SUM(OFFSET(B2,2,0,5,1))
引数は、とりあえず定数で入れてみます。
計算結果を見て、正しいことを確認しておきます。
↓
=SUM(OFFSET(B2,MATCH(E3,A2:A11,0)-1,0,5,1))
つねに、計算結果を見て、正しいことを確認します。
↓
=SUM(OFFSET(B2,MATCH(E3,A2:A11,0)-1,0,
MATCH(E4,A2:A11,0)-MATCH(E3,A2:A11,0)+1,1))
5=終了日の位置-終了日の位置+1
MATCH(E4,A2:A11,0)-MATCH(E3,A2:A11,0)+1,1))
↓
=SUM(OFFSET(B2,MATCH(E3,日付,0)-1,0,
MATCH(E4,日付,0)-MATCH(E3,日付,0)+1,1))
日付の可変範囲の数式は、
OFFSET(A2,0,0,COUNTA(A:A)-1,1)
ですが、これは、
日付の範囲に名前定義を作成
ここで、「日付」と名前定義してあります。
つまり、A2:A11を日付に置き換えてやれば良いという事になります。
数式を見やすくするために、絶対参照である$を省略しています。
絶対参照は、最初から入れられれば良いですが、
$をいれると、どうしても数式が見づらくなるので後回しにしても良いでしょう。
数式が完成した後に、まとめて$を入れても良いでしょう。
短く易しい数式で
関数のネスト(入れ子)が多いだけで、一つ一つの関数は難しいものではありません。
エクセルを使う一人一人にとって必要な関数は、そんなに多くないはずです。
必要なことは、その関数をいかに組み合わせるかにかかっています。
整理して、順序よく、考えれば、難しいく見える数式も作成できるようになります。
本来は、難しい数式を作らなくても良いようにシートを工夫するべきことです。
同じことを行っているのなら、なるべく短く易しい数式の方が良いはずです。
その為には、
作業列を使って数式を細かい単位で完成させる等の工夫をしてください。
同じテーマ「エクセル関数応用」の記事
VLOOKUPを他の関数でやる方法
誕生日一覧から、指定誕生月の人を全員取り出す
徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)
セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)
グラフのデータ範囲を可変にする
セルの個数を数える関数
【奥義】大量データでの高速VLOOKUP
数値を時刻に変換
関数のネスト方法
ワイルドカードが使える関数
グラフで特定の横軸の色を変更し基準線を引く
新着記事NEW ・・・新着記事一覧を見る
セル値でパス・ブック・シート名を指定|Power Query(M言語)入門(2023-02-07)
別ブックのシートを列可変で取り込む|Power Query(M言語)入門(2023-02-06)
ExcelとVBAの入門解説|エクセルの神髄(2022-12-14)
文字列のプロパティ名でオブジェクトを操作する方法|VBA技術解説(2022-12-14)
数字(1~50)を丸付き数字に変換するVBA|VBA技術解説(2022-11-15)
TEXTAFTER関数(テキストの指定文字列より後ろの部分を返す)|エクセル入門(2022-11-14)
TEXTBEFORE関数(テキストの指定文字列より前の部分を返す)|エクセル入門(2022-11-14)
TEXTSPLIT関数(列と行の区切り記号で文字列を分割)|エクセル入門(2022-11-12)
LAMBDA以降の新関数はVBAで使えるか|VBA技術解説(2022-11-11)
WRAPCOLS関数(1次元配列を指定数の列で折り返す)|エクセル入門(2022-11-08)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.並べ替え(Sort)|VBA入門
8.Excelショートカットキー一覧|Excelリファレンス
9.エクセルVBAでのシート指定方法|VBA技術解説
10.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。