読者です 読者をやめる 読者になる 読者になる

t-hom’s diary

主にVBAネタを扱っているブログです。

VBAの特徴について ~歴史、利用者層、サポートするパラダイムと型付けの作法など

VBA VBAの研究・考察 プログラミング

これまでVBAについて色々記事を書いてきたけれど、VBAってそもそもどんな言語なのか、自分が学んできたことを整理する意味でひととおり書いておこうと思う。

VBAの歴史をざっくりと説明

VBAの祖先はアメリカのダートマス大学で作られたBASICという教育用言語である。
BASIC(基本)という名前が示すとおり習得が容易であったが、プロから見ると機能的にはオモチャみたいなものだったようで、C、C++C#Javaなどの一部の利用者がいまだにVB派を見下すような発言をするのも、このあたりの経緯が原因と思われる。

さて、MicrosoftがこのBASICを元にQuick Basicという言語を作り、それからVisual Basicを作った。 Visual(視覚の)と付くのは、ボタンやテキストボックスをマウスで配置していくことにより、視覚的にアプリケーションを開発できるから。

他の言語と比べて短期間で簡単にアプリケーションを開発できることから、Visual Basicは業務アプリケーションの開発で主流になっていった。もともと教育用の言語だったことを考えると大出世である。

しかしその習得の容易さからアマチュアプログラマーの人口も多く、中にはプロからすると見るに堪えられないひどいコードもネットを通じて広まっていった。よくVB出身のプログラマーはコードが汚いなんて言われてしまうのだが、まあそれだけアマからプロまで広く使われていたということだから、ある意味仕方がない。

Office製品にもVisual Basicが組み込まれ、Visual Basic for Applicationsとなった。

その後、本家のVisual BasicVB.Netという新しい言語に生まれ変わった。
本格的なオブジェクト指向言語として生まれ変わったVB.Netは、コードの見た目こそVBと似ているけど従来のVBと互換性はなく、どちらかといえばJavaに近いまったく新しい言語である。

同時にMicrosoftからC#が登場した。こちらもコードの見た目はCやC++と似ているけれどそれらとの互換性はなく、まったく新しい言語である。そしてVB.NetC#は見た目こそ大きく異なるものの、本質的には同じ言語で、実はコンバーターを使うとコードの相互変換ができる。

VB.Netはその名前からBASICの時代からの所詮素人用というイメージを引きずっているので、プロの開発者はC#を好む傾向がある。
そして、業務アプリケーション開発では現在JavaC#が主流になっている。

さて、VBAについては、VB.Netへ生まれ変わることもなく、ほぼ本家のVB6.0のまま。64bitに対応してVBAバージョン7になったけれど機能的にはあまり変化はない。

利用者層

すでにVB6.0はサポートを終了していることから、業務アプリケーションの開発者はC#Javaなどの言語に乗り換えている。

ということで現在は、非職業プログラマーの利用者が多いように思う。
なんたって事務員の味方Excelに付いているマクロ機能のための言語なので、事務職の方の利用が多いと思う。

あとは私みたいに学校で本格的にプログラミングを習いつつも、開発職に就けなかったシステム運用担当者とか。

書籍

利用者層に非職業プログラマーが多いことがあり、入門書だらけで中級以上の人が読みたい本があまり無い。

高度な内容を扱う書籍も発売されたことはあるけれど、現在は絶版。
thom.hateblo.jp

ということは、当時はあまり売れなかったということだろう。

独学でプログラミングを学ぶにはVBAはあまり良い書籍に恵まれていないと思う。
VBAで中級以上を目指そうと思ったら別の言語(Javaなど)を通じてプログラミングの本質を学ぶのもひとつの手だ。

とりあえず、他の言語にも興味がある初心者の方にお勧めはこちら。

やさしいJava 第6版 (「やさしい」シリーズ)

やさしいJava 第6版 (「やさしい」シリーズ)

いろんな言語を勉強すると、逆にVBAがわかってくる。

言語的な特徴

命令型プログラミングである

コンピューターに、あれをしろ、これをしろと指示していく、いわゆる普通のプログラミング言語。これの反対として宣言型プログラミングという概念も存在する。

オブジェクト指向を一部サポートしている

クラスモジュールでオリジナルのオブジェクトを作成することができ、オブジェクト指向で最も重要なカプセル化をサポートしてる。

オブジェクト指向は、プログラムをオブジェクトの集まりと見なす考え方やプログラミングスタイルのことであって、言語の特定の機能を指すわけではない。「機能」といわずに「指向」と呼ぶのはそのためである。

オブジェクト指向を言語機能で強力にサポートしているものを、オブジェクト指向言語と言うが、VBAオブジェクト指向の三大機能のひとつである継承をサポートしていないため「オブジェクト指向言語」には分類されない。

ちなみにポリモーフィズム(多態性)はインターフェースを使えばできるけど、VBAでインターフェースが使えることはあまり知られていない。
thom.hateblo.jp

弱い静的・動的型付け言語

静的型付けというのは、簡単に言えば変数が型を持っている言語のこと。
動的型付けというのは、変数の型は決まっておらず、中のデータによって型が決まる言語のこと。

たとえば次のコードはエラーになる。

Dim a As Integer
a = 10
a = "Hello"

しかし、変数宣言を省略するとエラーにならない。

a = 10
a = "Hello"

前者が静的型付け、後者が動的型付けである。
この他に、Variant型で変数を宣言したり、変数の型を省略したりすると動的型付けになる。

たいていの言語は静的か動的かが決まっている。
C言語などの静的型付け言語は変数宣言しないでコードを実行することはできないし、宣言時に型を決めておく必要がある。PHPなどの動的型付け言語は、そもそも変数宣言が存在しない。

どっちでもできるVBAは変わり者だ。

あと、弱い型付けというのは、型のチェックがユルいことを指す。

たとえば「a = "10" * 3」と書いたとき、文字列の"10"を数値の10と解釈して30という答えを出してしまうのが弱い型付け。反対に、文字列と数字は掛けられません!とエラーになるのが強い型付け。

強い型付け言語で「a = "10" * 3」のようなことをするには明示的な型変換が必要。これをキャストという。ちなみにVBAにもキャスト関数があり、文字列"10"を明示的に整数型に変換するには次のように書く。

a = CInt("10") * 3

ただし、VBAでは暗黙の型変換が働くのでキャストしなくても答えは30と出る。

インタープリター型かコンパイル型か

VBAは一行書くごとにコンパイルされる。
VBAの本じゃないけど、こちらに書いてあった。著者のJoelさんはMicrosoftExcelチームのプログラムマネージャとしてVBAの開発にも携わっていたとのことなので間違いない。

Joel on Software

Joel on Software

しかし機械語コンパイルされるわけではなく、内部でPコードという中間コードにコンパイルされているらしい。そしてPコードの実行自体は、インタープリターとして動作する。

結局、インタープリター型でもあり、コンパイル型でもあるということらしい。

【参考】VBAはインタプリタ?コンパイラ?

※上記参考記事のサイトは他にも面白い記事を扱っているのでおすすめ。
 トップページはこちら → http://addinbox.sakura.ne.jp/

まとめ

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。