« 銀塩カメラで悩む | トップページ | 刷り込まれ曲で悩む »

2016年5月29日 (日)

CELL関数で悩む

EXCELにはCELL関数というものがあって、そのEXCELファイル自体のファイル名とシート名を取得することができる。

Cellb2
これが便利なのは、ファイル名に日付とかが入っていてその日付をEXCELファイル内で参照するような、手続き上仕方なく書かなくちゃいけないようなファイルに使えることだ。

日付だけじゃなくて例えばシート名に入っているキーワードでほぼ内容が決まってしまうようなシートが多数ある場合、このシート名からvlookupでテーブル参照するとすごく便利に使える。

ちなみにこの関数を使って、直接ファイル名やシート名を取得することもできる。以下の行を直接EXCELに貼り付けてみてほしい。

ファイル名:
=mid(cell("filename"),find("[",cell("filename"))+1,find("]",cell("filename"))-find("[",cell("filename"))-1)

シート名;
=right(cell("filename"),len(cell("filename"))-find("]",cell("filename")))

しかし、このCELL関数には大きな落とし穴があるのだ。

トロいのである。別のシートやブックで判定したファイル名やシート名を、切り替わったことに気づかずにそのまま返してくる。例を二つ挙げる。

まず、シートが切り替わったのに気づかずにいる例。

Cellsheet2

もうひとつはBOOKが変わったのに気づかない例。

Cellother
バカでしょ? この例はEXCEL2003だが、2010でも同じことが起こることを確認している。これにはとりあえずの回避策があって、それは[F9]キーを押下して再計算させることだ。これをやると「ああ、そうだったね」という感じで正しい値を表示する。

しかし、他人に渡すファイルの場合は怖いのでこの機能を使えない。いったんはこの機能でファイル名とシート名を取得したあとで、同じセルへ「値をコピー」して定数化している。面倒くさい。


これはバグだと言っていいと思う。これを放置しているのはMicrosoftの怠慢だ。

バグだと言い切るのには根拠がある。この現象はひとつのEXCELインスタンス、つまりひとつのEXE内でだけ起こるのだ。言い換えればひとつのWindowの中だけで起こる。ひとつのEXEの中でCELL関数が返す値をひとつしか持てないからこういうことが起こる。

だから、別のEXCEL.EXEを立ち上げて同様のことを試すと、それぞれのWindowで独立した値が管理される。

Anotherwindow
これ、中身の構造がわかっている人ならすぐに直せるんじゃないかと思うんだけどなぁ。

翌日追記:

CELL関数には2つ目のパラメータがあって、そこに例えば「$A$1」とでも入れておけばここに書いたような不具合は起こらないらしい。しかしそれはおかしいだろう。そんなパラメータ無しでもちゃんと動くようにしろよ。

$A$1を追加した例を置いておこう。

ファイル名:

=mid(cell("filename",$A$1),find("[",cell("filename",$A$1))+1,find("]",cell("filename",$A$1))-find("[",cell("filename",$A$1))-1)

シート名;

=right(cell("filename",$A$1),len(cell("filename",$A$1))-find("]",cell("filename",$A$1)))

|

« 銀塩カメラで悩む | トップページ | 刷り込まれ曲で悩む »

パソコン・インターネット」カテゴリの記事

コメント

情報ありがとうございます。
助かりました。
すばらしいです。

投稿: | 2020年10月 1日 (木) 09時05分

お役に立ったようで嬉しいです。"]"を検索しているのでファイル名に"]"を含んでいると誤動作します。ご注意ください。

投稿: PicksClicks | 2020年10月 1日 (木) 13時15分

助かりました。「ありがとね」で立ち去るのも失礼かと思い、こちらの状況も残しておきます

やりたかったことは、シート毎にまとめたデータの先頭にシート名を自動で入れたかったのですが、一つのシートではうまくいくのですが、複数になると、記事にあるように更新されなかったり、無理やり更新すると、他のシートも一斉に同じシート名で更新されてしまうことでした。

セルに書いたコードは、いくつか同様のサイトで紹介されているものと同じです
=MID(CELL("FILENAME"),FIND("]",CELL("FILENAME"))+1,31)

CELL関数の第2パラメータに$A$1を入れることで回避できました


投稿: とおりがかり | 2024年8月12日 (月) 09時04分

お役に立てたようで嬉しいです。ここまでたどり着くのは大変だったんじゃないでしょうか。

投稿: PicksClicks | 2024年8月13日 (火) 08時19分

コメントを書く



(ウェブ上には掲載しません)




« 銀塩カメラで悩む | トップページ | 刷り込まれ曲で悩む »