Excel

2005年04月21日 木曜日

久しぶりにExcel VBA

今日は午後から頼まれたExcel VBAのマクロ書き。1つのファイルに10個くらいのデータ系列があって、それぞれに対して単回帰分析をしたいらしいのだが、そんなファイルが100個くらいあるんだそうな。ということで、作りためていたライブラリを組み合わせて、ちゃきちゃき作ってみた。2.5時間で完成。
マクロを渡したところ… _動かないんですけど!_というご意見をいただいたので調べてみたところ、マクロはExcel2002で作ったのだが、実行環境はExcel97で、その部分の非互換性な部分だった。身の回りにExcel97は残しておく必要がありそうだ。(だれだよ、互換性でMS Officeが優れているなんていったのは、些細な非互換性が非常に腹立たしいのだけど…)

2005年04月13日 水曜日

続・Photoshopのスクリプト機能

今日はプログラミングしてみることにする。いろいろめんどくさいので、Java Scriptで遊んでみることにする。とりあえず画像解像度を変更するプログラムなど。ダイアログボックスで縦か横を選び、サイズを入れると設定された値に応じて、サイズが変更となる。スクリプトはJava Scriptの場合「PhotoshopCS」のディレクトリの中の「プリセット」ディレクトリの中にある「スクリプト」ディレクトリに適当な名前を付けてコピーする。

2005年03月18日 金曜日

昨日の続き

今日は昨日の続きでひたすら行列計算。ちゃんとした計算結果を得るには結構派手に計算機資源がいりそう。少なくとも準備するデータだけでどの程度メモリが必要か計算してみたけど、64MBのメモリを積んだWindows98マシンでExcelで計算させるには無理がありすぎました… (少なくともExcelの1枚のシートに入力データの1%も入力できない。むろんデータ入力も完全に自動化せねばならないけど。ロジックだけ考えて非現実的すぎるので、しばらく放置。)
むろん今やろうと思っていることに必須の計算ではないので、別に良いんだけど。(この計算はプロセスの装置で勝手にやってくれる。凄くでかい計算機がついていて勝手にやってくれるし。簡単なシミュレーションだけしたかったんだけどね…)

2005年03月17日 木曜日

2重積分

今日は1日積分と行列計算に明け暮れてました。いやぁ久しぶりに算数の計算をしたんですが、まだ不定積分が分かっている関数の2重積分とかだったら、余裕で計算できますねえ。今日の積分計算は2変数の正規分布関数を適当な区間で2重積分なので、まぁあまり難しくはなかったな。数値計算するのは多分大変だけど。まぁあとでMathematicaも使ってみましたが、使い方を思い出すだけで半日くらいかかりますねえ。(でも使えるようです。好きなツールだしねえ。)
行列計算はざっくりとだけやれば良かったのでExcelで適当にやらせてみたが、和の取り方がもうちょっと手が込んでいそうなので、計算してみたものの近似にすらならん… うーむ。
ちなみに僕の中では計算すれば何とかなるものは数学の範疇ではありません。すべて算数にすぎません。やっぱ物理数学とかはさんざんやっただけあって、手で計算を覚えてますな。さすがに部分積分とかはめんどくさいのでやりたくないけども。

2004年10月07日 木曜日

Excel VBAは究極の「変数 = 箱」モデル

某MLに書いた内容ですが、僕が遭遇したExcelVBA的なものの発想法について。
ExcelVBAでのプログラミングでは、8月8日の日記福盛さんの日記で触れられているように、「VBAでエクセルのマクロを作る初心者がですね、変数の代わりにセルを使うんですよ」と言うような、matz日記で話題になった究極の「変数 = 箱モデル」に相当するようなコードを書く人が結構多い。
つまり、「ExcelVBAは普通のVBと違って、「手動で」かつ「視覚的に」変数領域を割り当 てられる、2次元でアドレス指定するポインタを持つBASICである。」と言い換えても良さそうですし、暴論を言えば、「一流のExcelVBA使いは1次元のポインタしかないCのポインタなど目をつぶって使えないとならない訳だ(暴論)。分からないなどと言わせぬ!」ということになる。まぁ実際に一流の(分かった気になって、有頂天になって、ナニか勘違いしている人_のことを言う)ExcelVBA使いのみなさんはこういうポインタに相当するものには名前をつけたりしなくて「全部直接セル参照」という神業をするので、構造化言語とかOOPとかにジャブ付けの頭しか持ち得ない僕なんかから見るとある意味「すげーっ!」(絶対そうなりたくない)と思ったり、頭の中がどうなっているのかかち割って見てみたいなんて思っている_3流のへっぽこVBA使い_なので、せめて妥協点として、Rangeオブジェ クトに名前をつけてアクセスしたくなっちゃいます。
1次元のRange領域を作ってやれば普通のポインタと同じような感覚(アドレス指定はCellsプロパティで2次元指定できるけど)ですかね。領域の割り当ては自分でやらないと駄目ですが… まぁ_ご利用は計画的に

たとえば「1から10までの話を求めたい」と言う例題を考える。和を求めたいRangeオブジェクトを渡すと「Rangeの和を求めるワークシート関数を文字列として返す関数」なんてものをつくってやれば、少し楽ができそうし、応用もあるのは手を付けてはいけないと思いますねえかな? まぁ実際にこつこつアルゴリズムを書くのではなく、計算などはすでにあるExcelのワークシート関数にしまえと言うことになります。(まぁ_手抜き_とも言う) 和を求めるくらいだとあまりありがたみが出ないが、同じ手間でRangeの最大・最小とか2個のRangeオブジェクトを関数に渡して最小自乗法とかさくっと出来ちゃったりするので、まぁ楽チンですね。(実際は統計関係の計算をするときはExcelのバグを知り尽くしてないと危ないですが。まぁ統計をちゃんとしたい時はExcelは使っちゃいけません。ちゃんと統計ソフトを使いましょう。)
ということでコード例。(基本的にVBでプログラムを書くときは型宣言を必須にしましょう。そうでないと全部Variantになったりしますから。あとDim文の使い方も意図しない型宣言になったりしますので注意しましょう。)