06 作業ウィンドウのひみちゅを探れ
作業ウィンドウってやつをご存知でしょうか。
素でExcelXPなんかを起動すると、時々頼みもしないのにウィンドウ右側に出てくる内部組み込みウィンドウなんですが。
先日までさみだれに説明してきたシートタブの一覧を、「この作業ウィンドウの中に追加したら操作上すっきりするんではないか?」などと思ってしまったのが運のつき。この作業ウィンドウの正体を知りたくってうずうずしてきてしまったんです。
で、とりあえずこんな時にはお世話になりますspy++。でチェックしてみると、キャプションが"作業ウィンドウ"のMsoCommandBarクラスでした。…MsoCommandBar?
って、ツールバーとかメニューバーのクラスじゃないですか。ってことは、作業ウィンドウってツールバー?ふつーのツールバーの扱いとして表示/非表示がかかるってこと?
で、メニューから[ツール]-[ユーザー設定]と選択して表示されるユーザー設定ダイアログの[ツールバー]タブをチェック。
…あるじゃん作業ウィンドウ。試しにOffにしたらちゃんと消えるし。
じゃあ。この作業ウィンドウツールバーの内部に表示されているブックを開くとかの機能は何?作業ウィンドウ右上の[▼]を押すとクリップボードとか検索とかも出てくるんですけど。ふつーにツールバーにこんな操作可能なオブジェクトが組み込めるなんて、私知らないんですけど。
じゃあこの作業ウィンドウツールバーの内部には何が組み込まれているかをspy++で見てみると、キャプションが"新規作成"のbosa_sdm_XL9。
MSDN…日本のサイトも本家アメリカのサイトもサーチしてみたけど何にも出てきません。Googleでもアウト。
Altavistaでサーチしてみると…3件だけヒットしました。
無駄にヒットしまくるAltavistaでこれかい。心細いなぁ。しかもそのうち一ヶ所はデンマークのサイトみたいだし読めません。
えーと。ここでいちいちヒットしたサイトのURLは書きませんので。興味のある方はご自分でサーチしてみてください。
まず一ヶ所目。
Centre a excel dialog box in a 32 bit systemが目的なんだそうで、FindWindow32 APIのクラス名引数にbosa_sdm_XLを使っていました。でフックしたウィンドウを画面中央に持ってくるロジックですね。ってこれ、単純なダイアログボックス扱いです。しかも16ビット版(Win3.1ですね)用と32ビット用のVBAコードが記載されています。
二ヶ所目も同様。
三ヶ所目は、Word用にダイアログボックスのキャプションをむりやり差し替えるVBA コードでした。しかもWord97/2000用。
ってことは、bosa_sdmってOfficeのダイアログボックスなのかなぁ。しかも16ビット版の頃から一般的に使用されていたクラスっぽいっす。
spy++で確認してみると、確かに上述のユーザー設定ダイアログも、名前をつけて保存ダイアログもbosa_sdm_XL9クラス。
対して自作UserFormのクラス名はThunderDFrame。…これはちょっと無理かしら。
悔しいのでもぅちょい頑張ってみることにします。
今度はオブジェクトの状態をチェック
てことで、まずは作業ウィンドウのオブジェクト名を知ることにします。
チェックに使ったコードはこちら。
Sub sFindCommandBar01()これでCommandBar(ツールバーとかメニューバーとか)の内部オブジェクト名と和名が一覧で表示されます。目的の作業ウィンドウの内部オブジェクト名はTask Paneだといぅことがわかりました。
Dim objCBar As CommandBar
For Each objCBar In CommandBars
Debug.Print objCBar.Name & " - ";
Debug.Print objCBar.NameLocal
Next
End Sub
ほんと?ちょっと確認。
Sub sFindCommandbar02()OKOK。ちゃんとこの指定で、objCBarにオブジェクトハンドルが格納されてますね。
Dim objCBar As CommandBar
Set objCBar = CommandBars("Task Pane")
Debug.Print objCBar.Name & " - ";
Debug.Print objCBar.NameLocal
End Sub
さて、なんで内部オブジェクト名なんかわかりたかったかっていぅと。
こんなことができるんです。
Sub sFindCommandbar03()上述のコードはStandard(標準)ツールバーに対してその構成要素のタイプとキャプションを列挙するコードです。その実行結果は
Dim objCBar As CommandBar
Dim objCCtrl As CommandBarControl
Set objCBar = CommandBars("Standard")
For Each objCCtrl In objCBar.Controls
Debug.Print objCCtrl.Type & " - ";
Debug.Print objCCtrl.Caption
Next
End Sub
| 1 - | 新規作成(&N) |
| 1 - | 開く |
| 1 - | 上書き保存(&S) |
| 1 - | メールの宛先(&M) |
| 1 - | 検索(&H)... |
| 1 - | 印刷 (RICOH NX-110 RPDL) |
| 1 - | 印刷プレビュー(&V) |
| 1 - | スペル チェック(&S)... |
| 1 - | 切り取り(&T) |
| 1 - | コピー(&C) |
| 13 - | 貼り付け(&P) |
| 1 - | 書式のコピー/貼り付け(&F) |
| 6 - | 元に戻す(&U) |
| 6 - | やり直し(&R) |
| 1 - | ハイパーリンク(&I)... |
| 13 - | オート SUM(&A) |
| 1 - | 昇順で並べ替え(&A) |
| 1 - | 降順で並べ替え(&C) |
| 1 - | グラフ ウィザード(&C) |
| 1 - | 図形描画(&D) |
| 4 - | ズーム(&Z) |
| 1 - | Microsoft Excel ヘルプ(&H) |
って感じになります。
Typeプロパティがむき出しの数値で表示されますが、自分でプログラミングする時には、ふつーOfficeライブラリの中で提供されているMsoControlTypeクラスで提供されている定数で指定します。
で、MsoControlTypeクラスで提供されている定数と数値の相関は、
| 0 | msoControlCustom |
| 1 | msoControlButton |
| 2 | msoControlEdit |
| 3 | msoControlDropdown |
| 4 | msoControlComboBox |
| 5 | msoControlButtonDropdown |
| 6 | msoControlSplitDropdown |
| 7 | msoControlOCXDropdown |
| 8 | msoControlGenericDropdown |
| 9 | msoControlGraphicDropdown |
| 10 | msoControlPopup |
| 11 | msoControlGraphicPopup |
| 12 | msoControlButtonPopup |
| 13 | msoControlSplitButtonPopup |
| 14 | msoControlSplitButtonMRUPopup |
| 15 | msoControlLabel |
| 16 | msoControlExpandingGrid |
| 17 | msoControlSplitExpandingGrid |
| 18 | msoControlGrid |
| 19 | msoControlGauge |
| 20 | msoControlGraphicCombo |
| 21 | msoControlPane |
| 22 | msoControlActiveX |
| 23 | msoControlSpinner |
| 24 | msoControlLabelEx |
| 25 | msoControlWorkPane |
| 26 | msoControlAutoCompleteCombo |
ではお目当ての作業ウィンドウツールバーはどう構成されているかといぅと、先のコードをちょっと変えて
Sub sFindCommandbar04()答は 25 - 新しいブック。…あれ?
Dim objCBar As CommandBar
Dim objCCtrl As CommandBarControl
Set objCBar = CommandBars("Task Pane")
For Each objCCtrl In objCBar.Controls
Debug.Print objCCtrl.Type & " - ";
Debug.Print objCCtrl.Caption
Next
End Sub
Excelでは4種類の機能を任意に切り替えられるので、作業ウィンドウには4種類の機能があらかじめ埋め込まれてるんだと思ってました。が、1種類だけなんですね。ふぅん。
ってちょっとよそにも興味が行くんですが、まずは「25」って。msoControlWorkPaneって何でしょう。
もぅ一度MSDNで探してみると、米国版の方でこんなん見つけてみたんですけど…だめだこれ、CommandBarの属性列挙のプログラムサンプルだぁ。私が今までやってきたことと大差ないです。
うーむ。どぅやら完全に詰まってしまいました。
てことで、本日はここまで。進展があれば、また報告します。
自力で調査している時なんて、こんなもんですって。100あたって実を結ぶのは1とか2とか。