2010-06-22[n年前へ]
■エクセルで飛び出す"立体"粒子群アニメーションを作ってみよう!?
21世紀に入った頃から、「表計算ソフトを使って、色んなシミュレーションをしてみる」ということをしています。いつも、夏になるとそんなことをしています。だから、暑い夏が来ると、いつもエクセルの勉強を”少しだけ”します。そして、いつもエクセルを憎み、一年くらいは触りたくなくなります。…けれど、憎みと愛は裏表、というわけで、結局エクセルに触り続ける毎日です。
さて、そんな年中行事とは関係なく、昨日は「エクセルのグラフをマウスでグリグリ動かしながら赤青メガネで飛び出す立体動画で眺めよう!?」ということをしてみました。そこで感じたのは、エクセルは三次元的に眺める価値のあるグラフはなかなか作ることができない、ということでした。
しかし、そんな風に限界を感じるときは、そこで感じる限界は多くの場合、自分の限界そのものである、ということもよく感じます。…というわけで、今日は、エクセルで粒子挙動シミュレーションを行い、その結果をアナグリフ立体動画として表示してみることにしました。
そこで、まずは、(反復計算を用いて)簡単な「粒子挙動シミュレーション」をエクセルで行うことができるようにしました。そして、その上で、その粒子群の動きの計算結果を位置・大きさを(適当に)透視変換をした上で、散布図(バブルチャート)として、アナグリフ立体表示できるようにしてみたのです。そうすれば、左右視差による遠近感に加え、バブルの大きさが遠近に合わせた大きさで表示されることで、自然に立体感をもって眺めることができるわけです。
その結果を、先日、作ったアナグリフ表示アプリケーションでアナグリフ立体動画にしてみた結果が、下に張り付けた動画になります。ムービーキャプチャーはいつものようにカクカクしてしまっていますが、もちろん、本当は、とても滑らかに動いています。というわけで、今日は「エクセルで飛び出す"立体"粒子群アニメーション」を作ってみました。
2010-06-29[n年前へ]
■エクセルのグラフを綺麗なスペクトルチャートにするマクロ
エクセルのグラフを綺麗なスペクトルチャートにするマクロの「CCC」
エクセル標準のグラフのうち、等高線グラフなどのグラフ要素の塗りつぶしの色を 青から赤へと連続的に変化した色に変えることにより、グラフを見やすくすることができます。というわけで、下のチャートは(Excel 2010になっても未だ今ひとつ綺麗に色を仕上げることができないのです)Excel 2010の等高面グラフを本マクロを使って、綺麗なスペクトルチャートにしてみた例です。エクセルのチャートを、思いきり綺麗にカスタマイズできて、自由自在に眺めることができるソフトウェアを、明日にでも作ってみようと思います。近く、夏恒例のスプレッドシートを使ったシミュレーション実習を行うので、ありとあらゆるエクセル技を、これから少しまとめて行こうと思います(もしも、ひと味もふた味も変わった、けれどとても楽しく華麗なエクセル科学本に興味のある編集者の方がいらっしゃいましたら、ご連絡頂ければ幸いです)。
2010-07-01[n年前へ]
■Excel2003が「カラーパレット」色処理を使っていたことに驚いた。
「Excel 2010になっても、エクセルは未だグラフを今ひとつ綺麗に色を仕上げることができない」とつねづね思っていました。そこで、綺麗な配色のグラフをエクセルで使うためのプログラムを書き始めて、とても驚いたことがあります。Excel 2010,2007の動き(また、それらのグラフを旧バージョンで開いたときの動き)をまだ理解することができていないのですが、少なくともExcel 2003までのExcelでは色処理に「カラーパレット」を使っていたのです。それも、他の箇所で異常な色が発生してしまう、といった問題が起きない範囲で使おうとすると、たかだか32色程度の色しか使うことができなく、さらに、もっと安全に使おうと思うなら、たった8色しか使うことができない、という驚くべき仕様です。
もちろん、自由にRGBで色指定をするコードを書くことができるようには見えるのです。しかし、結局のところ、動作させた結果として表示されるのは、カラーパレットから近似色が選ばれるだけなのです。もしも、そういう動作を好まないのであれば、カラーパレット中の色をRGBで指定した後に、作成した色のインデックスを指定してやらなければならないのですが、さまざまな用途に使われる色がトータルで56色しかない、というなかなかにキツい制限の中で作業を行わなければならないのでした。
とはいえ、そんな苦労を(しかもC++で)したおかげで、(できる範囲内で)自由な配色のグラフを(たとえば、上に示したチャートのように)エクセルでプログラマブルに作ることができるようになりました。そして、エクセルで作られた、カラー表示ソフトウェアを、その色表示の意味については”眉につばつけて”眺めることができるようになりました。何事も、自分でやってみてわかること、というのが多いように思います。
2010-07-02[n年前へ]
■エクセル2003(以前のバージョンも?)のグラフを綺麗にするアプリを作りました。
(既存のアドインやカスタマイズ方法の自由度や品質に満足できなかったので)Windows版 Excel 2003(以前のバージョンも?)のグラフを綺麗にするアプリを作ってみました。VBAを使えばもっと簡単に書けるのだろうなぁ、と思いつつC++で組んでしまいました。動作の仕組みは、エクセルのブックが保持しているカラーパレットの空き領域に対して、チャートで使う色を(それぞれのインデックスに対して)割り当てて、チャートの各領域の色にインデックスカラーを指定する、という具合です。そのような動作なので、近似色が使われることによる不自然さなどが生じることはありません。とても滑らかな綺麗なチャートを、Excelで一瞬で作り上げることができます。
作ってみたアルファ版を、ここ(ExcelColorChanger2003.zip)に置いておきます。(Excel 2007,2010では動かないと思いますが、)もしも、Excel 2000などで動くことを確認した方がいらっしゃいましたら、教えて頂ければ幸いです。ソースコードなどは、いずれ公開する予定です。
このアプリケーションを使うと、開かれているエクセルの中のチャート(複数のチャートがあれば、一番最初に作成したもの)を、等高面グラフや濃度グラフを、スペクトルカラー風にしてみたり、炎風の色表現にしてみたり、青→赤の色表現にしてみたり、と色々なことができます。…あるいは、Bitmapファイルを適当に作ってやれば、左端がグラフ中の下端の色として扱われ、一番右端の色が上端の色として使われたグラフに変えることができます。つまり、自由自在にチャートの色を簡単にカスタマイズすることができます。しかも、縦軸の最大・最小・分割幅なども設定することができるようになっています。
そのサンプル画面が下になります。上段の3つが、このアプリケーションが標準で備えているグラデーションパターンで、左下がExcelの標準そのままで作ったものになります。ちなみに、右下が、今回作ったアプリケーションです。
ちなみに、今回作成したアプリケーションでは、チャートの縦軸分割数が24個以上あるものに関しては、24個までしか処理を行わないようになっています。Excel2003, 2007向けバージョンについては、今夜にでも、また別途作ってみようと考えています。
綺麗な(チャート向け)グラデーション用画像を作成した方がいらっしゃれば、送付して頂ければ幸いです。また、何か追加機能などありましたら、教えて頂ければうれしく思います。
2010-07-03[n年前へ]
■エクセル 2010のグラフを綺麗にするRubyスクリプトを作る
先日、エクセル2003のグラフを綺麗にするアプリを作りました。しかし、Excel 2010に対して動かしてみると、どうしてもエラーが出てしまうのです。そこで、今日は、Borland C++ Builder 6.0でコードを書くのは止めて、とりあえず、Rubyでエクセル2010のグラフを綺麗にするスクリプトのスケルトンを書いてみました。その実行結果例が下に張り付けたものになります。透明度も調整できますし、近似色が使われることもなく、なかなか良い感じです。
あとは、このスクリプトに機能追加&EXE化を行った上で、色指定などを行うインターフェースから適当にその実行ファイルを読んでやれば良さそうです。そういった辺りは、また後程してみようと思います。
ちなみに、Rubyスクリプトの主要部(を簡単に示したもの)はこのような具合になります。オブジェクトの親子関係が入り混じっている箇所に、少し惑いました(LegendKey経由になっているのも、そんな戸惑いの影響になります)。
excel=WIN32OLE::connect("Excel.Application") chart=excel.ActiveChart legend=chart.Legend count=legend.LegendEntries.Count count.times do |i| entry=legend.LegendEntries(i+1) fill=entry.LegendKey.Format.Fill fill.ForeColor.RGB=255*i/(count-1)+ 0*256+ 255*(count-1-i)/(count-1)* 256*256 fill.Transparency=TRANSPARENCY fill.Solid end