似て非なる3つのVisual Basic

たくさんのプログラミング言語がある中で、「最新で流行りの」ナウなヤングにバカウケ…とは言えない言語として、Visual Basicという遺産があることを過去の記事で紹介しました。

「最新で流行りの」プログラミング言語を学んでレッドオーシャンに飛び込むもよし、企業が脈々と保守し続けている古い遺産のようなプログラミング言語を学んでブルーオーシャンで優雅な地位を確立するもよし。

いずれにしても、プログラミング言語は適材適所。プログラミングによって何を実現するのか、どんなものを作るのかによって、そこで使う言語は変わってきます。Webページを作りたいのにC言語を学んでも意味が無いし、逆にマシン性能を限界まで引き出すような科学技術計算アプリを作りたいのにJavaScriptを学んでも意味がありません。どの言語もそれぞれ、必要とされるところで使われている。ただそれだけのことです。

さて、そんなわけで、何の因果かVisual Basicというプログラミング言語に触れることになったアナタ。

実は一言に「Visual Basic」と言っても、中身が全然違う3種類のVisual Basicが存在します。間違った書物で間違った勉強をしてしまわないよう、この3種類の違いをしっかり把握しておきましょう。

スポンサーリンク

Visual Basic 6.0

単にVisual Basicと言ったとき、それはこのVisual Basic 6.0を指すことが多いです。

VB6

「Visual Basic」というブランド名は1991年からありますが、これが今の形になったのは1995年のバージョン4.0からです。そしてさらに機能強化を重ね、1998年のバージョン6.0で一つの完成形となります。

時はWindows95~Windows98SE全盛期。まさにWindowsが最も栄えていた時期です。

次のバージョン7.0にあたるものはVisual Basic .NETと名前を変え、全く別物となりました。この2002年以降のVisual Basic .NETはVisual Basic 6.0までと中身が大きく違ったため、プログラマーの多くはその変化に付いていけませんでした。その結果、「.NET」ではないほうのVisual Basicも、バージョン6.0のまま遺産としてずっと生き残り続けることになります。

さて、このVisual Basic 6.0には2つの大きな特徴があります。

1つ目は、プログラムを作るのがとても簡単だということ。例えばこんなアプリを考えてみましょう。

アプリ例

入力ボックスに金額を入れて、「当選!」ボタンを押すと、「○○円当選、おめでとう!」とメッセージが出るアプリです。宝くじに当たった気分になれますね!

このアプリを作るためには、まず画面を作らなくてはいけません。Visual Basicでは、入力ボックスやボタンなどをフォームデザイナ上でマウスで貼り付けたりするだけでOKです。当たり前のように思えるかもしれませんが、Windowsが直接提供する機能だけを使ってこのような画面を作ろうとすると、これだけでも30~40行のコードが必要になってしまいます。

また、「ボタンを押したときに何らかの処理を行う」ということを実現するには、Visual Basicの場合はCommand1_Clickというプロシージャ(メソッド、関数とも言う)を作るだけでOKですが、これもWindowsの機能だけで実現しようとすると、まずメッセージループというものを書かなくてはいけません。

1995年当時、上級者向けのWindowsアプリ作成プログラミング言語であったVisual C++を使って同じようなことをしようとすると、とても多くのコードを書かなくてはいけませんでした。それがVisual Basicを使えば、ここまで簡単に同じことを実現できるようになります。これはとても画期的なことでした。

Visual Basicのもう1つの特徴は、これだけ簡単にWindowsアプリを作ることができるというのに、上級者向け言語のVisual C++と比べて全く遅れを取っていないというところです。

「遅れを取っていない」というのをもう少し厳密に言いなおすと、Windowsが提供する全機能を使うことができるネイティブアプリを作成できるということです。

ネイティブアプリ

単に「簡単にアプリを作ることができる」というだけなら、機能を限定した簡易アプリを作ることができる簡易言語というものもありました。しかしこれは、その簡易アプリ専用の実行画面の上でしか動作しなかったり、Windowsのコアな機能にはアクセスができなかったりと、制限がたくさんありました。

また、現在主流となっているWebアプリも、機能が制限されているという意味では同じです。例えばWebアプリでは、最も基本的と言えるファイル操作でさえ、厳しい制限が付いています。ただしWebアプリの場合は、技術的に困難だからではなく、セキュリティの観点から敢えて機能制限されているというのが大きな理由です。

一方のVisual Basicはネイティブアプリなので、OSの機能に直接アクセスすることができます。ファイル操作はもちろん、Windowsのシステムファイルの読み書きを行ったり、USB接続された機器を直接操作したり、とにかくなんでもできます。電子計算機損壊等業務妨害罪に抵触するかしないかを問わなければ、ハッキングさえもできてしまいます。(※良い子は真似しちゃダメよ)

それまでは、ネイティブアプリを作るのは上級者向け言語のC++の役目でした。しかしそれが1998年、ついに初心者向け言語のVisual Basicでもできるようになりました。そうして、この時期に参入したプログラマーやソフトウェア開発企業の多くが、Visual Basic 6.0を使うようになりました。

登場から20年以上経ち、メーカーサポートもとっくに終了していますが、それでも今もなお、Windowsアプリ開発言語の金字塔Visual Basic 6.0は今でも生き残り続けています。

Visual Basic for Applications

俗に言う、VBA。VBAの言語仕様はVB6のサブセット(機能縮小版)であり、多くの部分がVB6と共通しています。「文法」という意味での言語仕様だけでなく、内部のアーキテクチャという意味での言語仕様もVB6の仕様に則っているため、ほとんど同じとみなしてもいいでしょう。

ただ根本的に違うのは、VBAはMicrosoftのOffice製品(Excel、Word、PowerPointなど)上で動作するプログラミング言語だということです。

遠い昔、Excelなどで何らかの反復動作をさせたいときは、「マクロ」というものを使いました。やがてExcelが表計算ソフトのシェアナンバー1となって広く普及し、複雑な反復動作をさせたいという要望が高まり、「だったらプログラミング言語でプログラムを記述すればいいじゃないか」という流れになりました。

そこで使う言語は何でもよかったんですが、Microsoftは当然、自社のVisual Basic推し。かくして、Excel等のOffice製品の中でVisual Basicを扱えるようになりました。これがVisual Basic for Applications、略してVBAです。

VBA

Excelワークシート上の「ボタン1」を押すと、A11のセルにA1~A10の合計値をセットするというVBAのプログラムがこちら。(※この程度ならSUM関数使えよって話ですが、あくまでVBAの例なので、ご容赦を。)

VBAはVBのサブセットです。つまり、VBの進化と共にVBAも進化してきました。2002年、VBがVB.NETとなり、MicrosoftはVBAも.NETベースに進化させようとしたのですが、.NETはこれまでのVBとはかなり違う部分があります。Excelというのはプログラマーだけではなく、多くの人が日常的に使う表計算ソフトなので、「今日から新しい.NETってやつを覚えてね」なんていきなり言われても誰も対応できませんでした。

プログラマー本職の人でさえ多くの人がVB6.0からVB.NETへ移行していないのに、非プログラマーの人が.NETへ移行できるわけがない。

その結果、VBAは2020年の時点でもなお、20年以上前のVB6.0の流れを汲んだVBA7.1というバージョンのまま止まっています。

そんなこんなのVBAですが、2020年の時点の今でも、Excelシートにちょちょいとプログラミング的要素を追加するときには大きな威力を発揮します。技術職・営業職・事務職を問わず、パソコンを使って仕事をする全ての人にとって、面倒な仕事を短時間で終わらせるための有益な解決法を、VBAは与えてくれます。

プログラマーが本職でなくても、VBAを一通り覚えておけば、「おおっ、きみは仕事が速いねぇ」と言われるようになるかもしれません。余った時間は、昼寝をするもよし、おやつを食べるもよし。

Visual Basic .NET

前述の通り、Visual Basicというブランドはバージョン6.0で一旦完結し、それ以降はVisual Basic .NETと呼ばれるようになります。

VB.NET

.NET以降は「バージョン○○」ではなく、リリースされた西暦でバージョンを表します。厳密には言語仕様バージョン、CLRバージョン、開発環境のVisual Studioのバージョンを別々に考えなければいけませんが、ざっくりとVisual Studioのバージョンで年代を区切ると、2002、2003、2005、…と経て、2020年時点での最新版は「2019」となります。

そして、.NETの登場と同時に、C言語の文法の流れを汲んだ「C#」が登場し、Visual C# .NETとして、Visual Basic .NETと肩を並べて進化してきています。

さて、この「.NET」とは何ぞや? ということですが、.NETというのは「.NET共通言語ランタイム(CLR)」という巨大なフレームワークの中で動作するプログラミング言語と理解しておくとよいでしょう。

CLR

Visual C# .NETやVisual Basic .NETで書かれたプログラムは、一旦CLRが解釈できる中間言語というものに変換され、OSの機能にアクセスします。

これだけを見ると、先ほどの簡易アプリやWebアプリのように「機能が限定された非ネイティブアプリ」のように思われるかもしれませんが、この.NET共通言語ランタイム(CLR)はもっと巨大なものです。つまり、OSの機能を何ら限定することなく、OSの全機能を全てCLRがカバーしています。そして、それでもカバーしきれない部分については、プラットフォーム呼び出し(P/Invoke)という方法でOSに直接アクセスできます。

その意味で、.NETという仕組みは十分にネイティブである(=OSの機能を全て使うことができる)といってよいでしょう。

このように途中に一旦中間言語を挟むやり方は、Javaがその先駆けでした。もともと、OSの違い(Windows、Mac、Linuxなど)によらずに同じプログラムを書くことができれば便利だ、という発想から、このような仕組みが考え出されました。他にもいろいろ利点はあるのですが、とりあえず最近の主流はこういう仕組みだ、とだけ覚えておいてください。

さて、この2002年にMicrosoftが作り出した.NETという仕組み。この.NET上で動作するプログラムを記述するためのプログラミング言語として、MicrosoftはC#という新しいプログラミング言語を作り出しました。C#が、.NETのための主流の言語ですよ、と。

しかしそれだけでは、Visual Basicのプログラマーが行き場を失ってしまいます。そこで、.NETのためのVisual Basicも同時に登場しました。それがVisual Basic .NETです。

このVB.NETは、VB6プログラマーにもとっつきやすいように、ほぼ同じような文法で記述することができます。しかし、内部では.NETという新しい仕組みが動いているため、ところどころ違う部分もあります。この違いが、VB6プログラマーを挫折に追いやってしまいました。.NETは難しい、と。

その反面、VB.NETもまた.NET上で動作するプログラムを記述するためのプログラミング言語なので、記述できることに制限があってはいけません。VB.NETはそういう設計思想なので、C#.NETと完全に同じことができるようになっています。

言語の関係

VB6.0もVB.NETも、例えば「Private Sub~End Sub」の中に処理を記述する点は同じです。一方のC#.NETは、「private void {」で始まり「}」で終わるという、C言語から受け継がれてきたカッコ書き「{ }」で記述します。

文法面だけを見るとVB.NETとC#.NETは別物に思えるかもしれませんが、実はこの2つは兄弟のような関係であり、全く同じプログラムです。一方のVB6.0とVB.NETの関係は、見た目こそ似ているものの、「.NET上で動くか否か」という点で、似て非なるものです。

がっつりプログラミングを行うためには、プログラムがどのように動作しているかを知らなければいけません。ガベージコレクション、配列の扱い方、例外処理、クラスという概念、などなど。VB6.0プログラマーにとってVB.NETは、これらを新たに学ぶ必要があるという、全く異質のプログラミング言語だったのです。

.NET時代のVisual Basic

VB.NETというのは、旧来のVB6プログラマーを引き込むために登場した言語です。しかしVB.NETを使ってがっつりとプログラミングを行うためには、まずベースとなる.NETというものをしっかり勉強しなくてはいけません。

であるならば、この際VB6からC#.NETへ移行しても、勉強のコストはそれほど変わりません。今後も発展していくのはどちらかといえばVB.NETよりC#.NETのほうです。かつてVB6プログラマーだった方や、今現在VB.NETプログラマーの方は、ここらでC#.NETに移行してみてはいかがでしょうか。

C#.NETさえ覚えておけば、VB.NETは文法の違いでしかありません。もしVB.NETを使わなければいけないプロジェクトに配属されても、容易に両方を使いこなすことができるはずです。

3つのVBを混同しないように

「Visual Basic」の名の付く3つのモノを紹介してきました。

まずはVisual Basic 6.0(VB6)。1998年の登場を最後に進化は途絶えていますが、簡単にWindowsアプリを作ることができるプログラミング言語の金字塔として、今もこれが稼働しているシステムは少なくないです。

Excel等のOfficeアプリ内で動作するVisual Basic for Applications(VBA)は、VB6とほぼ同じものです。Excel等をより便利に使いこなしたいときに、VBAの知識はきっと重宝するでしょう。

そして、旧来のVB6の考え方を捨てて新しく登場したVisual Basic .NET(VB.NET)。名前こそ「VB」ですが、これはVB6の後継というよりは、C#の兄弟と言った方がいいでしょう。現在のWindowsアプリは.NET上で動作するものがほとんどであり、VB.NETも現役で活躍しています。

例えば何らかの求人サイトで、「Visual Basicプログラマー募集」と書いてあったとしましょう。

それはVB6.0のことを指すのか? それともVBAのことなのか? あるいはVB.NETのことなのか?

この違いをしっかり把握しておかないと、思っていたのと違うVBをやるハメになった、全然わからない、どうしよう…なんてことになりかねません。

3種類のVisual Basicは、似て非なる全くの別物。間違えないように注意しましょう。

スポンサーリンク