[[20220420212917]] 『【呟き】開いただけでブックに変更が加えられる式』(白茶) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『【呟き】開いただけでブックに変更が加えられる式』(白茶)

 誰かに聞いて欲しかっただけですすみません^^;

 「どうせまた何処かにTODAY関数とか入れたんでしょ?」と高を括って解析してたら
 案外嵌ってしまい、ようやく辿り着きました。

 新規ブックの[B1]に =COUNT(A1:INDEX(A:A,10)) と式を入力し、
 一旦保存して閉じます。

 再度そのブックを開き、
 何もせずに閉じようとすると「変更を保存しますか」と訊いてきます。

 でもいわゆる揮発性関数の様に、
 シートに変更が加えられる度に再計算されるものでは無さそうです。
 例えば
    Function test()
        test = Rnd()
    End Function

 [C1] =test()+NOW()*0
 [C2] =test()+COUNT(A1:INDEX(A:A,10))

 として{F9}キー連打した時に[C1]は再計算されますが[C2]は変化しません。
 恐らく参照演算子「:」と関数の接続っていう組み合わせで発生しているのかなと予想してます。

 20年近くExcel使ってて初めて気付きました... orz
 とりあえず頭の中で
 「変更を加えたかのかどうか覚えておけないなら避けた方が良いもの」リストに追加したんですけど、
 こういった「揮発性ではないけど再計算が走る」みたいなのって
 私が知らなかっただけで他にもあったりするんですかね?

< 使用 Excel:Excel2010、使用 OS:Windows7 >


Excel2019 Windows10 ですが、再現しませんでした。おかしいですね。

(γ) 2022/04/20(水) 22:13


 あー。その可能性もちょっと予想してました。
 たぶんそれでおかしくないのでしょうね。

 γさん確認ありがとうございます。

(白茶) 2022/04/20(水) 22:24


 X2010で再現しました。 Microsoft365では再現しません。

 昔、INDEXは揮発性関数として分類されていたことがあったようです。

 その後、それは訂正されたのですが、ブックオープン時のこの挙動のセイで、
 Microsoft自身が勘違いした時期があったのではないかと推測しています。

(半平太) 2022/04/20(水) 22:40


 半平太さん確認ありがとうございます。

 >昔、INDEXは揮発性関数として分類されていたことがあったよう
 わー、マジですか。面白いwww
 でも改めて考えてみれば
 OFFSETやINDIRECTの様なモロ揮発性の関数以外で[参照]を返す関数って
 実はINDEX関数くらいですかね?
 そう考えると関数の中では結構異質な存在に見えてきました。

 (そういやROW関数とCOLUMN関数も何となく揮発性に見えてしまう不思議...)

 ついでに
 スペース参照演算子も試してみましたが、

 =SUM(A:A 10:10)                    再計算されない
 =SUM(INDEX(A:A,) INDEX(10:10,))    再計算される

 でお馴染みのカンマ参照演算子は
 =SUM(INDEX(A:A,),INDEX(10:10,))    当然の如く再計算されない

 でした。

(白茶) 2022/04/20(水) 23:39


 あ、しまった。最後のヤツ、()が一組抜けてる気が...
(白茶) 2022/04/20(水) 23:59

 一応訂正追記させて頂きます orz

 =SUM((INDEX(A:A,),INDEX(10:10,)))  やっぱ再計算されました

 =ISREF((A:A,10:10))                 再計算されない
 =AREAS((A:A,10:10))                 再計算されない
 =ISREF((INDEX(A:A,),INDEX(10:10,))) 再計算される
 =AREAS((INDEX(A:A,),INDEX(10:10,))) 再計算される

(白茶) 2022/04/21(木) 08:38


 >[参照]を返す関数
=IF(B1="",C1,D1)
=CHOOSE(A1,B1,C1)
等は参照を返します
365ならXLOOKUP関数
そう言えば、SUMIF関数は
=SUMIF(A1:A10,"A",B1)
だと、揮発性関数になります
(はま) 2022/04/21(木) 09:00

 はまさんコメントありがとうございました。

 >>[参照]を返す関数
 ニュアンスとしては「(引数を元に)参照を作って返す関数」って感じの意味でした。
 受け取った引数をそのまま返す式とは内部処理で何か決定的な違いがあるのではないかと思ってます。

 XLOOKUP関数は確かにそんな感じですかね。
 =SUM(XLOOKUP(B3,B6:B10,E6:E10):XLOOKUP(C3,B6:B10,E6:E10))

(白茶) 2022/04/21(木) 10:32


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.