2003年08月06日 水曜日

今日のVBAとの闘い

前回のVBAとの闘いでは、Cで言うところのsscanf()みたいな関数がないので、テキストファイルからの入力は不便じゃのうという話だった。普通のExcelのユーザ(VBAを使いこなしている人はすでに_普通の人ではないと言う意見はあるが_)は、CSVなファイルもExcelで開いてから、VBA側でセルを参照して値を取り出すのかな? 僕はそういうデータ構造を考えないプログラムを書く趣味を持ち合わせていません。
今回の闘いは、まともにCollection系のライブラリが欲しいという話。ちょっと考えてみると、文字列をKey、構造体をValueとするHashを使えれば、一発でおしまいという話だったのだが、VBAやVBっていまいちCollection系のデータ構造がまるでないので、いかんせんいろいろと貧弱すぎだなぁと思うのよね。結局配列で非常に安直な実装にしたのだが、どうにかならんもんかね。VBプログラマはデータ構造なんて考えてプログラムをしないのかねぇ。で、あらかたプログラムを書いた後に、

1. Collectionオブジェクトを使うパターン

Dim data as Variant, key as Variant
Dim lst as new Collection
' 要素の追加
lst.add data, key
' 要素の取り出し
dat = lst.item(key)

2. それらしいクラスライブラリを使う(おおーこんなのあったのね!)

Visual Basic Foundation Class Library for Windows
というちょっと不完全だけどいくらかマシという方法を見つけてげんなりしてしまった。見つけたいものが簡単に見つからず、それでいて見つかっても不完全かなというところがVBAのVBAたる所以か。
いずれにせよObject型の利用なので、Classモジュールのお世話にならざる得なくて、それだったら_VBでなくてもいいやん!_という感じである。VBAは今のところVisual Basic 6系(OfficeXPまで)なので、VB.netのOOPの恩恵を受けられないのでそれなりにクラスを使うのはめんどい。(VB.netはクラスの継承は出来るみたい。それなりに使えるだろうかなぁ。) ただあの奇妙で難解で、それでいて資料が少ないClassモジュールに、僕はお付き合いしようと言う気にはやっぱりなれないし。今回の闘いは、_そんなおがわさんに、C#のような.netなOOP言語を使え_という神のお達しだったのだろうか…
あとVBAなソースの履歴管理ってみんなどうやっているんだろう? (やっぱDevelopper EditionのVisual Source Safeを使っているのかな?) 結局、Rubyやperlを使いたくても、追加のインストール作業を要するので、Excelのファイルを作るなら、どのPCにもインストールされているらしいVBAを使わざる得ないところが救いのないところ。