■ エクセルマクロでリボンは最小化できるか?
前回、XMLマークアップを使用したリボンUIのカスタマイズ例についてご紹介しましたが、今回はいよいよ、ExcelVBAから直接リボンUIを制御するサンプルコードをご紹介します。
・VBAを利用したリボンUIの最小化テクニック
Excel2007のVBAヘルプをご覧になればすぐにわかると思いますが、リボンUIに対する制御文はほとんどありません。
リボンUIそのものがExcelのシステムから切り離されてしまったため、当然ExcelVBAからは制御できないのですが…IRibbonUIのようなCOMアドインのコールバックプロシージャから返されるオブジェクトを、制御するためのメソッドがわずかに存在するだけです。
(先ほどの方法ではドキュメント単位でしかUIを変更できませんでしたが、COMアドインを使うとアプリケーションレベルでのUI変更が可能になります)
現在のリボンUIの表示状態(通常表示か最小化されているか)を識別するプロパティも、リボンUIの状態を変化させるメソッドもなんにもありません。
困っちゃいましたね。
かなり無理矢理ですがリボンUIを操作するマクロを記述してみます。
Public Sub test()
If Application.Version = 12 Then
If ChkRibbonUI Then
Call ChangeRibbonUIStatus
End If
End If
End Sub
Public Function ChkRibbonUI() As Boolean
Dim A1_Top1 As Long
Dim A1_Top2 As Long
Call ChangeRibbonUIStatus
A1_Top1 = ActiveWindow.PointsToScreenPixelsY(0)
Call ChangeRibbonUIStatus
A1_Top2 = ActiveWindow.PointsToScreenPixelsY(0)
If A1_Top1 > A1_Top2 Then
If A1_Top2 < 0 Then
ChkRibbonUI = True
Else
ChkRibbonUI = False
End If
Else
If A1_Top1 > 0 And A1_Top2 > 0 Then
ChkRibbonUI = True
Else
ChkRibbonUI = False
End If
End If
End Function
Public Function ChangeRibbonUIStatus()
Application.SendKeys Keys:="^{f1}", Wait:=True
DoEvents
End Function
早速、プログラムの詳細をみていきます。
testプロシージャは、現在のリボンUIの状態を調べ、リボンが通常表示されていれば最小化を実行します。
(最小化しているときに通常表示させたい場合は2行目をIf Not ChkRibbonUI Then に変更すればOKです)
If Application.Version = 12 Then この操作はExcel2007で必要な操作なのでそれ以外のバージョンのExcelでは実行されないようにバージョン指定をしています。
If ChkRibbonUI Then リボンUIの状態を調べるChkRibbonUI関数を判定しています。ChkRibbonUIの戻り値がTRUEのときリボンが通常表示されており、FALSEのとき最小化されています。
Call ChangeRibbonUIStatus ここでリボンの状態を変化させます。中身はなんてことはない、SendKeysメソッドで「Ctrl+F1」を送ってやっているだけです。
リボンUIの通常表示・最小化を切り替えるショートカットキーが「Ctrl+F1」なので、アプリケーションにそれを送ってやれば、当然リボンUIの状態を切り替えてくれるわけです。
ここで問題になるのは、いまリボンがどんな状態なのかを直接調べる方法がないということです。リボンの状態がわからなければ、状態を切り替えていいかどうかの判断ができません。
かなりアクロバッティックな方法ですが、リボンUIのON・OFFを繰り返しその時のA1セルのスクリーン座標を調べることで判定してみましょう。
Function ChkRibbonUI の3〜6行目の箇所がそれにあたります。
Call ChangeRibbonUIStatusを繰り返し、その時点でのA1セルのY座標をA1_Top1、A1_Top2にそれぞれ取得しています。
あとはA1_Top1とA1_Top2の大小を比較することでリボンUIの状態を推測しています。
リボンUIを表示した状態でtestプロシージャを実行してください。リボンが最小化されましたね。
もう一度、testプロシージャを実行してみてください。リボンは最小化されたままですね。ChkRibbonUI関数は正しくリボンの状態を取得しているということになります。
(このプログラムはVBEからではなくエクセルから実行してください)
手動でリボンを元に戻したいときは、Ctrl+F1または、メニュー右クリック「リボンの最小化」チェックを外します。
今回のサンプルは筆者の環境でテストして概ね良好に動作しましたが、すべての環境で動作することを保証するものではありません。
筆者のテスト環境(スクリーンサイズ)
800 X 600 |
1024 X 768 |
1280 X 1024 |
2560 X 1024 |
ディスプレイ環境によってはうまく動作しない場合もありますのでご了承ください。
この方法の長所は、あくまでExcelVBA側からの制御ですので、XMLを編集する必要も、COMアドインを用意する必要もないことです。
旧バージョンのブックからでも、互換モードで動作させることができます。
(バージョン指定をしていたのはそのためです)
操作できるのはあくまでリボンUIの通常表示・最小化の切り替えのみですが、作業領域を確保するためにツールバー等を非表示にしていた、旧バージョンのエクセルマクロを暫定的にExcel2007で運用する場合に、使えるテクニックではないかと思います。
|