はじめに
VSTOブックは止めておいた方がいい。
どうしてもVSTOブックを作らなけらばならない人に本記事が参考になれば幸いです。
※VSTO全てを否定しているわけではありません。Excelブックと紐づくVSTOアドオンに対する知見になります。
経緯
仕事でExcelマクロを組む必要があり、それを社内で公開する必要があった。
どうせならバージョン管理もできるし、.NET Frameworkで開発できるVSTOにしようと思い、VSTOブックでの開発を行ったが、思った以上に苦戦(むずがゆい思いを)したので、その理由などを残しておく。
レイアウトについて
ブックに直接レイアウトするのはオススメしない。
面倒でもアドオンで書式などの設定をした方がいい。
ただし今後レイアウトを変更する予定がある場合の話です。
改修の予定がないVTSOブックであれば、ブックに直接レイアウトした方が早いです。
レイアウトをアドオンで設定した方がいい理由
Excelブックは__アドオンのバージョンまで保持していない__ようだから。
と言うもの仕様変更でExcelシートに入力欄を1列追加し、ClickOnceで公開した。
公開後にExcelブックを開くと、ClickOnceによってアドオンはバージョンアップされたのだが、Excelブックは古いまま(入力欄が足されていない状態)で利用できてしまった。
幸いにも今回のケースでは、追加した入力欄は最新バージョンでは必須だった為に、古いExcelブックは利用できなくなったので、問題なかったが、場合によっては入力チェックなどもスルーされて異常なデータが登録されてしまう事も考えられる。
なのでExcelブックを差し替えてもらうよう、ユーザにアナウンスする必要があった。
また古いExcelブックを使われないようにする対策も考慮する必要があった。
ClickOnceによる配布について
最新の__Excelファイルを配布先からダウンロードしないといけない__ので、少し微妙。
ここには、VSTOをインストールした後にExcelブックを所定のパスにダウンロードする仕組みが解説されているが、__manifestファイルを直接編集したり、それを再署名したりする必要がある__ので、やろうと思えば出来ますよな感じがする。
開発環境と本番環境の共存について
プロジェクトファイルの下記項目を切り替えて、公開すれば共存可能。(項目に関する説明は後述)
- SolutionID
- ManifestKeyFile
- ManifestCertificateThumbprint
共存とはどういう事か
私は開発者兼利用者だったので、ClickOnceで公開したVSTOブックをインストールした。
しばらくして仕様変更する必要があったので、Visual Studioでデバッグ実行しようとしたところ、「インストール済みです。」と言ったエラーが出て、デバッグ実行できなかった。
インストールしていたVSTOをアンインストールしたところ、デバッグ実行が出来るようになったが、また最新版が公開された場合には、再度インストールする必要がある。
べき論で言うと
開発環境で本番、検証環境に繋げるべきではない。
仮想環境なり、アカウント切り替えるなりして本番環境に接続するのが安全。(今回の場合は開発環境を仮想化するのが無難)
項目に対する補足
SolutionID
Excelブックに埋め込まれているIDでどのVSTOアドオンを利用するか保持しているらしい。
この値さえ異なれば、アセンブリ情報は同じでも問題なかった。
ManifestKeyFile
コード証明書。
これを変更しておかないと、インストール時に「既にインストール済みです。」とエラーになった。
ManifestCertificateThumbprint
コード証明書のサムプリント。
ManifestKeyFileで指定したコード証明書のサムプリントと一致していないと、エラーになる。
設定切り替えが面倒なら
本番用のプロジェクトを用意した方がいいかも。
イメージとしてはこんな感じ
┣ 公開用プロジェクト ... 開発用プロジェクトを参照。ClickOnceでの配布はこのプロジェクトで。
┗ 開発用プロジェクト ... デバッグ実行する時はこのプロジェクトで。
リボンが必要ならベースプロジェクトから参照して利用すればいい。
Excelブックが継承できないので、そこで冒頭で説明したレイアウトはアドオンで設定する事が生きてくると思う。
最後に
当初の目的は
- バージョン管理がしやすい
- .NET Frameworkが使える
だったので、目的は達成されたのたが、それ以外が少し残念と言うのが素直な感想だった。
ただ振り返ってみると、Excelブックに拘ったのがそもそもの間違いだったのかと思う。
今後、仕様変更も入る予定だったので、バージョン管理がしやすいVSTOブックを採用したが、それならWindows FormやWeb アプリなどで開発した方が公開とかはしやすかったと思う。
また作ったきりで改修される予定のないものであれば、おとなしくVBAで開発した方がインストールの必要もないので、使いやすいと思う。