作業ウィンドウ (CustomTaskPane) を表示させてみる

検証環境 自作マシン(Core2DuoE7400 2.8GHz/2GB)
Windows7 Ultimate(6.1.7600) - x86
VisualStudio2008Pro(VB) 9.0.30729.1SP/.NET Framework 3.5SP1
Excel2003(11.8307.8221)SP3(Office2003 Professional Edition)

本エントリの元ネタは
VSTO みちしるべ ~道標~ : カスタム作業ウィンドウの追加について(アドイン編) だったりします。

でもって、本エントリは 操作ウィンドウ (ActionsPane) を表示させてみる の続きだったりします。

VB からの作り込みで Office ソフトウェアに作業ウィンドウを表示させるには、ドキュメントレベルとアプリケーションレベルの 2 通りの作り込み方があります。

ドキュメントレベルのはその名の通りドキュメントファイルに埋め込みますので、アクティブなドキュメントを切り替えると作り込んだ作業ウィンドウが見えなくなってしまうのは前回お話しした通り。

で、今回はアプリケーションレベルで作り込んでみようかと。
Office ソフトへのアドインとしてインストールする必要があったり、VBで作り込み始めた途端に Office ソフトのアドインとして組み込まれてしまったりしますので、マシン環境を汚すのが嫌いな私としては避けていた機能ではあるんですけれども。

やりたいことがこれでしか実現できない(のかもしれない)んならしかたがない。
この際がっぷり四つでイジってみようかと思います。 


まずは VB での新規ソリューションの作成。
このへんはドキュメントレベル (操作ウィンドウ-ActionsPane) とあまり変わりません。

VS IDE のメニューから[ファイル]-[新しいプロジェクト…]
→ 「新しいプロジェクト」ダイアログ
→ [プロジェクトの種類:]を[Visual Basic]-[Office]-[2003]
  (IDE が「Visual Basic 環境設定」の場合)
→ [テンプレート:]を[Excel 2003 アドイン]
→ プロジェクト名をつけて[OK]

テンプレートとしてのドキュメントファイルを作成しなくていい分だけ操作も簡単、さっくり作成できました。

アドインは Excel とは無関係に作成し、IDE からの実行時に初めて、起動された Excel に組み込まれる動作となります。
ので、Excel の動作環境が整わずにコケるとしたら、IDE からの実行時ということになります。

さんざん作り込んでからコケるのはツラいので、ちゃんと連携して起動されるかどうかを先に確認します。

ThisAddIn_Startup メソッドに、メッセージボックスを表示させるコードだけ記述して実行。

Private Sub ThisAddIn_Startup( _
    ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

    ' VSTO で生成されたコードの開始
    Me.Application = CType( _
          Microsoft.Office.Tools.Excel.ExcelLocale1033Proxy.Wrap( _
          GetType(Excel.Application) _
        , Me.Application), Excel.Application)
    ' VSTO で生成されたコードの終了

    MsgBox("ちゃんと起動したよね?")

End Sub

うわあ超簡単でびっくり。
でもまあ相変わらず初回実行で強制的に Excel のアドインとして組み込まれ

…てないよ。

あれぇいつの間にそんな仕様になっちゃっていたんですかい?
完成版のインストール時にのみアドイン登録されるんなら、開発環境でインストールの確認までできて大変助かります。
インストール後にもアドイン一覧に表示されないのでは、という不安も若干ありますが、現時点では以前(たぶん私が最後に確認したのはVSTO2005 SE だったんではないでしょうか)よりすごくとっつきやすくなっています。ありがてぇ。

なんかライブラリにロケールが組み込まれてて日本語版専用のような気もするんですがまあ今のところは気にしないでおくことにします。


では、まずは作業ウィンドウを素で表示させてみます。

…って、あれ?
いくら探しても CustomTaskPanes コレクションが見つからないよ?

あわてて調べてみたら、

アプリケーションおよびプロジェクトの種類別の使用可能な機能

カスタム作業ウィンドウは、Office 2007 にしか提供されていないのでした。
なんてこったい。

ついでに

カスタム作業ウィンドウの概要

では

Visual Studio Tools for Office を使用して作成したカスタム作業ウィンドウには、常に UserControl オブジェクトが含まれています。

とありますので、操作ウィンドウのように中身なしの「素」で表示させることはできないようです。

ということでなんかいろいろがっかりしてしまいましたがしかたがありません。
とりあえず Excel 2007 でやり直してみます。

VS IDE のメニューから[ファイル]-[新しいプロジェクト…]
→ 「新しいプロジェクト」ダイアログ
→ [プロジェクトの種類:]を[Visual Basic]-[Office]-[2007]
  (IDE が「Visual Basic 環境設定」の場合)
→ [テンプレート:]を[Excel 2007 アドイン]
→ プロジェクト名をつけて[OK]

Private Sub ThisAddIn_Startup( _
    ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

    MsgBox("ちゃんと起動したよね?")

End Sub

動作確認まで終わったら、ユーザーコントロールを追加。
ソリューションエクスプローラのプロジェクトノードを右クリック → コンテキストメニューから[追加]をクリック → [ユーザーコントロール]をクリック → 「新しい項目の追加」ダイアログが表示されます。

上記手順でダイアログを開くとあらかじめユーザーコントロールが選択されていますので、ファイル名(クラス名を兼ねます)を適当に変更して[追加]をクリック。
これでユーザーコントロールオブジェクトが追加され、IDE のドキュメントウィンドウにもデザイナウィンドウが表示されます。

ThisAddIn.vb のエディタウィンドウに戻って、今作ったユーザーコントロールをカスタム作業ウィンドウに追加するコードを記述して実行してみます。

Private Sub ThisAddIn_Startup( _
    ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

    Dim uCtrl = New UserControl1
    Dim cTaskPane = Me.CustomTaskPanes.Add(uCtrl, "お試し作業ウィンドウ")
    cTaskPane.Visible = True

End Sub

ドキュメントを開いても表示されてます。

複数のドキュメントを開いてアクティブを切り替えても表示されています。
まあドキュメントに依存していないので当たり前っちゃ当たり前なんですが。

なるほど確かに簡単だー。

デザイン時のユーザーコントロール背景色と、実行時の作業ウィンドウの背景色が違うのがちょっと気になります。
ユーザーコントロールの背景色が「Control」だからなんだと思いますが、直接固定色を指定したらどうなるんでしょう。

こうなりました。
どうも設計時のサイズではなく、実行時の作業ウィンドウのガワ(外側、親コンテナ)のサイズにリサイズされるようですね。

では、背景色を「Control」に戻して(プロパティウィンドウの「BackColor」行を右クリック → コンテキストメニューから[リセット]を選択して戻します。「Control」と手で打ち込むと正常に動作しない可能性があるので)、Excel の Office ボタンをクリック → [Excel のオプション] → 「Excel のオプション」ダイアログを表示させ、[基本設定]-[Excel の使用に関する基本オプション]-[配色]を「銀色」とか「黒」に変更してみます。

…あー、作業ウィンドウ自体の色は変わらないんすね。
まあこれはこれでこんなものなのかと。


さて。
2003 も未だ現役で使っている私としては、なんとか 2003 & 2007 共通のテクノロジで何とかしたかったわけですが。2003 が作業ウィンドウの外部制御を認めないんじゃしょうがないよなー。

もともと 2007 では作業ウィンドウはなるべく使わない方向で設計され、2003 とのインターフェイス互換のために渋々残したなんて噂も聞いていますので、なんで渋々の 2007 ではかっきりカスタマイズできて積極的に使い込ませる 2003 ではダメなのかーとか、2007 では外部からの制御(というか外部との連携)を積極的に考慮していて 2003 はインターフェイスの公開に中途半端感があったからさもありなんだよなーとかいろいろ考えてしまうわけですが。

でもやっぱり、2003 でドキュメントに依存しない作業ウィンドウの実装をあきらめきれません。くそー。

コメントを投稿