以前MSAAを利用してOffice クリップボードを操作するマクロを書いたことがあるのですが、
・Office 2007/2010・リボンのカスタマイズ 初心者備忘録
//www.ka-net.org/office/of55.html
・Office 2007/2010・リボンのカスタマイズ 初心者備忘録
//www.ka-net.org/office/of56.html
今回は上記マクロをUI Automationを使う形に書き直してみました。
※ UIAutomationClient(UIAutomationCore.dll)要参照
※ UIAutomationClient参照時にエラーが発生する場合は「UIAutomationClient参照時にDLL読み込みエラーが発生した時の対処法」参照
Private Sub DoActionOfficeClipboard(ByVal ButtonName As String) 'Officeクリップボードコマンド実行 Dim uiAuto As UIAutomationClient.CUIAutomation Dim accClipboard As Office.IAccessible Dim elmClipboard As UIAutomationClient.IUIAutomationElement Dim elmButton As UIAutomationClient.IUIAutomationElement Dim cndButtons As UIAutomationClient.IUIAutomationCondition Dim aryButtons As UIAutomationClient.IUIAutomationElementArray Dim ptnAcc As UIAutomationClient.IUIAutomationLegacyIAccessiblePattern Dim i As Long Set elmButton = Nothing '初期化 Set uiAuto = New UIAutomationClient.CUIAutomation With Application .CommandBars("Office Clipboard").Visible = True DoEvents Set accClipboard = .CommandBars("Office Clipboard") End With Set elmClipboard = uiAuto.ElementFromIAccessible(accClipboard, 0) Set cndButtons = uiAuto.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_ButtonControlTypeId) Set aryButtons = elmClipboard.FindAll(TreeScope_Subtree, cndButtons) For i = 0 To aryButtons.Length - 1 If aryButtons.GetElement(i).CurrentName = ButtonName Then Set elmButton = aryButtons.GetElement(i) Exit For End If Next If elmButton Is Nothing Then Exit Sub If elmButton.CurrentIsEnabled <> False Then Set ptnAcc = elmButton.GetCurrentPattern(UIA_LegacyIAccessiblePatternId) ptnAcc.DoDefaultAction End If End Sub Private Sub PasteOfficeClipboardListItem(ByVal ItemNum As Long) 'Officeクリップボードに登録されているアイテムを貼り付け Dim aryListItems As UIAutomationClient.IUIAutomationElementArray Dim ptnAcc As UIAutomationClient.IUIAutomationLegacyIAccessiblePattern Set aryListItems = GetOfficeClipboardListItems If (aryListItems.Length = 1) And _ (InStr(aryListItems.GetElement(0).CurrentName, "クリップボードは空です")) Then MsgBox "クリップボードは空です。" & vbCrLf & _ "処理を中止します。", vbCritical + vbSystemModal Exit Sub End If If (ItemNum > aryListItems.Length) Or _ (ItemNum < 1) Then MsgBox "現在指定できる番号は [1 - " & aryListItems.Length & "]までです。" & vbCrLf & _ "処理を中止します。", vbCritical + vbSystemModal Exit Sub End If Set ptnAcc = aryListItems.GetElement(ItemNum - 1).GetCurrentPattern(UIA_LegacyIAccessiblePatternId) ptnAcc.DoDefaultAction End Sub Private Function GetOfficeClipboardListItems() As UIAutomationClient.IUIAutomationElementArray 'Officeクリップボードリスト取得 Dim uiAuto As UIAutomationClient.CUIAutomation Dim accClipboard As Office.IAccessible Dim elmClipboard As UIAutomationClient.IUIAutomationElement Dim cndListItems As UIAutomationClient.IUIAutomationCondition Set uiAuto = New UIAutomationClient.CUIAutomation With Application .CommandBars("Office Clipboard").Visible = True DoEvents Set accClipboard = .CommandBars("Office Clipboard") End With Set elmClipboard = uiAuto.ElementFromIAccessible(accClipboard, 0) Set cndListItems = uiAuto.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_ListItemControlTypeId) Set GetOfficeClipboardListItems = elmClipboard.FindAll(TreeScope_Subtree, cndListItems) End Function
使い方は下記の通りで、MSAAのコードに比べると、大分シンプルになっています。
Public Sub Test1() 'Officeクリップボードにあるアイテム列挙 Dim aryListItems As UIAutomationClient.IUIAutomationElementArray Dim i As Long Set aryListItems = GetOfficeClipboardListItems For i = 0 To aryListItems.Length - 1 Debug.Print i + 1, aryListItems.GetElement(i).CurrentName Next End Sub Public Sub Test2() 'DoActionOfficeClipboard "すべて貼り付け" DoActionOfficeClipboard "すべてクリア" End Sub Public Sub Test3() '20番目のアイテムを貼り付け PasteOfficeClipboardListItem 20 End Sub
この記事へのコメントはありません。