はじめに
WEB+DB PRESS Vol.49 の特集1『~システム開発を成功させる「繰り返しの排除」原則~現場で役立つ DRYの基礎知識」第4章で、「 実践DRY! Excelによる知識の集約」と題してVBAを使ったExcelの活用について解説しています。本稿では、そこで掲載した内容をさらに活用していただくため、Excel活用のためのVBAの基礎知識について解説します。
操作方法や画面キャプチャなどはExcel 2007を利用しますが、勘とイルカを活用すれば、Excel 2003などでも同様なことができますので、ご自身のオフィス環境に合わせて適宜読み換えてください。
簡単でDRYなVBA入門
WEB+DB PRESS Vol.49のDRY特集では、VBAを使ってExcel仕様書を操作すればDRY原則が守れる、という趣旨の解説をしました。それは、本誌の読者の大半は、「 Excel……ケッ」という感じでの付き合いしかしていないのではないか、当然、JavaとPOIで操作はしても、VBAで操作できたりそれなりのIDEが組み込まれていたりすることは知っていても触ったこともないのではないか、という想定があったからです。そうした方にもVBAによるExcel操作について理解していただくため、ここではExcelのマクロ言語であるVBAとはどういうプログラミング言語かを説明します。
VBAとは何か
まず、用語の整理ですが、Microsoftのプロダクトで、現在、普通に利用できるVBには次の4種類があります。
VBScript
Internet Explorerの制御、ASP(ASP.NETではなく)の制御に利用できるスクリプト言語で、ActiveScript仕様に基づいたCOMのコンポーネントです。VBScriptは、ビジネスシーンで、IEの制御用として良く利用されています。そのため当面フェードアウトはしないとは思いますが、レガシーです。
言語仕様としては、次のVisual Basic 6.0(VB6)のサブセットです。
VB6
一応、まだ現役のコンパイラ言語です。言語仕様としては、ほぼ後述するVBAと同等です。ただし、完全にレガシーな存在です。しかし、単にVBと言った場合、VB6を指すことがあるくらい、完成度と普及度を誇ります。
VB7以降(VB.NET)
現在、本来であれば「VB」という言葉が示すプログラミング言語ですが、いまだに単にVBと言うとVB6の意味になるところが問題です。
いずれにしてもVB7以降のVBは、CLR(.NET Framework)上で動くIL(Intermediate Language;中間言語)を出力するコンパイラ言語です。しかも調べるとわかりますが、よくできたプログラミング言語です。ただし、次々と新しい機能を取り入れて変化を続けるC#の陰に隠れて、実際の利用状況などはよくわかりません。筆者の勤め先でも、C#は利用していますが、VBを使った開発というのは(VB6のメンテナンスは別として)見かけません。もっとも、話で聞く分には、.NETへ移行した企業の大半はVBを使っているらしいです。
VBA(Visual Basic for Applications)
MS Officeに統合されているマクロ言語です。言語仕様としてはVB6に相当します。EUC(エンドユーザコンピューティング)に広く深く使われているという話は聞きますが、意外なほどエンジニアは無視することが多いようです。実際、筆者も5年前くらいまでは、Rubyで操作することはあってもVBAを使うという発想は持っていませんでした。しかし、この記事を書きたくなるくらい、現在ではまずVBAでできないかを考えるように宗旨替えをしました。
ExcelをCOMサーバとして利用できるのは、これらすべてのVBですが、Excelが組み込み言語として利用できるのはVBAだけです。しかも、VBAであれば、オフィス文書に統合できるため、配布の問題を考えなくても済みます。しかし、セキュリティ制約には抵触するかもしれません。
コラム DRY原則と知識の獲得
ここまで読んで、「 いや待て」と思った方も、おられるのではないでしょうか。
私はJavaのエキスパートで、最近Rubyも使えるようになった。何が悲しくてVBを学習しなければならないんだ? というようなことです。Java、Ruby、VBといったALGOL系のプログラミング言語は、基本的な制御構造などは、どれもほとんど同じですので、学習といっても大したことはないということは別にしても、あまり、自分の使う技術については枠は作らないほうがよいと思います。
DRY原則を、「 知識集約」という言葉だけで理解すると、1つのプログラミング言語に専念したほうが原則的に正しく感じるかもしれません。しかし、それは勘違いというものです。知識を集約すべきは、あくまでも「システム内」です。エンジニアの脳内は別の話です。
書籍『達人プログラマー』では最初の章(まだDRY原則について言及する前です)で、「 知識ポートフォリオという観点からプログラマーが持っている、コンピュータ、仕事をしているアプリケーション領域、すべての経験について考えていくことにしましょう」と書いています。ポートフォリオという言葉が示すように、技術習得は、投資なのです。
その観点から、まだ当分Excelを利用する可能性があるのなら(たぶん、あると考えたほうがよいでしょう) 、Excelに投資するのはまったく正しいことです。ただし、成長株というわけではないので、メニューのあらゆる項目から、すべての設定方法まで、イルカのように知り尽くすまで投資するのは、控えたほうがよいとは思います。
VBAの用意
既定の状態では、Excelの開発者サポートメニューは無効になっています[1] 。したがって、最初に行うことは、リボンに[開発]タブを表示することです。
リボンに[開発]タブを表示するには、以下の手順で行います。
Officeボタン(左上の丸いボタン)をクリックして、表示されるメニュー右下の「Excelのオプション」をクリックして、「 Excelのオプション」ダイアログを表示します。
「基本設定」から「[ 開発]タブをリボンに表示する」にチェックを入れてOKをクリックします(図1 )
図1 「 Excelのオプション」ダイアログ「基本設定」
以上で、リボンに[開発]タブが表示されます(図2 ) 。
図2 [ 開発]タブ
リボンの[開発]タブの最左のアイコン(Visutal Basic)をクリックすると、VBAのIDEが起動します(図3 ) 。
図3 VBAのIDE
このIDEの中で、以下の作業が行えます。
コードの編集とソースレベルデバッグ
フォームのデザイン
また、作成可能なVBのソースファイルは、モジュール、クラス、フォームの3種類です。
標準モジュール
関数やグローバル変数を定義するために利用するソースファイル
クラスモジュール
メソッドとインスタンス変数を持つ、文字通りクラス用のソースファイル
ユーザフォーム
ポップアップウィンドウのGUIによる表示定義とイベントハンドラ用のソースファイルの組み
これらは、ウィンドウ左上のプロジェクトエクスプローラで、右クリックし、コンテキストメニューの「挿入」を選択することで、Excelブックに追加できます。
詳細については、実際のプログラミングで必要になった時点で説明をつけ加えます。
なお、Excelを始めとしたMS Officeのオブジェクトモデルのリファレンスは、MSDNで参照できます[2] が、VBAというプログラミング言語の仕様については、Officeのヘルプファイルをインストールしなければ参照できません。ただし、http://msdn.microsoft.com/en-us/library/aa338033(VS.60).aspx から参照できるVisual Basic 6.0ランゲージリファレンスのFunctions(関数)とStatements(ステートメント)はVBAでもほとんどそのまま利用できます。
VBの基本的な文法
ここでは、以降で掲載するリストを読むのに最低限知っておいたほうがよい文法についてのみ説明します。個々のステートメントや関数については、リストで利用した時点で説明します。
VBは、大文字、小文字を区別しません
ステートメントなどは、IDEが必要に応じてキャピタライズするので、すべて英小文字で入力すれば問題ありません。
ステートメントは、改行または、:で区切ります
ただし、: を使って1行に複数のステートメントを記述することは、行うべきではありません。
VBは、「関数(Function)」と、「サブルーチン(Sub)」を厳密に区別します
関数: 値を返す
サブルーチン: 副作用を利用する
以降、「 関数」という表記は両方を示します。それぞれについてはFunctionまたはSubと表記します。また、呼び出し時は、Functionについては関数名の後ろに「()」を記述し、サブルーチンについては「()」を記述しません。
関数パラメータの扱い
既定では、VBの引数は参照(アドレス)が渡されます。値を渡すには、ByValキーワードで仮引数を修飾します。
代入
VBで変数に値を代入するには、COMのオブジェクトについてはset、それ以外についてはlet(ただし省略可能)を利用します。Schemeなどの代入(set)と変数束縛(let)とキーワードは同じですが、異なる意味です。
継続行
VBで行を継続するには、「 _」を利用します。
文字列の結合
VBの文字列結合には、「 &」を利用します。Javaと同様に、文字列以外の型のデータについては暗黙の型変換が行われます。
基本は関数
VBはオブジェクト指向プログラミング言語ですが、文字列はプリミティブです。そのため、文字列の長さを求めたり、部分文字列を取り出したりするには、関数を利用します。
変数のスコープ
VBの変数には、大域変数(関数外で宣言)とローカル変数(関数内で宣言)の2種類のスコープがあります。ブロックに相当するスコープはありません。
アクセス指定
VBの関数は、PublicキーワードまたはPrivateキーワードを関数定義に前値することで可視性を指定できます。
Excelブックから実行する関数は、Publicかつ無引数に設定する必要があります。ただし既定ではすべてPublicとなるため、直接実行しても意味がない無引数のサブルーチンにはPrivateをつけてください。そうでないと、Excelからマクロを実行するときに、無意味にマクロ名がリストボックスに表示されてしまいます。
まとめ
この記事では、ExcelでVBAを使うための最初の一歩に相当する部分を説明しました。
VBAは、筆者が普段使っているRubyやC#やJavaに比べると、悲しいくらい冗長で、低機能なプログラミング言語です。しかし、簡単にフォームを使うことができ、インテリセンスを利用してルーズにExcelのオブジェクトを操作するコードを記述でき、しかも、文書と統合できるというメリットがあります。
特にExcelで文書を作る必要がある開発者であれば、VBAを覚えておくと、きっと良いことがあります。つまり、まあ、文書作成の自動化ということです。
それに、エンドユーザコンピューティングという観点からの「良いプログラミング言語」というものを学習することもできるかも知れません。その学習結果を何に、どうフィードバックするかは自分で考えるべき問題です。
では、ハッピーOfficeライフを。