今回は、VBAで開発したアプリケーション(VBAアプリ)を、Visual Basicアプリケーション(VBアプリ)に移行する方法について学びます。おそらく業務でも必要に迫られることがあり得るでしょう。

意外に簡単!VBAアプリをVBアプリに変更

 VBAアプリは、ユーザー主導で開発されるケースが多いことから、後から変更するとなると、かなり手の付けにくいものが多いのではないでしょうか。こうしたVBAアプリを最新のVisual Studioを使ったものに移行できたら便利だと思いませんか。実は、既存のVBAアプリをC#のアプリケーションに置き換えるのは大変ですが、Visual Basicのアプリケーションになら比較的簡単に移行できるのです。

 Visual Studioにおける開発では、プライマリ相互運用機能アセンブリ(PIA)*5を利用して、.NETコンポーネントからOfficeのオブジェクトモデルにアクセスします。PIAを使えば、VBAアプリがオブジェクトモデルにアクセスしたように、VBで作成したコンポーネントからでもアクセスできるようになります。

 ここで紹介するVisual StudioによるOfficeテンプレートを利用した開発は、Visual Studio 2010 Professional以上が必要です。注意してください。

図9●作成するサンプルのVBA。マクロを実行すると追加された商談のフォントが変わる
図9●作成するサンプルのVBA。マクロを実行すると追加された商談のフォントが変わる
[画像のクリックで拡大表示]
図10●Excelを使ってシートを四つ作成し、列名とデータを入れる
図10●Excelを使ってシートを四つ作成し、列名とデータを入れる
[画像のクリックで拡大表示]

 それでは、VBAアプリからVBアプリへの移行例を具体的に見ていきましょう。最初に、VBAを使ったサンプルファイルを作成します。前回の商談と今回の商談を比較して、追加された商談の書式(フォント)を変更するものです(図9)。

 まずは、Excelを使ってシートを四つ作成し、「商談更新」「今回商談」「前回商談」「作業シート」と名前を付けます。そして、列名に「商談ID」「担当者氏名」「顧客名」「期限」「合計金額」「商談状況」を設定します(図10)。ここで期限の列を「日付」に指定し、合計金額の列を「金額」にします(図11)。作成したシートにデータを入力します。それぞれ、前回商談のシートを図12、今回商談のシートを図10のように入力してください。入力が終わったら、「商談管理.xlsm」というマクロ付きのファイル形式(.xlsm)で保存します。

図11●期限と合計金額の列を「日付」と「金額」に指定しよう
図11●期限と合計金額の列を「日付」と「金額」に指定しよう
[画像のクリックで拡大表示]
図12●前回商談のシートのExcelファイルのデータ
図12●前回商談のシートのExcelファイルのデータ
[画像のクリックで拡大表示]

 作成したExcelファイルにVBAのコードを埋め込みましょう。Part1で学んだように、商談管理.xlsmを読み込み「開発」タブから「Visual Basic」を選択します。表示されたエディタ内にリスト2を入力します。長いプログラムですが、実装していることは単純です。それでは、プログラムを説明していきます。

リスト2●前回と今回の商談を比較して追加された行の書式を変更するプログラム
リスト2●前回と今回の商談を比較して追加された行の書式を変更するプログラム
[画像のクリックで拡大表示]

 (1)では、前回商談の行のために「BeforeRow」、今回商談の行に「AfterRow」、現在処理している行に「CellCnt」、という文字列型の変数を用意しました。(2)では、前回商談の行数を取得して、(3)で作業シートにコピーしています。同じように、(4)では今回商談シートから行数を取得して、(5)で商談更新シートにコピーしています。

 (6)からが追加された商談の確認とフォントの変更です。(7)でFind関数を使って、前回と今回の商談の差分を比較して、前回にない商談の行の書式を変更しています。(8)では変更する書式などを指定しています。

 最後の(9)で、作業シートの値をクリアして、商談更新シートをアクティブにします。入力できたら動作を確認してみましょう。図9のように商談更新シートで追加された商談の書式が変更できていれば、正しく動作しています。

Office Open XMLラッパークラスの利用
 本文ではOpen XML SDK 2.0を使った開発手法を説明していますが、Office Open XMLのラッパークラスを利用すると開発がさらに楽になります。このクラスは、System.IO.PackagingやSDKのクラスをラップして、Office Open XMLの開発をより簡易化するモジュールです。Excelのオブジェクトモデルに似た開発が可能になり、Office Open XMLの開発工数を大幅に軽減できます。代表的なものには、ExcelPackage:Office Open XML Format file creationやFormatted Excel using SDK 2.0 and .NET、A Very Easy to Use Excel XML Import-Export Library、Excel Xml Libraryなどが挙げられます。
 しかし、これらのモジュールはオープンソースで開発されており、マイクロソフトはサポートしていません。また、Excelのすべての機能をサポートしていない場合が多いことにも注意が必要です。