エクセル備忘録indirect関数
基本:indirect関数のカッコの中は文字列
(で、そのセルの文字を取得)
知り合いが、以前、indirect関数に関心していた。
そのことを思い出すが、やろうとしていたのは、無関係のピボットテーブルの横列の合計。
例えば、下記の総計で、1月2月の合計。
いわゆる当月までの累計
1月 2月 3月
A 500 500 500
B 100 120 120
C 50 50 60
総計 650 670 680
一番簡単なのは、総計の1月2月をsum関数(足し算)。
(getpivotdata関数でも単純にセル番地でもいい)
でも、これだと、スライサーで行が増減し、変わると使えない。
このために、DAXがあるのだろうけど、あまり実用的でない。
(その前に、ピボットテーブルで、列を横に持つの自体、へたくそだけど。)
他にもやり方はあるが、matchとindirect関数を使った。
その時にindirect関数にハマった。
indirect関数の引数は文字列。
A1セルに、数字でも文字でも入っているとする。
INDIRECT(A1)
はダメで、(#refエラー)
INDIRECT("A1")
はOK
(上記なら=A1でいいが。)
matchとindirect関数を使う場合:
上記の例では、
sum(B9:C9)の数式の
の行を可変にすればいい。
そうするには、A列の「総計」を探す。
MATCH("総計",A:A,0)
で総計の行を探せばいい。
ピボットテーブルを別シートに新規で作る場合は、
(別シート)
1行目(空白)
2行目(空白)
3行目(項目名)
4行目(データ)
になるので、
1行目の集計したい列(例えばO列O1セル)に、
MATCH("総計",A:A,0)
こんなふうにすれば、ピボットテーブルの最終行が取れる。
2行目の集計したい列(例えばO列O2セル)に、
SUM(INDIRECT("E"&O1 &":O" &O1))
と入れれば、総計列を横に集計できる。
その時に、indirectを抜いて、
SUM("E"&O1 &":O" &O1)
とすると、#valueエラーになる。
普通に考えると(例)、
SUM(E11:O11)
の行を変数に置き換えるだけなので、
動きそうだが、動かない。
注意点は、indirectの引数は「文字列」なので、
参照先でも、直接でもどちらかで「文字列」になっていること。
(失敗は#refエラー)
と、使い時は、他の関数と組み合わせる時で、
範囲の設定に変数を使う場合だろうか。
(失敗は#valueエラー)
補足
indirectでなくても、
subtotalや
sumでも工夫次第です。
例:
SUBTOTAL(9,E:L)/2
SUM(E:K)/2
循環参照にならないように、範囲外のセルに設置し、範囲列を全部集計
で、÷2でも同じ。
なお、表のフィルターとピボットテーブルのスライサーでの非表示の扱いは、
異なるので注意。
多分。表のフィルターではsubtotal(9か109)が無難です。