今回はマクロでクイックアクセスツールバーをリボンの下に表示する方法を紹介します。
[標準モジュール]
※ コードのレイアウトが崩れて表示される場合は、ページのフォントサイズを小さくして閲覧してください。
Option Explicit
Private Declare Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, ByVal iChildStart As Long, ByVal cChildren As Long, ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32.dll" () As Long
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Private Const CHILDID_SELF = 0&
Private Const ROLE_SYSTEM_PUSHBUTTON = &H2B
Private Const ROLE_SYSTEM_MENUITEM = &HC
Sub BelowRibbonQAT(myFlag As Boolean)
'myFlag(True:QATをリボンの下に表示 , False:QATをリボンの上に表示)
Dim accBtn As Office.IAccessible
Dim accMenu As Office.IAccessible
On Error GoTo myErr
Call LockWindowUpdate(GetDesktopWindow()) '画面描画停止
Set accBtn = Application.CommandBars("Ribbon")
Set accBtn = GetAcc(accBtn, "ツール バーのカスタマイズ", ROLE_SYSTEM_PUSHBUTTON)
accBtn.accDoDefaultAction (CHILDID_SELF)
DoEvents 'IAccessibleアクセス待ち
If myFlag = True Then
Set accMenu = GetAcc(accBtn, "リボンの下に表示", ROLE_SYSTEM_MENUITEM)
Else
Set accMenu = GetAcc(accBtn, "リボンの上に表示", ROLE_SYSTEM_MENUITEM)
End If
If accMenu Is Nothing Then
'ツールバーのカスタマイズプルダウン解除
If accBtn.accState(CHILDID_SELF) = &H100008 Then accBtn.accDoDefaultAction (CHILDID_SELF)
Else
accMenu.accDoDefaultAction (CHILDID_SELF)
Set accMenu = Nothing
End If
Set accBtn = Nothing
Call LockWindowUpdate(0&) '画面描画再開
Exit Sub
myErr:
MsgBox "実行時エラー:" & Err.Number & vbCrLf & Err.Description, _
vbCritical, "処理が失敗しました。"
End Sub
Private Function GetAcc(myAcc As Office.IAccessible, myAccName As String, myAccRole As Long) As Office.IAccessible
Dim ReturnAcc As Office.IAccessible
Dim ChildAcc As Office.IAccessible
Dim List() As Variant
Dim Count As Long
Dim i As Long
If (myAcc.accState(CHILDID_SELF) <> 32769) And _
(myAcc.accName(CHILDID_SELF) = myAccName) And _
(myAcc.accRole(CHILDID_SELF) = myAccRole) Then
Set ReturnAcc = myAcc
Else
Count = myAcc.accChildCount
If Count > 0& Then
ReDim List(Count - 1&)
If AccessibleChildren(myAcc, 0&, ByVal Count, List(0), Count) = 0& Then
For i = LBound(List) To UBound(List)
If TypeOf List(i) Is Office.IAccessible Then
Set ChildAcc = List(i)
Set ReturnAcc = GetAcc(ChildAcc, myAccName, myAccRole)
If Not ReturnAcc Is Nothing Then Exit For
End If
Next
End If
End If
End If
Set GetAcc = ReturnAcc
End Function
上記コードを標準モジュールに貼り付け、下記コードのように引数を「True」にして呼び出せば、マクロでクイックアクセスツールバーをリボンの下に表示することができます。
逆に引数を「False」にすることで、クイックアクセスツールバーをリボンの上に表示することができます。
Sub Sample()
Call BelowRibbonQAT(True)
End Sub
※ 上記コードをAccessで実行する際は、事前にコード中の「Office.IAccessible」となっている部分を「IAccessible」に変更し、「system32」フォルダ内の「oleacc.dll」ファイルを参照してください。
※ 上記コードはOfficeのバージョン変更等に伴って、正常に動作しなくなる可能性があります。