VBA と VSTO の相互運用について(VBA からの VSTO ソリューションの呼び出し)

[今日のみちしるべ 第13回 ちぐはぐな日]

Tech-ED セッションのアンケート結果が出ました!

予想をはるかに越えて、とてもよい点数を頂戴いたしました!

参加いただいた皆様、本当にありがとうございました。

もしかしたら、本も書けるかもしれませんし(笑)、来年も呼ばれるかもしれません。(祈ってます!)

すごくうれしいです!

今日は他にもうれしいことはあったのですが、なんだか、ピンと来ない出来事がありました。

今日の東京地方は一日雨模様でした。朝、傘を持たずに家を出たら、雨に降られて、途中で雨宿りをしていたのですが、

止みそうにないので、嫁に車で迎えに来てくれと言ったら、止みました。

そもそも、駅まで送ってくれるはずだったのですが、それもなんだか時間が取れずという感じで、歩いて駅まで行ったところ、結局、雨に降られてしまいました。(それがあれば雨に濡れなかったはずなのですが、、、)

帰りも置き傘を持たずに会社を出たら、また、雨に降られました。

用事があったので、それを済まして外に出たら、また、雨に降られました。

最寄りの駅について、改札を出たら、また、雨に降られました。

たくさんのいい事もあったのですが、それに反比例したようにパッとしないことも起きた変な日でした。

持病の偏頭痛にもなってしまったり・・・。

こんな日もあるんですねぇ。(すみません。これじゃ、普通のブログですね。)

[本題]

さて、本題についてです。

VBA と VSTO は相互運用が可能なのですが、今回は VBA からの VSTO ソリューションの呼び出しについて取り上げます。

image

Tech-ED のセッションでも取り上げておりますが、既存の VBA・マクロから VSTO のソリューションを呼び出すことが可能です。

実はこのネタを既に取り上げていたと勘違いして、Tech-ED に臨んでしまいました。

なので、本日はこのネタをサンプル付きでご紹介したいと思います。

内容的には、既存の VBA・マクロのファイルを VSTO のテンプレートとして、カスタマイズして拡張ということです。

これらの応用としては以下のようなことが考えられます。

データソースアクセスの拡張

  • ADO.NET によるオフライン利用
  • XML Web サービスへの容易なアクセス

業務利用を想定したアプリケーション開発による拡張

  • .NET ベースの開発によるロジックの実装が可能

VBA に公開可能なもの:

VBA に公開ができるものは、メソッド、プロパティ、およびイベントです。

クラスについては、ホスト項目クラス (Word の場合は ThisDocument、Excel の場合は ThisWorkbook と Sheet(n)) またはプロジェクトで定義したその他のクラスを公開できます。

手順としては以下のような感じです。

手順:

1. 以下のような既存のVBA・マクロファイルを開きます。

image

※ボタンをクリックするとメッセージボックスが表示されます。

image

2. VSTO でテンプレートとして開きます。

image

3. Sheet1 のプロパティを開きます。

※コードのプロパティではなく、Sheet のプロパティになります。一旦、デザイナで開いてプロパティタブを表示します。

image

4. プロパティウィンドウの "EnableVbaCallers" プロパティの値を True にします。

image

5. 以下のダイアログが表示されますので、OK をクリックします。

image 

6.VBE で以下のコードが VSTO により、自動記述され、VBA から VSTO ソリューションのパブリックメンバを呼び出せるようになります。

image

7. このソリューションに作業ウィンドウを追加してみましょう。

作業ウィンドウの追加の詳細はカスタム作業ウィンドウの追加について(ドキュメントレベル編)を確認してみてください。

追加後、Sheet1 の Public の Sub プロシージャーに以下のコードを追加してみます。

Public Sub StartUC()
Dim uc As New UserControl1
Globals.ThisWorkbook.ActionsPane.Controls.Add(uc)
End Sub

Public Sub CloseUC()
Globals.ThisWorkbook.ActionsPane.Clear()
End Sub

ここで一旦、保存して閉じます。

8. ソリューションファイルを閉じて、ソリューションフォルダの中の Excel ファイルを直接起動しボタンを二つ追加します。

image

9.上から2番目のボタンをクリックしイベントハンドラに以下のコードを記述します。

Private Sub CommandButton2_Click()
Me.CallVSTOAssembly.StartUC
End Sub

image

10. 同様に3番目のボタンをクリックしイベントハンドラに以下のコードを記述します。

Private Sub CommandButton3_Click()
Me.CallVSTOAssembly.CloseUC
End Sub

11. VBE を閉じて、ファイルも保存します。

12. VSTO ソリューションを起動してデバッグを開始し、さきほど、追加したボタンをクリックしてみます。

以下のように作業ウィンドウが起動します。

また、3番目のボタンをクリックすると作業ウィンドウは閉じます。

image

ということで、VBA からの VSTO の呼び出しについて記載させていただきました。

詳細については以下に記載があります。

VBA からドキュメント レベルのカスタマイズ内のコードを呼び出す

http://msdn.microsoft.com/ja-jp/library/bb386306.aspx

サンプルは以下から確認できます。

VBAtoVSTO.zip

次回は VSTO 側からの VBA の呼び出しをご紹介したいと思います。