今回は、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以上が必要です。注意してください。
それでは、VBAアプリからVBアプリへの移行例を具体的に見ていきましょう。最初に、VBAを使ったサンプルファイルを作成します。前回の商談と今回の商談を比較して、追加された商談の書式(フォント)を変更するものです(図9)。
まずは、Excelを使ってシートを四つ作成し、「商談更新」「今回商談」「前回商談」「作業シート」と名前を付けます。そして、列名に「商談ID」「担当者氏名」「顧客名」「期限」「合計金額」「商談状況」を設定します(図10)。ここで期限の列を「日付」に指定し、合計金額の列を「金額」にします(図11)。作成したシートにデータを入力します。それぞれ、前回商談のシートを図12、今回商談のシートを図10のように入力してください。入力が終わったら、「商談管理.xlsm」というマクロ付きのファイル形式(.xlsm)で保存します。
作成したExcelファイルにVBAのコードを埋め込みましょう。Part1で学んだように、商談管理.xlsmを読み込み「開発」タブから「Visual Basic」を選択します。表示されたエディタ内にリスト2を入力します。長いプログラムですが、実装していることは単純です。それでは、プログラムを説明していきます。
(1)では、前回商談の行のために「BeforeRow」、今回商談の行に「AfterRow」、現在処理している行に「CellCnt」、という文字列型の変数を用意しました。(2)では、前回商談の行数を取得して、(3)で作業シートにコピーしています。同じように、(4)では今回商談シートから行数を取得して、(5)で商談更新シートにコピーしています。
(6)からが追加された商談の確認とフォントの変更です。(7)でFind関数を使って、前回と今回の商談の差分を比較して、前回にない商談の行の書式を変更しています。(8)では変更する書式などを指定しています。
最後の(9)で、作業シートの値をクリアして、商談更新シートをアクティブにします。入力できたら動作を確認してみましょう。図9のように商談更新シートで追加された商談の書式が変更できていれば、正しく動作しています。
しかし、これらのモジュールはオープンソースで開発されており、マイクロソフトはサポートしていません。また、Excelのすべての機能をサポートしていない場合が多いことにも注意が必要です。