目次
このチュートリアルでは、Excelの世界で最も謎に包まれた存在であるOFFSET関数に光を当てていきます。
Excel の OFFSET とは何でしょうか? 一言で言えば、OFFSET 数式は、開始セルまたはセル範囲から指定された行数および列数だけオフセットされた範囲への参照を返します。
OFFSET関数は少し難しいかもしれませんので、まず技術的な説明を簡単にし(できるだけ簡単にします)、その後、ExcelでOFFSETを使用する最も効率的な方法をいくつか紹介します。
Excel OFFSET関数 - 構文と基本的な使い方
ExcelのOFFSET関数は、指定したセルまたはセル範囲から、指定した行数および列数に相当するセルまたはセル範囲を返します。
OFFSET関数のシンタックスは以下のとおりです。
OFFSET(参照、行、列、[高さ]、[幅])最初の3つの引数は必須で、最後の2つはオプションである。 すべての引数は、他のセルへの参照、または他の数式によって返される結果であることができる。
マイクロソフトは、パラメータ名に何らかの意味を持たせる努力をしたようで、それぞれに何を指定すべきかのヒントを与えてくれています。
必要な引数です。
- 参考 - オフセットの基点となるセルまたは隣接するセル範囲。 始点と考えることもできる。
- 列 - 開始点から上下に移動する行数。 rows が正の数の場合、数式は開始点の基準より下に移動し、負の数の場合、開始点の基準より上に移動する。
- コーンズ - 行と同様に、colも正(開始位置の右側)または負(開始位置の左側)にすることができます。
オプションの引数です。
- 高さ - 返すべき行の数。
- 幅 - 返すべき列の数。
高さ,幅とも常に正の数でなければならない。 どちらかが省略された場合,デフォルトは,高さまたは幅が 参照 .
注意:OFFSETは揮発性の関数であり、ワークシートの動作が遅くなることがあります。 遅さは、再計算されるセルの数に正比例します。
そして次に、最も単純なOFFSETの式を例にして、その理論を説明しましょう。
ExcelのOFFSET式の例
以下は、指定した開始点、行、列に基づいてセル参照を返す、簡単なOFFSET式の例です。
=offset(a1,3,1)
この数式は、セルA1を開始点(参照)として、3行下に移動し(rows引数)、1列左に移動する(cols引数)ことをExcelに指示しています。 その結果、このOFFSET数式はセルB4の値を返します。
左の画像は関数のルート、右のスクリーンショットは実際のデータでOFFSET式を使用する方法を示しています。 2つの式の唯一の違いは、2番目の式(右)のrows引数にセル参照(E1)を含むことです。 しかしセルE1には数字3が入っており、全く同じ数字が最初の式のrows引数に表示されるためです。は,どちらも同じ結果(B4の値)を返す。
ExcelのOFFSET式 - 覚えておくべきこと
- ExcelのOFFSET関数は、実際にセルや範囲を移動するわけではなく、参照を返すだけです。
- OFFSET 数式がセル範囲を返す場合、rows および cols 引数は常に、返される怒号の左上のセルを参照します。
- reference 引数には、隣接するセルまたはセル範囲を含める必要があります。そうしないと、数式は #VALUE!
- 指定した行や列がスプレッドシートの端から参照先を移動した場合、ExcelのOFFSET式は#REF!エラーを返します。
- OFFSET関数は、引数にセル/範囲参照を受け付ける他のあらゆるExcel関数内で使用することができます。
たとえば、次のような数式を使おうとすると =offset(a1,3,1,1,3)
を単独で使用すると、返すべき範囲(1行3列)が1つのセルに収まらないため、#VALUE!エラーを投げます。 しかし、次のようにSUM関数に埋め込むと、このようになります。
=sum(オフセット(a1,3,1,1,3))
この数式は、セル A1 の下 3 行、右 1 列にある 1 行×3 列の範囲の値の合計、つまりセル B4:D4 の値の合計を返します。
ExcelでOFFSETを使用する理由は何ですか?
OFFSET関数が何をするのかがわかったところで、「なぜわざわざOFFSET関数を使うのか? B4:D4のように直接参照するように書けばいいのでは?
エクセルのOFFSET式はとても優れています。
ダイナミックレンジの作成 B1:C4のような参照は静的で、常に特定の範囲を参照します。 しかし、動的な範囲を使用する方が簡単な作業もあります。 これは、例えば毎週新しい行や列が追加されるワークシートで、変化するデータを扱う場合に特に当てはまります。
開始セルからの範囲取得 このような場合、ExcelでOFFSETを使用するのが正しい方法です。
エクセルでOFFSET関数を使う方法-数式例
さて、ここからは、OFFSET関数の実用的な使い方です。
ExcelのOFFSET関数とSUM関数
先ほどの例では、OFFSET & SUMの最も単純な使い方を示しました。 では、これらの関数を別の角度から見て、他にどんなことができるかを見てみましょう。
例1.動的なSUM/OFFSETの計算式
継続的に更新されるワークシートを扱う場合、新しく追加されたすべての行を自動的に選択するSUM式が必要な場合があります。
下のスクリーンショットのようなソースデータがあるとします。 毎月、SUM式のすぐ上に新しい行が追加されるので、当然、合計に含めたいと思います。 全体として、SUM式の範囲を毎回手動で更新するか、OFFSET式にこれを行わせるか、2つの選択肢があります。
合計する範囲の最初のセルはSUM式で直接指定するので、ExcelのOFFSET関数のパラメータを決めるだけで、その範囲の最後のセルを取得することができます。
参考
- は、合計を含むセル(ここではB9)である。列
- の場合、合計のすぐ上のセルには負の数である-1が必要です。コーンズ
- は、カラムを変更したくないので0です。
では、SUM / OFFSETの計算式のパターンを紹介します。
=SUM( だいいちのでんち :(オフセット( 総てのセル , -1,0)上記の例で微調整すると、以下のような式になります。
=sum(b2:(オフセット(b9, -1, 0)))
そして、以下のスクリーンショットに示すように、完璧に動作します。
例2.最後のN行を合計するExcelのOFFSET式
上記の例では、総計ではなく過去Nヶ月のボーナス額を知りたい場合、シートに追加した新しい行を自動的に計算式に含めたい場合です。
この作業では、ExcelのOFFSETとSUM関数、COUNT / COUNTA関数を組み合わせて使用することになります。
=sum(オフセット(b1,count(b:b)-e1+1,0,e1,1))。
または
=sum(オフセット(b1,counta(b:b)-e1,0,e1,1))。
以下の詳細をご覧いただくと、計算式の理解が深まります。
参考
- 値を合計したい列(この例ではセル B1)のヘッダを指定します。列
- を使用してオフセットする行数を計算する場合、COUNT または COUNTA 関数のいずれかを使用します。COUNTは、B列のうち数字を含むセルの数を返し、そこから過去Nヶ月分(数字はセルE1)を引き、1を足したものです。
COUNTA 関数は、空でないセルをすべてカウントするので、1 を追加する必要はありません。 この式は、ヘッダー行と数値行が続く、似たような表構造の場合のみ正しく動作します。 異なる表構造の場合は、COUNTA で何らかの調整が必要な場合があります。OFFSET/COUNTAの計算式。
コーンズ
- オフセットする列の数はゼロ(0)です。高さ
- 合計する行の数は E1 で指定されます。幅
- 1列。
AVERAGE、MAX、MINとOFFSET関数を併用する。
過去Nヶ月のボーナスを計算したのと同じように、過去N日、週、年の平均を求めたり、その最大値、最小値を求めることができます。 この式の違いは、最初の関数の名前だけです。
=平均値(オフセット(b1,count(b:b)-e1+1,0,e1,1))。
=max(offset(b1,count(b:b)-e1+1,0,e1,1))
=min(オフセット(b1,count(b:b)-e1+1,0,e1,1))。
通常の AVERAGE(B5:B8) や MAX(B5:B8) に比べて、これらの数式の主な利点は、ソース・テーブルが更新されるたびに数式を更新する必要がないことです。 ワークシートにどれだけ新しい行が追加または削除されても、OFFSET 数式は常に列の最後の(最下部の)セルの指定数を参照することができます。
ExcelのOFFSET式でダイナミックレンジを作成する
COUNTAと組み合わせて、OFFSET関数を使用すると、自動的に更新可能なドロップダウンリストを作成するなど、多くのシナリオで有用なダイナミックレンジを作成することができます。
ダイナミックレンジのOFFSETの式は以下の通りである。
=OFFSET(Sheet_Name!$A$1, 0, 0, COUNTA(Sheet_Name!$A:$A),1)を使用します。
この式の中心は、COUNTA関数を使って対象列の空白でないセルの数を求め、その数をOFFSETの高さ引数に渡して、何行返すかを指示しているところです。
それ以外は、普通のOffsetの式で、ここで。
- 参考 は、Sheet1!$A$1のように、オフセットの基点となる開始点です。
- 列 と
コーンズ
は、オフセットする列や行がないため、両方とも0です。 - 幅 は1列です。
注:現在のシートでダイナミックレンジを作成する場合、シート名を参照に含める必要はありません。 そうでない場合は、この式の例のように、シート名の後に感嘆符を必ず含めてください。
上記のOFFSET式で動的な名前付き範囲を作成したら、データバリデーションを使って、ソースリストにアイテムを追加または削除すると同時に自動的に更新される動的なドロップダウンリストを作成することができます。
Excelでドロップダウンリストを作成するための詳細なステップバイステップのガイダンスについては、以下のチュートリアルを参照してください。
- Excelでドロップダウンリストを作成する - 静的、動的、別のワークブックから
- 従属ドロップダウン・リストの作成
Excel OFFSET & VLOOKUP
ご存知のように、単純な垂直方向の検索はVLOOKUP関数、水平方向の検索はHLOOKUP関数で行いますが、これらの関数には多くの制限があり、より強力で複雑な検索式ではしばしばつまずきます。 そこで、Excelテーブルでより高度な検索を行うには、INDEX、MATCH、OFFSETなどの代替手段を探さなければなりません。
例1.Excelの左VlookupのOFFSET式
VLOOKUP関数の最も悪名高い制限の1つは、その左側を見ることができないことです。つまり、VLOOKUPはルックアップ列の右側の値しか返せないのです。
サンプルのルックアップテーブルには、月名(A列)とボーナス(B列)の2列があります。 ある月のボーナスを取得したい場合、この単純なVLOOKUP式は問題なく機能します。
=vlookup(b1, a5:b11, 2, false)
しかし、ルックアップテーブルのカラムを入れ替えた途端に、#N/Aエラーとなる。
左側からの検索を行うには、戻り列の位置を気にしない、より汎用的な関数が必要です。 その解決策の1つは、INDEX関数とMATCH関数を組み合わせて使うことです。 また、OFFSET、MATCH、ROWSを使う方法もあります。
オフセット( ルックアップテーブル , MATCH( ルックアップバリュー , OFFSET( ルックアップテーブル , 0, ルックアップコルオフセット , ROWS( ルックアップテーブル ), 1) ,0) -1, 戻り値_col_offset , 1, 1)どこで
- ルックアップ_カラー_オフセット - は、開始点からルックアップ列まで移動する列数である。
- 戻り値_col_offset - は、始点から戻り列まで移動する列数である。
この例では、ルックアップテーブルは A5:B9 で、ルックアップ値はセル B1 にあります。ルックアップ列オフセットは 1 で(2 列目(B)のルックアップ値を検索しているので、テーブルの先頭から 1 列右に移動する必要があります)、戻り列オフセットは最初の列(A)から値を返しているので 0 になっています。
=offset(a5:b9, match(b1, offset(a5:b9, 0, 1, rows(a5:b9), 1) ,0) -1, 0, 1, 1)
ちょっと不器用そうな処方ですが、効果はありますよ :)
例2.エクセルで上位ルックアップを行う方法
VLOOKUPが左を見ることができないのと同様に、その水平方向の対応物であるHLOOKUP関数は、上を見て値を返すことはできません。
もし、上の行をスキャンしてマッチングさせる必要がある場合は、OFFSET MATCH 式が再び役立ちますが、今回は、COLUMNS 機能を使って、次のように拡張する必要があります。
どこで
- ルックアップ行オフセット - 開始点から検索行まで移動する行数。
- 戻り値:行オフセット - 開始点から戻り行まで移動する行数。
ルックアップテーブルがB4:F5で、ルックアップ値がセルB1にあると仮定すると、数式は次のようになる。
=offset(b4:f5, 0, match(b1, offset(b4:f5, 1, 0, 1, columns(b4:f5)), 0) -1, 1, 1)である。
この場合、検索範囲が開始点から1行下なので、検索行オフセットは1、戻り行オフセットはテーブルの最初の行からマッチを返すので0です。
例3.双方向ルックアップ(列と行の値で)
双方向ルックアップは、行と列の両方での一致をもとに値を返します。 そして、次のような二重ルックアップ配列の式で、ある行と列の交点にある値を見つけることができます。
=OFFSET( ルックアップテーブル , MATCH( 行ルックアップ値 , OFFSET( ルックアップテーブル , 0, 0, ROWS( ルックアップテーブル ), 1), 0) -1, match( カラムルックアップ値 , OFFSET( ルックアップテーブル , 0, 0, 1, 列( ルックアップテーブル )), 0) -1)それを考えると
- ルックアップテーブルはA5:G9です。
- 行にマッチする値は、B2
- 列で一致させる値は、B1
次のような二次元のルックアップ式が得られます。
=offset(a5:g9, match(b2, offset(a5:g9, 0, 0, rows(a5:g9), 1), 0)-1, match(b1, offset(a5:g9, 0, 0, 1, columns(a5:g9)), 0) -1)
なかなか覚えられませんよね。 さらに、これは配列の式なので、Ctrl + Shift + Enterを押して正しく入力することを忘れないでください。
もちろん、この長いOFFSET式は、Excelで二重検索を行う唯一の方法ではありません。 VLOOKUP & MATCH関数、SUMPRODUCT、INDEX & MATCHを使用しても、同じ結果を得ることができます。 また、数式なしの方法もあります。名前付き範囲と交差演算子(スペース)を使用します。次のチュートリアルで、すべての代替案を詳しく説明します:二重検索を行う方法をExcelで調べます。
OFFSET機能 - 制限と代替案
このページの数式例で、OFFSETの使い方が少しわかったと思いますが、自分のワークブックで効率よく活用するためには、OFFSETの長所を知るだけでなく、短所にも注意する必要があります。
ExcelのOFFSET関数の最も重大な制限は、以下の通りです。
- 他の揮発性関数と同様に、OFFSETは リソースハングリー機能 ソースデータに変更があるたびに、OFFSETの計算式が再計算され、Excelの処理に時間がかかります。 小さなスプレッドシート内の1つの計算式であれば問題ありませんが、ワークブック内に数十または数百の計算式がある場合、Microsoft Excelは再計算にかなり時間がかかる場合があります。
- エクセルのOFFSETの計算式は みにくい OFFSET関数が返す参照は動的なので、大きな数式(特にOFFSETをネストしたもの)はデバッグがかなり厄介になります。
エクセルでOFFSETを使用する代替案
Excelではよくあることですが、同じ結果を得るにはさまざまな方法があります。 そこで、OFFSETに代わるエレガントな方法を3つ紹介します。
- エクセル表
Excel 2002以降では、通常の範囲ではなく、本格的なExcelの表という、実に素晴らしい機能を備えています。 構造化されたデータから表を作るには、単に テーブルの挿入 について ホーム タブをクリックするか、Ctrl + T を押してください。
Excelの表の1つのセルに数式を入力すると、その列の他のすべてのセルに自動的に数式をコピーして、表の各行ごとに数式を調整する、いわゆる「計算列」を作成することができます。
さらに、表のデータを参照する数式は、表に追加した新しい行を含むように、または削除した行を含まないように自動的に調整されます。 技術的には、このような数式は表の列または行に対して操作されます。 ダイナミックレンジ ワークブック内の各テーブルには固有の名前 (デフォルトは Table1、Table2 など) があり、テーブルの名前を変更するには デザイン tab> 物件紹介 グループ> テーブル名 テキストボックス
次のスクリーンショットは、SUM式を参照することを示しています。 ボーナス この式には,テーブルの 列名 は、セルの範囲ではなく
- エクセルINDEX関数
OFFSETと全く同じではありませんが、ExcelのINDEXも動的な範囲参照を作成することができます。 OFFSETとは異なり、INDEX関数は揮発性ではないので、Excelの動作が遅くなることはありません。
- エクセルINDIRECT関数
INDIRECT関数を使用すると、セル値、セル値とテキスト、名前付き範囲などの多くのソースから動的な範囲の参照を作成することができます。 また、動的に別のExcelシートまたはワークブックを参照してください。 あなたは私たちのExcel INDIRECT関数チュートリアルでこれらのすべての式の例を見てみましょう。
このチュートリアルの冒頭で問われた質問を覚えていますか? ExcelのOFFSETとは? このページで紹介したすべての公式を収録した練習用ワークブック(下記参照)をダウンロードして、より深く理解することができます。 読んでくれてありがとうございました。
練習用ワークブック(ダウンロード
OFFSETの計算式例(.xlsxファイル)