これは、メニューの構造によっては、微調整が必要な場合があります。しかし、いったんこれがどのように機能するかを理解したら、必要に応じて変更することができます。
まず、カスタムメニューの名前を調べる必要があります。既に知っている場合は、この手順をスキップしてください。それ以外の場合、返された名前を取得します。
Dim x As Integer
For x = 1 To CommandBars.Count
If CommandBars(x).BuiltIn = False Then
Debug.Print x, CommandBars(x).Name, CommandBars(x).BuiltIn
End If
Next x
次に、この手順にカスタムメニューの名前を渡します。私が言ったように、メニューがセットアップされている方法によっては、これは、それをカスタマイズする必要があるすべてのものを返すかもしれません。
Private Sub ReadMenuControls(ByVal strCmdBar As String)
On Error GoTo errhandler
Dim x, y As Integer
Dim SubMenu As Object
With CommandBars(strCmdBar)
Debug.Print "Control Count Main: ", .Controls.Count
For x = 1 To .Controls.Count
With .Controls(x)
Debug.Print x & " <== " & .Caption & " ==>"
If .Type = 1 Then 'Command Button
Debug.Print "Button", x, .Caption, .Type, .ID, .FaceId, .Style, .onaction
Else 'If .Type = 10 Then 'Menu
Set SubMenu = CommandBars(strCmdBar).Controls(x)
For y = 1 To SubMenu.Controls.Count
With .Controls(y)
Debug.Print " * Button", y, .Caption, .Type, .ID, .FaceId, .Style, .onaction
End With
Next
End If
End With
Next
End With
Exit Sub
errhandler:
If Err.Number <> 438 Then
Debug.Print "ReadMenuControls", Err.Number, Err.description
End If
Resume Next
End Sub