エクセル備忘録indirect関数

エクセル備忘録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)が無難です。