VBA

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年05月18日 木曜日

OutlookをRSS Readerに

メーラーのOutlook Expressではなく、PIMとしてOfficeの一角であるOutlookもVBAでプログラミングできるのであるが、いままでOutlookのVBAなんてウィルスを作成することくらいしかないんじゃないかと思っていたのである。そんなものいらんなと思っていたわけであるが、やっぱりマクロが使えると便利なので、設定に気を使って便利なものは使いましょう。
会社のPCへのソフトのインストール権限が無いことと、会社のサーバがどうもMicrosoft Exchange Serverで、会社内でスケジュールの公開とかもやっているっぽいので、デフォルト環境のOutlookを使う羽目になったのですが、Thunderbirdを使い込んだ後にOutlookを使って思うのは、_OutlookでRSS Readerが無いじゃない_というところ。まぁアドインとかを購入すればいいのだろうが、時間があったのと「OutlookをVBAでRSSリーダーにする」という記事があったので、VBAで書いてみることとした。codezine.jpにはアカウントを持っていないし、作る気も無いのでWebで公開されているソース片を元にいろいろ書き足してみた。自分で使うにはおおむね問題ない仕上がりにはなった。
ざっくり試したところRSS 0.9xとRSS 1.0では大体問題なくRSSを取得し、記事単位でメールにしてくれる。後の閲覧はメールと同じ。未読管理もOutlookにお任せできる。atomはXMLではなさそうな感じなので、別の枠組みが必要そう。こんなプログラムが1時間くらいで書けるというところが、福森さんがおっしゃるところのコンポーネント化の福音なのであろう。

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年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年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」のディレクトリの中の「プリセット」ディレクトリの中にある「スクリプト」ディレクトリに適当な名前を付けてコピーする。

2004年12月31日 金曜日

今日で2004年もおしまい

毎年こんな見出しで大晦日の日記を書いているわけだが、ついこないだ2003年もおしまいどころか2002年もおしまいなんて言う記事を書いた気がするのは気のせいではない。今年は転職・引越しと人生の転機となる大きな変化のあった1年で、住環境や人間関係もがらっと変化して、めまぐるしい変化があった1年だった。気が付くともう今年もおしまい。今年お世話になった方々はいっぱいいて名前を挙げきれないが、今年1年本当にありがとうございました。来年もよろしくお願いします。
大晦日と言うことで、行く年に思いをはせ、今年はどういう戦いの1年だったか、今年の戦術・戦略とその戦いの成果を主要な分野別にまとめておこう。(と、ほぼ毎年と同じ文章にしてみた。こういうのは毎年そろえておいたほうがよいもので、断じて_手抜きではない_。)

2004年の総括

はじめに概況

2004年の戦況がどのようなものであったか述べていくことにする。前の会社の上司の年賀状には_今年は攻めと成果_と書かれていたのだが、個人的には攻めに攻めた1年だったかと思う。アクティブに変化を求めて行動したが、いまいち成果があったとはいえない。まぁ来年あたりから取り返していきたい。今年から技術系よりは研究系に寄った立場になったので、より注意して形になるように成果を残さねばと思うのである。(これは特に本業について言える話。)
経済的な状況は現段階でほぼ解決した状況(今年はでかい収入と出費があって、これまでのごたごたはほぼ解決したといってよい) 今後は多少余裕はできると思うので今年あたりからちゃんと貯蓄に励もうと思う。なかなか自力で解決できないのだが、残りは車のローンくらいだし…