Visual Basic for Applications

概要

マイクロソフトが1990年代に開発していた汎用プログラミング言語・Microsoft Visual Basicを、同社製品のMicrosoft Officeに搭載したものがVBAである。VBAを使用することで、Excel、Access、Word、Outlook、PowerPointなど、Officeのアプリケーション・ソフトウェアの機能をカスタマイズしたり、拡張したりすることができる。
Microsoft OfficeシリーズにはVBAのソースコード作成・編集ソフトウェアおよびプログラム実行環境が最初から付属しているため、使用を始めるにあたり、Office以外の特別なソフトウェアの用意やセッティングを必要としない。文献やネット情報も多く、最低限の学習で誰でも手軽にプログラミングが始められる。また、プログラムの実行が容易なことも特徴である。C言語などではソースコードを書き上げてからコンピュータに実行させる前に機械語に変換して実行プログラム形式として出力するためのコンパイルおよびリンク（ビルド）作業が必要だが、VBAは疑似コード (Pコード) ベースのコンパイラ型およびインタプリタ型両方の性質を持っており、ユーザーが記述したソースコードを1アクションで自動的に疑似コードにコンパイルして直接コンピュータに実行させることができる。手軽に利用できる一方で、汎用プログラミング言語に共通の機能は一通り備えており、高度な機能まで修得しようとすると相応の学習が必要である。

近年の動向

2007 年 7 月 1 日以降、マイクロソフトは新規顧客への VBA 再配布ライセンス提供を停止した。マイクロソフトは、.NET Framework のリリース以降、ずっと VBA に .NET ベースの言語を追加しようとしてきた。.NET Frameworkバージョン1.0 および 1.1 には Script for the .NET Framework というスクリプト ランタイム テクノロジが搭載されていた。また、Visual Studio .NET 2002 および 2003 SDK には、VB.NETをサポートする Visual Studio for Applications (VSA)という別のスクリプト IDEが含まれていた。 VSAの重要な特徴の一つは、Active Scripting (VBScript および JScript)を通して利用が可能であり、.NETが使えないアプリケーションを.NET 言語を使用してスクリプト化することができたことだった。しかし、VSA は、Active Scriptingのサポートを望むアプリケーションの明確なアップグレード パスがないまま.NET Framework のバージョン 2.0 でサポート対象外となった。 (C#、VBScript、他の.NET言語で「スクリプト」の作成は引き続き可能で、ランタイムの一部としてインストールされたライブラリを介して実行時にコンパイルおよび実行することはできる。)
マイクロソフトは、Microsoft Office 2008 for Mac でVBA サポートを一度廃止した。しかしMicrosoft Office for Mac 2011 でVBA は復活することとなった。マイクロソフトは、Windows バージョンの Office から VBA を削除する計画はないと述べている。
Office 2010 では、マイクロソフトは真のポインター データ型 LongPtr をサポートする VBA7 を導入した。これにより、64 ビットのアドレス空間を参照できるようになった。Office 2010 の 64 ビット インストールでは、MSComCtl (TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListViews, ImageList, Slider, ImageComboBox) および MSComCt2 (Animation, UpDown, MonthView, DateTimePicker, FlatScrollBar)といったコモンコントロールに依存するレガシーな32ビットコードは64ビットVBAコードに移植しても機能しない。これは、32 ビット バージョンの Office 2010 では発生しない。 VBA7 には 64 ビットバージョンのコモンコントロールが含まれていないため、開発者は VBA アプリケーションを 64 ビットに移行する手段がないことになる。マイクロソフトでは、64 ビット バージョンの VBA コントロールについてソフトウェア ベンダに問い合わせるように誘導している。

コード例

以下は、Excelにおいて、「Alpha」という名前のワークシートを削除するVBAの例である。
Application.DisplayAlerts = FalseWorksheets("Alpha").DeleteApplication.DisplayAlerts = True
また、Excelで以下のコードを実行すると、セルA1からI9の範囲に掛け算九九の表を作成することができる。
For i = 1 To 9
    For j = 1 To 9
        Cells(i, j).Value = i * j
    NextNext
下記のように配列を用いて、全ての値を配列に格納した上で一度に出力するように上記のコードを書き換えると、高速に動作するコードになる。
Dim KukuArray(8, 8) As IntegerFor i = 1 To 9
    For j = 1 To 9
        KukuArray(i - 1, j - 1) = i * j
    NextNextRange("A1:I9").Value = KukuArray
条件によって4色以上に色を塗り分けるときも、VBAを利用する（3色以下のときは一般機能の「条件付き書式」を使用するのが望ましい）。以下のコードを実行するとセルB2からE15までの範囲内のセルを5以下→水色、6以上10以下→明るい緑、11以上15以下→黄色、16以上→赤と塗り分けることができる。
Dim myCell As RangeFor Each myCell In Range("B2:E15")
    Select Case myCell.Value
    Case Is <= 5
        myCell.Interior.Color = RGB(0, 255, 255)
    Case 6 To 10
        myCell.Interior.Color = RGB(0, 255, 0)
    Case 11 To 15
        myCell.Interior.Color = RGB(255, 255, 0)
    Case Is > 15
        myCell.Interior.Color = RGB(255, 0, 0)
    End SelectNext
以下は、VBAと共にExcelごとプログラムを終了するVBAの例である。
Application.Quit

ユーザー定義関数

VBAを用いて、ユーザーが新たに関数を作成することもできる。ユーザー定義関数を作成するにはFunctionプロシージャを用いる。以下はHERONという名でヘロンの公式を用いるユーザー定義関数のコードである。実用には、負の値や三角条件を満たさない値が入力されることを想定して、下記のコードにエラー処理ルーチンを追加しておくことが望ましい。
定義したユーザー定義関数は通常の（組み込みの）ワークシート関数同様、数式の中で用いることで呼び出す。この例で言えば、=HERON(3,4,5)とセルに入力すると、数式を入力したセルに演算結果として6と出力される。
Function HERON(辺1, 辺2, 辺3) As Variant
    
    s = (辺1 + 辺2 + 辺3) / 2
    HERON = Sqr(s * (s - 辺1) * (s - 辺2) * (s - 辺3))End Function

VBAのセキュリティ問題

他の一般的なプログラミング言語と同様に、VBA では悪意のあるマクロウイルスを作成できてしまう。VBA では、セキュリティ機能のほとんどは作成者ではなくユーザーの手に委ねられる。VBA のホストアプリケーションでは、ユーザーはオプションを事前に設定でき、マクロをアプリケーションで実行できないようにしたり、ドキュメントのソースが信頼できる場合にのみ VBA コードを実行するアクセス許可を付与したりして、攻撃から身を守ることができる。
Office 2000 SP3以降はセキュリティが強化され、初期設定ではVBAマクロは無効化されている。そのため、マクロを含むファイルを開いただけでプログラムが実行されることはないが、設定次第でセキュリティレベルを下げることもできてしまう。また、Office 2007 以降に一般的となった新しいファイル形式 (.xlsx など) ではマクロを含むことができないので、安全性がより高まった。