hirax.net::Keywords::「Hash」のブログ



2009-12-25[n年前へ]

エクセルでのセルの「名前」管理 

名前付きセルのあるエクセルのワークシートをC++言語プログラムに変換してみよう」でこう書きました。

 エクセルでは、「名前」はセルにではなくブックの直下で管理されている

 エクセルのワークシートをC++言語プログラムに変換するプログラムを書くとき、最初は、Cellオブジェクトが名前を保持している、たとえばNameなんていうプロパティがあるのではないかと思いこんでいました。けれど、プログラムを書いている途中で、「Cellオブジェクトは自分に付けられている名前情報を保持していない」ということに気づき、どこに名前情報が保持されているかを調べてみたら、エクセルのワークブック直下に、つまり"book.names"というような形で、Nameの情報を示す配列が格納されていたのでした。(セルはちなみに、”ブック”の下の”ワークシート”の下の”行”の下の”列”の下にいます)

 そのことに気付いた瞬間は、(エクセルのワークシートをC++言語プログラムに変換するプログラム)の「コードの量が増えそうだな」と思い暗い気分になりました。しかし、少し考え、エクセルを作る側から考えてみれば、「名前はワークブックが保持する作りにするよなぁ」と思ったのです。

 もしも、セルが名前を保持する作りにしていたら、エクセルの動き上、ちょっと面倒になってしまうからです。それは、たとえば、どこかのセルに"velocity"という名前を付けていたとして、(それと異なる)またどこかのセルで"=0.1*velocity"なんていう式を使っていたとします。すると、その"=0.1*velocity"という計算をするときに、(セルが名前を保持する作りにしていたら)その名前を保持するセルが見つかるまでセル検索を行わなければならないからです。

 もちろん、その検索自体は、「エクセルにおける循環参照時の計算順序」で書いたような「エクセルの計算プロセスの詳細」を考えてみれば、エクセルで「(複数ブック・複数シート内のすべての)計算」を一回するのにつき一回だけですむはずだと思いますが、それでも検索作業はかなり面倒でしょう。

 大体、セルが「自分がどういう名前で他のセルから呼ばれているか」なんて知る必要がないわけです。他のセルの名前を知りたいことはあっても、自分の名前なんかどうでも良いのです(今回、私が書いたようなプログラムを書くのでなければ、ですね)。だから、エクセルでのセルの「名前」オブジェクトをブック直下に置くようにするようにするのは、当然の作りです。

 と、エクセルの作りに納得しつつ、(もちろん、自分のプログラムを書くのには、少し面倒だなぁと思いながらも)前回書いたような

names={}
book.names.each do |name|
  cell=$1.gsub('$','') if /!([^!]+)$/=~name.RefersTo
  names[cell]=name.name
end
といったコードを書いたわけです。

 ちなみに、蛇足ですが、上記コードはbookがnameオブジェクトの配列を保持していて、nameオブジェクトはnameという自分の名前と、どこのセルを意味するかを指し示すRefersToというプロパティを持っているので、名前で参照することができるHashを作っているという具合になります。



■Powered by yagm.net