Excel

VBAより便利で手軽?

Rubyist Magazine #27に「VBAより便利で手軽Excel操作スクリプト言語『Ruby』へのお誘い(前編)」という記事が掲載されていたので、読んでみたのだがちょっと寒い内容だ。VBAでもきっちりサンプルソースを書いた上でrubyとの比較をしていただきたい。むろん僕自身はVBA自身はバッドノウハウ(すでに死語の気もするが)の巣窟であり、出来る限る捨て去りたい物であるのはと思っていることを否定しないし、VBAになんの思い入れもない。VBAの話題自身がいまさらだろうが。

新規にVBAプログラムを書く鉄則はPerlの「use strictとuse warningsを必ず書け」というのと同様に「Option Explicitを必ず書け」で、静的型付け言語なので注意して書きましょうと言うのが前提。これをやってエラーが出るソースは放置するか捨てましょう。放置しておいたほうがよいものに関わってはいけません。(笑)
で、話を戻す。「VBA での文字列操作の不満やイライラを Ruby で解消する」と言う項で書かれているような定型なテンプレートにCellに入力した値を動的に入れて文書やソースを自動で生成したいと言う場合は、ソースにテンプレートを埋め込むと確かにぐちゃぐちゃになってしまうので、やらないというかやってはいけない。ただしヒアドキュメントの埋め込みのようなことはVBAでは出来ないので、下図のA5セルのように適当にテンプレートを書式を保ってCellに入れるか、外部のテキストファイルにしておく。(この記事で実際のテンプレート、置換データの入力、出力データの出力法は本質的ではないので、適当に決めうちで適当なセルに入れたりDebug.Printに出力したが、ちゃんと考えること。) 僕の趣味では外にテキストファイルを作る場合が多く、出力もテキストファイルにしてしまうことが多い。こんな感じのワークシートがあるとする。
excel.jpg
VBAが現代的なスクリプト言語に対して弱いところはテキストの取り扱い。特に正規表現周りだが、これは過去の私の日記記事「なんでもかんでもExcel症候群」で触れたように、VBScriptのRegExpオブジェクトを使えば解決するし、おそらく一般的なオフィスにおけるどのWindowsマシンでもExcel VBAとWSHがインストールされていることは期待して良いので、ライブラリ依存問題が問題になるようなことは少ない。「なんでもかんでもExcel症候群」ではテキストファイルを読み込んで走査するようなものを想定して書いてみたが、正規表現による置換を行う関数を分けて共用化して良さそうなので、今回分けてみたのが、下記のソースである。VBAないしはVBユーザーは積極的にWindowsの機能を使っていくべきである。このような便利なライブラリはデファクトの物があっても良さそうなのだが無いようだ。
String型に入れられる文字列のサイズはExcelのバージョン依存であるが、Excel2003以降だと実際試した限りでは数百MBはOKそうである。(おそらく最大2GB?) 従って適切な方法で文字列に入れて、じゃんじゃん置換するのが手っ取り早いと思われる。下手にワークシートに入れると行数や列数の制限で痛い目に遭うので、最終的な出力以外はすべてプログラムで閉じておいた方が良いと思う。

2006年06月16日 金曜日

Excel2007を評価中

体験って何だ・・・ というのは置いておいて、Excel2007 Betaをインストールしてみました。(正確にはOffice2007 Pro Betaだが)
Excel2007
メニューがなくなってリボンと言う奴になりました。最初は手惑いそうだけど操作自身は本質ではないし、まあ慣れれば気にはならないかも。マウスでオペレーションする方向になったような気はする。ちょっとしたことをするにもいちいち探索することが多いが、右クリックでうまく乗り切れそうではある。もうプルダウンメニューに飽きたし、IE7もそんな感じなので、Vistaではだいぶんかわるのだろう。とりあえずいろいろつっこみどころ満載のExcelで遊んでみよう。ざっくり使えるように設定の変更。

2006年04月10日 月曜日

Excel VBA Hacks (4)

前回まではテキスト処理を中心に書いてきたが、Excelと言えばワークシートを使ってなんぼ。ということで、ワークシートを使うお題から。先日つらつら仕事をしていて、Excelで書いた表の升目の大きさに合わせて、写真を貼らなければならない資料を作る必要が生じた。まぁ数枚だったら適当に貼り付けるのだが、さすがに貼り付ける写真の枚数が総数で400枚を越えると考えも変えざるえない。貼る時間よりマクロを書く方が数段速いので、サクサクこんなツールを書いてみる。

2005年12月07日 水曜日

Excel VBA Hacks (3)

なんでもかんでもExcel症候群」なんて言う_刺激的な_タイトルを付けるとなんだかそれだけでアクセスする人がいるのと、シリーズ化してみても良いかもしれないということで、タイトル変更。本シリーズではVBAとWindowsの標準的な環境における機能だけを使ったExcelおよびOfficeの使いこなしを深めていきたいと思う。
そんなわけで第3弾。テキストデータをさわっているといろいろ考えさせてくれるのが文字コード周辺の問題となる。通常Unixではnkfやらiconvやらを使ってコード変換をするのであるが、Windowsではどうするかというと、たいていの記事ではnkfをDLL化したフリーのライブラリnkf.dllを使うのが常道である。が、これもいちいちインストールしないと使えないので、めんどくさい。(めんどくさくないよと言う人は以下の記事を読む必要はない。ただ数十人のPCにいちいちマクロ以外のプログラムやライブラリを導入しつつ、自分がそのバージョンの管理もしなきゃならないという事態に陥れば、考えるところもあるだろう。)
いろいろWindowsのドキュメントをひもといていけば、だいたいの場合でやっぱりnkf32.dllもいらないと言う結論に落ち着いた。とりあえず文字コード変換して取り込むと言う関数も書いてみよう。方法としてはUnixのファイルをバイナリでもらってきて、以下の関数で取り込み。文字列を返すので、前回の関数を使って配列にすればよろしい。
以下ソースを示す。Microsoft Data Access Components (MDAC) のStreamオブジェクトを使うというのが処理のポイント。ソースを見れば何となく何をやっているか分かるだろう。詳しくは分かりにくいけどMDACのドキュメントをMSDNの中から探って欲しい。

2005年12月04日 日曜日

David Hawley, Raina Hawley / Excel Hacks—プロが教える究極のテクニック100選

最近Excelのスキルが凄くあがったなあと思ったので、道場破りでもと思って、本屋でこの本を_立ち読み_してみた。出てくる項目でしか判断してませんが、最後のXMLの項(これExcel2003の話だよなあ)を除けば、僕にとっては_ほぼすべてが既知_の本でした。O’ReillyのHacksシリーズは何冊か購入したけど内容のレベルにムラを感じるのではるが、この本ははっきりいって不要な本であるという結論ですかね。ランダムに結構な数をサンプリングしてみましたが、ほぼ既知の内容で読む価値無しという結論。ああっ、Excel依存症なのは僕のことなのかぁ・・・
ピボットテーブルとかピボットグラフとかソルバーとか言うものを使ったことが無いという人はExcel使いとしては初心者もいいところと思うので、Excelの初心者を卒業したいあたりの人にはまぁお勧めできるでしょうか。
そんなわけで、Excel依存症であることに気がついてしまった結果、全くブルーな気持ちでいっぱいです。この本を買ってやろうという予算は、ずっと買いそびれていた塩野七生さんの「ローマ人の物語」の1巻と2巻の購入資金に転用します。(実は3巻まで、図書館からかりて読んでいたので、未購入なのでした。7巻以降は別な理由で未購入ですが。と言っても、立ち読みレベルでだいぶん読んでいるのではあるけれど。)

2005年11月29日 火曜日

はてなブックマーク - なんでもかんでもExcel症候群

気がついたらこんな所にリンクを貼られてしまっているとは… 世の中恐ろしいものだ。今のところこの日記はblog的な要素(trackbackとかcommentとか)を持っていないことと、サーバの引っ越しをしたときに実行環境の差でBBSが動かなくなってしまったので、読んだ人の意見が取れない・・・(BBS自身は入れ替えたいけど、時間がねえ。) ちょっと悲しいが、まぁ良いか。
統計関係のワークシート関数のうちよく使うものだけは何とかしたいものだなあ・・・

2005年11月24日 木曜日

続・なんでもかんでもExcel症候群

Unixな機械からテキストファイルを直接持ってくると、改行がWindowsと異なるので、Excelで扱うのがちょっとめんどくさい。FTPできるときは、ASCIIで持ってくればDOS/Windowsなテキストファイルになるのだけど、世の中FTPできなくて専用のクライアントを共用されることもあって涙が出てくることがもうしょっちゅうあって困る。で、そんな_だめだめクライアント_に泣く泣くつきあわなければならないのだが、この際_なんでもかんでもExcelにお任せ_なのだ。
これからはASCIIモード転送のことは忘れて、すべてBINARYモード転送にしてしまいましょう。DOS/Windowsの世界ではUnixで作成したテキストは何行あっても、_たった1行のテキストファイル_と見なせるから、これを全部1つの文字列に取り込んで、ばらす方向で考える。ソースを示す。

2005年11月22日 火曜日

なんでもかんでもExcel症候群

何でもかんでもPowerPoint症候群の弊害を日記で書いたのだが、それよりも世の中に広く広まっている病的な物と言えば、_なんでもかんでもExcel症候群_であろう。とにかく通常の表だけに飽きたらず、提出書類から報告書まで_何でもかんでもExcel_なのである。つまり「何でもかんでもExcel症候群」とはExcelだけですべての仕事が完結してしまう恐ろしい病気なのだ。
その病巣の由来を簡単に予想するとすれば、子供の頃に升目の入ったノートで漢字の書き取りをやらされ(つまりカーニングとかに無頓着になる)、読書感想文などの類は原稿用紙で書かされ、漢字は少ない文字数で情報量を詰め込めることからすっきりとした表が書きやすく、何でもかんでも_表にしないと気が済まない_という日本人の悲しい習性に由来する物であろうと思うのだ。
まぁUnixでEmacsしか使わないというのと似たような話ではあるのだが、典型的なEmacsユーザーが扱うのは汎用的なテキストファイルであり、Emacs LISPでがんがんプログラムを書く(設定ですらLISPを書かねばならないので、多少は誰でも書く物だ)人が多い用に思われる。Excelの場合は、XLS形式という特殊なフォーマット(最近のはXMLなのか?)を用い、適当なワークシート関数などを表層的に使いこなしている人が多く、Excelの基本技とも言えるピボットテーブルとかソルバーを使いこなしている人がどの程度いるかと問えば、結構怪しい物だ。
まぁ会社で働いているとこういう病的な世界と常に隣り合わせであり、いつも精神汚染を受けているのであるが、これを前向きに楽しむにはどうすればいいか? ということに焦点を絞り込んで生活しないとやってられないと言うことになるであろうか。
そんなわけでExcelをちゃんと使いこなすにはVBAで遊びまくればいいのであるが、テキストファイルとのつきあいもやめられない。Unixな環境に一度でも触れてしまうと、VBAのお気軽さを楽しんでいても感じる最大の問題点は_正規表現が使えない_と言うところがなやましい。これまで正規表現(とハッシュ)を使うためにVBAからだと駄目だと思い、Active PerlとかActive Rubyとか非VBAでCOMオブジェクトをさわれる言語を選択していたのであるが、書いたプログラムを使ってもらうのに_わざわざPerlだのRubyだのをインストールしてもらわねばならない_という痛い問題があった。Windowsで全然閉じていないのである。Mac OSXみたいにPerlとかRubyがインストールされていればこんなことは考えなくて良いのだが、PerlやRubyを使うのは_Windows的なやり方ではないのである_と言う結論に落ち着いた。
Windows的にどうすればいいのかと言う話なのだが、結局のところ現在のほぼすべてのオフィスにあるWindows環境で前提として良さそうな物は、Internet Explorer 6 SP2とExcelであろうと言うことになる。いろいろ調べているとIE5以降だと、WIndows Scripting Hostが使える。_まてよWSHにはたしか正規表現オブジェクトがあったぞ_と思い出して、さらにCOMで呼び出せるじゃんと言うことを思い出したので、一気にこの方面の悩みが解消した。要はWSHの正規表現オブジェクトをVBAのオブジェクトにしてしまえばいいのである。なんてこったい。こんなので数年悩んでたよ。とりあえず、あるディレクトリにある複数のファイルを選択して、そのすべてのファイルに、入力したパターンマッチをして置換を行うVBAプログラムを書いてみよう。

2005年10月27日 木曜日

何でもかんでもPowerPoint症候群

前の職場は_何でもかんでもExcel_という会社であったが、今の職場はさらに何でもかんでもPowerPointで資料を作る風潮がある何とも言えないところだ。ちょっとした打ち合わせの資料(はっきり言ってグラフだけだったら、不満はあるにせよExcelやDelta Graphのグラフだけで十分)から業務引継まで、何でもかんでも呆れてしまうくらいPowerPointなのである。たしかにプレゼンするときはPowerPointの資料は凄くすっきりまとまって良いのだけど、いかんせんまとまりすぎちゃうのである。 特に業務引継をPowerPointでされちゃうと、あとで見ると項目しか残らないのである。 欲しい情報は項目ではなくて、その詳細なのだがどうして文章を書かないのだろう? 全く持って泣けてくる話である。
Wordを使いこなせとは言わない。どうせ今まであった人で僕以上にWordをちゃんと使いこなしている人を見たことがないので。せめて報告書や引継関係の書類はめんどくさがらずに、テキストファイルでいいからきっちり文章を書いて欲しいのである。
ビジュアルな物にだまされちゃいけない。学生の頃に「ワープロで書くと文章の校正能力が落ちるんだよ」といわれたことがある。綺麗な外見にだまされて中身のチェックがおろそかになるぞという教訓であろうと思うのだが、なんでも綺麗なプレゼン資料にするという傾向はおかしいという状態を越えて、すでに病的であろうと思うのである。(文章のことは人のことを言えるようなレベルには全然到達していないわけだけども。)

2005年04月22日 金曜日

国際化 R(GNU R-2.1.0)

4月18日にリリースされたR-2.1.0では正式にI18N対応になってますね。これまで日本語を使うだけで、それなりの苦労があったけど、今後はそんな苦労も無くなるのね。ああっ、すばらしい… 国際化をされた皆様ありがとうございます。これからがんがん使わせて貰います。ということで、ダウンロードしてみた。

Excel、有効桁が足りないみたい…

昨日の問題を乗り切ったかと思ったら、新たな問題を与えられてしまった。今日の課題は2個の独立変数(x, y)に対する測定値 z を、xとyの3次項までの多項式で当てはめを行いたいとのこと。xとyは10^8程度の大きさなので、3次項まで計算すると3次項の係数を計算するための必要な桁数は結構な桁数が必要だ。Excelで多重回帰してみたけど、欲しい値から若干ずれている。他の系での計算結果と比較すると言うことで、Mathematicaの非線形回帰(NonlinearRegress関数)とRの非線形回帰(nls関数)で計算した結果はほぼ欲しい値と一致しており、Excelでの計算で有効桁がまるで足りてないようだ。この手の計算にはExcelはやっぱ使うべきではないのかもしれない。
まぁ今回の場合は、xとyの値適当にスケールすればいいだけの話だけど…