先日、 @furyutei さんが(CommandBars).ExecuteMsoメソッドの引数となるコントロールIDの取得方法についてツイートされているのを目にしました。
はい、自分もその方法(クイックアクセスツールバーに登録してコントロールID確認)で調べました…ポップアップ(ツールチップ)の文字列簡単に取得する方法ありませんかね?
— 風柳 (@furyutei) May 17, 2021
@ExcelVBAer さんが当ブログの下記記事を紹介してくださっていますが、対象のコントロールをクイック アクセス ツール バーに追加すれば、オプション画面からポップアップでIDを確認できます。
ただ、ポップアップからIDを直接文字列として取得するのは手間が掛かるため、私としてはクイック アクセス ツール バーの情報が記録された設定ファイル(「%LOCALAPPDATA%\Microsoft\Office」フォルダにある「officeUI」ファイル)からIDを取得する方法をお薦めします。
officeUIファイルの実体はXMLで、下記のような構造になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | < mso:ribbon > < mso:qat > < mso:sharedControls > < mso:control idQ = "mso:AutoSaveSwitch" visible = "true" /> < mso:control idQ = "mso:FileNewDefault" visible = "false" /> < mso:control idQ = "mso:FileOpenUsingBackstage" visible = "false" /> < mso:control idQ = "mso:FileSave" visible = "true" /> < mso:control idQ = "mso:FileSendAsAttachment" visible = "false" /> < mso:control idQ = "mso:FilePrintQuick" visible = "false" /> < mso:control idQ = "mso:PrintPreviewAndPrint" visible = "false" /> < mso:control idQ = "mso:Spelling" visible = "false" /> < mso:control idQ = "mso:Undo" visible = "true" /> < mso:control idQ = "mso:Redo" visible = "true" /> < mso:control idQ = "mso:SortAscendingExcel" visible = "false" /> < mso:control idQ = "mso:SortDescendingExcel" visible = "false" /> < mso:control idQ = "mso:PointerModeOptions" visible = "false" /> < mso:control idQ = "mso:OfficeExtensionsGallery2" visible = "true" /> < mso:control idQ = "mso:OfficeExtensionsAppStore" visible = "true" /> < mso:control idQ = "mso:OfficeExtensionsGallery3" visible = "true" /> < mso:control idQ = "mso:AddInManager" visible = "true" /> </ mso:sharedControls > </ mso:qat > </ mso:ribbon > </ mso:customUI > |
これを見れば分かる通り、クイック アクセス ツール バーに登録されている各コントロールのIDはmso:control要素のidQ属性の値を取得すれば良いので、そのための簡単なマクロを書いてみました。
Option Explicit | |
Public Sub GetQATCtrl() | |
'クイック アクセス ツール バーに登録してあるコントロールのID取得 | |
Dim officeUiFilePath As String | |
Dim ctrlId As String | |
Dim ctrlList As String | |
Dim n As Object | |
With CreateObject("Scripting.FileSystemObject") | |
officeUiFilePath = CreateObject("Shell.Application").Namespace("shell:Local AppData\Microsoft\Office").Self.Path | |
officeUiFilePath = .BuildPath(officeUiFilePath, Replace(Application.Name, "Microsoft ", "") & ".officeUI") | |
If .FileExists(officeUiFilePath) = False Then Exit Sub | |
End With | |
With CreateObject("MSXML2.DOMDocument.6.0") | |
.async = False | |
If .Load(officeUiFilePath) Then | |
.SetProperty "SelectionLanguage", "XPath" | |
.SetProperty "SelectionNamespaces", "xmlns:mso='http://schemas.microsoft.com/office/2009/07/customui'" '名前空間の指定 | |
For Each n In .SelectNodes("mso:customUI/mso:ribbon/mso:qat/mso:sharedControls/mso:control[@visible='true']") | |
ctrlId = Replace(n.Attributes.getNamedItem("idQ").NodeValue, "mso:", "") | |
ctrlList = ctrlList & ctrlId & vbTab & Application.CommandBars.GetLabelMso(ctrlId) & vbNewLine | |
Next | |
SetCB ctrlList 'IDリストをクリップボードにコピー | |
End If | |
End With | |
End Sub | |
Private Sub SetCB(ByVal str As String) | |
'クリップボードに文字列を格納 | |
With CreateObject("Forms.TextBox.1") | |
.MultiLine = True | |
.Text = str | |
.SelStart = 0 | |
.SelLength = .TextLength | |
.Copy | |
End With | |
End Sub |
visible属性の値がtrueになっているmso:control要素からコントロールIDを取得し、(CommandBars).GetLabelMsoメソッドで取得したコントロールのラベルと一緒にクリップボードにコピーするだけのシンプルな処理です。
(Excelだけではなく、WordやPowerPointでも動くようにしてあります。)
OfficeアプリケーションのコントロールIDは、Microsoftが公開しているリストからも取得できますので、お使いのバージョンに合わせてリストをダウンロードしてお使いください。
この記事へのコメントはありません。