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



2009-07-14[n年前へ]

「エクセルで電界シミュレーション」と「ウィンドウ半透明化マクロ」 

 「各種方程式を差分化する方法を学び、実際に表計算ソフトで電界シミュレーションと伝熱シミュレーションをできるようになろう」という講習会を手伝う準備をした。準備のひとつに、受講者の実習作業を前もってやってみる、というのがある。すると、どの部分がわかりにくいとか・難しいとかいったことがわかる。

 表計算ソフトで電界シミュレーションをする時に、「わかりにくい」と感じる部分のひとつが、複合誘電体の電界計算だ。差分化の仕方と、その差分化されたものを表計算ソフトへどのように実装するかにもよるが、今行っている実習では複合誘電体の電界計算部分に、わかりにくい部分がある。

 その実習では、ポワソン方程式を解くために、エクセルの3つのワークシートを使う。電位を計算するシート・空間の各領域における誘電率分布を入力するシート・空間の各領域における電荷分布を入力シート、という具合である。そして、わかりにくいのが、「電位分布シート」と、「誘電率分布シート」「電荷分布シート」、のセルの空間的な意味が少し異なる、ということだ。「電位分布シート」の各セルが空間上に一定長刻みで作られた各格子「点」を意味するなら、「誘電率分布シート」「電荷分布シート」では、各セルは格子で囲われた各領域を示すのである。各セルの意味合いが異なる結果、空間的な位置は、「電位分布シート」に対して「誘電率分布シート」「電荷分布シート」のセルは「半セル分」ずれることになる。そのズレが一番最初はわかりづらいのである。

 そこで、「Excel Hacks 第2版― プロが教える究極のテクニック140選」に載っていた「エクセルのVBAマクロからWindows APIを使い、エクセルのウィンドウを半透明化するテクニック」を使い、「電位分布シート」を開いたエクセルウィンドウを半透明化し、「誘電率分布シート」などと重ねて眺めてみることができるようにしてみた。それが、右上の画像と下の動画である。ひとつのファイルをふたつのエクセル(アプリケーション)から開いた状態で、「電位分布シート」を開いているエクセルでマクロを実行すると、「電位分布シート」の下に「誘電率分布シート」が透けて見える。そして、シート間の位置関係を正しく示すようにウィンドウを並べてやれば、各セルが示す「」場所のズレを体感できるだろう、というわけである。

 下の動画の場合は、「誘電率分布シート」には赤罫線がひいてあり、「電位分布シート」には青罫線をひいてある。そして、それらが半セルずれていることが体感できるようにしてみた。

 ちなみに、エクセルの半透明化マクロは、Windows API上の関数を定義した後に、

mywnd=FindWindow("XLMAIN", 
                 Application.Caption)
oStyle=GetWindowLong(mywnd,GWL_EXSTYLE)
SetWindowLong mywnd,GWL_EXSTYLE,
          oStyle Or WS_EX_LAYERED
SetLayeredWindowAttributes mywnd,0,
          (255*60)/100,LWA_ALPHA
という風にしてやることで、エクセルのアプリケーション・ウィンドウを半透明化させている。もしも、半透明化を戻したければ、
mywnd=FindWindow("XLMAIN",
         Application.Caption)
SetWindowLong mywnd,GWL_EXSTYLE,oStyle
というコードを実行すれば良い。それほど使う状況があるとは思いづらい"Excel Hack"だが、VBAマクロからWindows APIを叩けば、Excelからでも「どんなことでもできる」と思わせるサンプルとして、結構面白い。

エクセルVBAでウィンドウ半透明化






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を作っているという具合になります。

2010-06-29[n年前へ]

エクセルのグラフを綺麗なスペクトルチャートにするマクロ 

 エクセルのグラフを綺麗なスペクトルチャートにするマクロの「CCC

 エクセル標準のグラフのうち、等高線グラフなどのグラフ要素の塗りつぶしの色を 青から赤へと連続的に変化した色に変えることにより、グラフを見やすくすることができます。
 というわけで、下のチャートは(Excel 2010になっても未だ今ひとつ綺麗に色を仕上げることができないのです)Excel 2010の等高面グラフを本マクロを使って、綺麗なスペクトルチャートにしてみた例です。エクセルのチャートを、思いきり綺麗にカスタマイズできて、自由自在に眺めることができるソフトウェアを、明日にでも作ってみようと思います。近く、夏恒例のスプレッドシートを使ったシミュレーション実習を行うので、ありとあらゆるエクセル技を、これから少しまとめて行こうと思います(もしも、ひと味もふた味も変わった、けれどとても楽しく華麗なエクセル科学本に興味のある編集者の方がいらっしゃいましたら、ご連絡頂ければ幸いです)。

エクセルのグラフを綺麗なスペクトルチャートにするマクロ






2010-07-12[n年前へ]

エクセルで楽しく・わかりやすくシミュレーションをしよう!? 

 基本的には表計算ソフトなら何でも良いのだが、エクセルを使って静電計算を行ったり、非定常3次元伝熱計算をしたりすることができるようになる、という実習講習会を今週する。毎年、夏が始まるこの季節に、そんなシミュレーション実習講習会の手伝いをしている。

 だから、夏が始まる前にはいつもエクセルのテクニックを調べたり・関連ツールを作ったりする。…そして、いつもエクセルを少し嫌いになったり・あるいは面白く感じたりする。

「Excel」上で動作する手軽な歴史シミュレーションゲーム「極小三國志」 というものを知った。

 「極小三國志 for Excel VBA」(以下、「極小三國志」)は、中国の後漢末を舞台にした簡易的な歴史シミュレーションゲーム。「Microsoft Excel」(以下、「Excel」)2003/2007に対応するフリーソフトで、編集部にてWindows 7上の「Excel 2010」で動作を確認した。作者のWebサイトからダウンロードできる。

 「極小三國志」は、魏・呉・蜀の三国が覇を争った“三国志”の時代を舞台にした歴史シミュレーションゲームで、「Excel」上で遊べる VBAマクロとして実装されているのが特長。
 こちらの方は、VBAで実装されていたり「歴史シミュレーション」だったりする違いはあるが、エクセル上で行う「シミュレーション」であることには同じである。

 エクセルを使い、楽しく・わかりやすくシミュレーションをして遊んでいる人・働いている人も多いことだろう。「私はこんな風にエクセルを面白く使っている」という話を聞きたい今日この頃だ。



■Powered by yagm.net