Visual Basic for Applications

**Visual Basic for Applications**（ビジュアルベーシック・フォー・アプリケーションズ、VBA）は、主にマイクロソフト製のMicrosoft Officeシリーズに搭載されているプログラミング言語である。

## 概要
マイクロソフトが1990年代に開発していた汎用プログラミング言語・Microsoft Visual Basicを、同社製品のMicrosoft Officeに搭載したものがVBAである。VBAを使用することで、Excel、Access、Word、Outlook、PowerPointなど、Officeのアプリケーション・ソフトウェアの機能をカスタマイズしたり、拡張したりすることができる。

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

## 機能・用途
* 定型業務の自動化、省力化。例えば、毎日更新されるデータを出社してからいちいち手入力し、手順を入力して計算させていた業務を、夜の間に自動でソフトウェアを起動し、データを読み込ませ、朝までに処理させておける。またOfficeアプリケーションではマクロ記録/再生という操作手順の記録/再生機能を使って、プログラムに関する知識が少ないユーザーでも、ある程度の定型業務の自動化を行なえる。マクロはVBAコードの自動生成により実現されている。
* 特定の使用目的への最適化。例えばある会社で、社員の一覧名簿を作成し、自社独自の給与体系に従い、各自の給与を自動で計算できる。またその場合、考慮する数字を自動で参照して集計するなど、目的に応じた特殊な関数を作成することもできる（ユーザー定義関数という）。また、ユーザー独自のフォームを作成でき、様々なプラグインを組み込むことなども可能である。
* Officeの使用に特化しMicrosoft Office専用という印象が強いが、限定的ながらInternet ExplorerなどOffice以外のソフトウェアを制御する機能が与えられているほか、フォルダを作成する、ファイル名を変更するといったOS上の操作も行うことができる。またマイクロソフト社からしかるべきライセンスを取得することで他のアプリケーションに組み込むことも可能である。実際、マイクロソフト社に買収される前のVisioにも搭載されていた。CADソフトのAutoCADやMicroStation V8等にも搭載されている。

## VBAの歴史
* VBA は 1993年 (日本では1994年) に MS Excel 5.0 で初めて発売された。それは瞬く間に開発者の間で、Excel を使用して企業ソリューションを作成するツールとして成功を収めた。AccessBASIC とWordBASIC を置き換え、Microsoft Project、Access と Word に VBA が搭載されたことで、VBA はより一般的になった。
* VBA 4.0は、以前のものと比較して完全にアップグレードされたメジャーリリースとなった。1996年にリリースされ、C++で書かれ、オブジェクト指向言語となった。
* VBA 5.0 は、1997年に MS Office 97 に含まれるすべての製品と共に発売された。ただし、VBScript を実装した Outlook 97 は例外。
* VBA 6.0 および VBA 6.1 は 1999年に発売され、特に Office 2000 の COM アドインをサポートした。 VBA 6.2 は Office 2000 SR-1 と共にリリースされた。
* VBA 6.3 は Office XP と一緒にリリースされ、VBA 6.4 では Office 2003、VBA 6.5 は Office 2007 でリリースされた。
* Office 2010 には VBA 7.0 が搭載された。VBA 7 には、64 ビットサポート以外に、VBA 6.5 と比べて開発者向けの新機能はない。ただし、VBA 6.5/Office 2007 以降、マイクロソフトは他のアプリケーション向けの VBA のライセンスを停止した。
* Office 2013、Office 2016、Office 2019、及び Office 2021には VBA 7.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 コントロールについてソフトウェア ベンダに問い合わせるように誘導している。

## 資格検定試験
* VBAエキスパート
* Microsoft Office Specialist
いずれも、パソコンスクール運営の株式会社オデッセイ コミュニケーションズが実施する民間資格である。全国のパソコン教室などを会場に随時予約可能。受験料は1万数千円程度。

※また、日本の国家試験である基本情報技術者試験の表計算ソフトの問題にも、VBA風の擬似言語を用いたマクロ定義の内容が出題されている。

## コード例
以下は、Excelにおいて、「Alpha」という名前のワークシートを削除するVBAの例である。


```vb
Application.DisplayAlerts = False
Worksheets("Alpha").Delete
Application.DisplayAlerts = True
```


また、Excelで以下のコードを実行すると、セルA1からI9の範囲に掛け算九九の表を作成することができる。


```vb
For i = 1 To 9
    For j = 1 To 9
        Cells(i, j).Value = i * j
    Next
Next
```


下記のように配列を用いて、全ての値を配列に格納した上で一度に出力するように上記のコードを書き換えると、高速に動作するコードになる。


```vb
Dim KukuArray(8, 8) As Integer

For i = 1 To 9
    For j = 1 To 9
        KukuArray(i - 1, j - 1) = i * j
    Next
Next

Range("A1:I9").Value = KukuArray
```


条件によって4色以上に色を塗り分けるときも、VBAを利用する（3色以下のときは一般機能の「条件付き書式」を使用するのが望ましい）。以下のコードを実行するとセルB2からE15までの範囲内のセルを5以下→水色、6以上10以下→明るい緑、11以上15以下→黄色、16以上→赤と塗り分けることができる。


```vb
Dim myCell As Range

For 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 Select
Next
```


以下は、VBAと共にExcelごとプログラムを終了するVBAの例である。


```vb
Application.Quit
```


### ユーザー定義関数
VBAを用いて、ユーザーが新たに関数を作成することもできる。ユーザー定義関数を作成するにはFunctionプロシージャを用いる。以下はHERONという名でヘロンの公式を用いるユーザー定義関数のコードである。実用には、負の値や三角条件を満たさない値が入力されることを想定して、下記のコードにエラー処理ルーチンを追加しておくことが望ましい。

定義したユーザー定義関数は通常の（組み込みの）ワークシート関数同様、数式の中で用いることで呼び出す。この例で言えば、とセルに入力すると、数式を入力したセルに演算結果として6と出力される。


```vb
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 など) ではマクロを含むことができないので、安全性がより高まった。

## 関連項目

*:en:Visual Studio Tools for Applications
*:en:Visual Studio Tools for Office
*Microsoft Visual Studio
*Microsoft FrontPage
*:en:OpenOffice Basic
*LotusScript

## 脚注

## 外部リンク
*