環境:Win10
やりたいこと:Wordで作成した文書内の漢字にルビを振りたい。マニュアルで1つずつ変換するのが大変なので、マクロで自動化したい。
ファンクションを実行すると、以下の部分で
**コンパイルエラー:ユーザ定義型が定義されていません。**と表示されます。
ネットで調べると、参照設定からMicrosoft Word15.0 Object Libraryを追加すれば治るというページがいくつかありましが、それだけでは治りませんでした。
以下がエラーの部分、全体のコードも貼ってあります。
Private Function GetElement(ByVal uiAuto As CUIAutomation, _
ByVal elmParent As IUIAutomationElement, _
ByVal propertyId As Long, _
ByVal propertyValue As Variant, _
Optional ByVal ctrlType As Long = 0)
VBA詳しいかたいらっしゃいましたら、ご回答お願いします。
VBA
1'ThisDocument 2Option Explicit 3 4Private d As Object 5 6Public Sub Rubi() 7 If Selection.Start <> Selection.End Then 8 Set d = CreateObject("htmlfile") 9 Set d.parentWindow.onhelp = Me 10 d.parentWindow.SetTimeout "onhelp.ExecSetPhoneticDialog()", 100, "VBScript" 'setTimeoutで時間差実行 11 Application.Dialogs(wdDialogPhoneticGuide).Show 12 End If 13End Sub 14 15Public Sub ExecSetPhoneticDialog(Optional ByVal dummy As Long = 0) 16'文字単位,右揃え,オフセット:20,フォント:メイリオ,フォントサイズ:15 17 SetPhoneticDialog False, False, "右揃え", 20, "メイリオ", 15 18End Sub 19 20Private Sub SetPhoneticDialog(Optional ByVal flgClearReadingsButton As Boolean = False, _ 21 Optional ByVal flgGroup As Boolean = True, _ 22 Optional ByVal alignmentValue As String = "", _ 23 Optional ByVal offsetValue As Long = 0, _ 24 Optional ByVal fontValue As String = "", _ 25 Optional ByVal sizeValue As Long = 0) 26'[ルビ]ダイアログ操作 27'※UIAutomationClient(UIAutomationCore.dll)要参照 28' 引数説明 29' flgClearReadingsButton : True : ルビの解除 30' flgGroup : True : 文字列全体, False : 文字単位 31' alignmentValue : 配置 32' offsetValue : オフセット 33' fontValue : フォント 34' sizeValue : サイズ 35 36 Dim uiAuto As CUIAutomation 37 Dim elmRoot As IUIAutomationElement 38 Dim elmPhoneticDialog As IUIAutomationElement 'ルビダイアログ 39 Dim elmGroupButton As IUIAutomationElement '文字列全体 40 Dim elmMonoButton As IUIAutomationElement '文字単位 41 Dim elmClearReadingsButton As IUIAutomationElement 'ルビの解除 42 Dim elmOkButton As IUIAutomationElement 'OK 43 Dim elmAlignmentComboBox As IUIAutomationElement '配置 44 Dim elmRubyEdit As IUIAutomationElement 'ルビ 45 Dim elmOffsetEdit As IUIAutomationElement 'オフセット 46 Dim elmFontEdit As IUIAutomationElement 'フォント 47 Dim elmSizeEdit As IUIAutomationElement 'サイズ 48 Dim accAlignmentComboBox As IAccessible 49 Dim aptn As IUIAutomationLegacyIAccessiblePattern 50 Dim vptn As IUIAutomationValuePattern 51 Dim iptn As IUIAutomationInvokePattern 52 Dim i As Long 53 54 Set uiAuto = New CUIAutomation 55 Set elmRoot = uiAuto.GetRootElement 56 57 '[ルビ]ダイアログ取得 58 While elmPhoneticDialog Is Nothing 59 Set elmPhoneticDialog = GetElement(uiAuto, elmRoot, UIA_NamePropertyId, "ルビ", UIA_WindowControlTypeId) 60 DoEvents 61 Wend 62 '[文字列全体]ボタン取得 63 Set elmGroupButton = GetElement(uiAuto, elmPhoneticDialog, UIA_NamePropertyId, "文字列全体(G)", UIA_ButtonControlTypeId) 64 '[文字単位]ボタン取得 65 Set elmMonoButton = GetElement(uiAuto, elmPhoneticDialog, UIA_NamePropertyId, "文字単位(M)", UIA_ButtonControlTypeId) 66 '[ルビの解除]ボタン取得 67 Set elmClearReadingsButton = GetElement(uiAuto, elmPhoneticDialog, UIA_NamePropertyId, "ルビの解除(C)", UIA_ButtonControlTypeId) 68 '[OK]ボタン取得 69 Set elmOkButton = GetElement(uiAuto, elmPhoneticDialog, UIA_NamePropertyId, "OK", UIA_ButtonControlTypeId) 70 '[配置]コンボボックス取得 71 Set elmAlignmentComboBox = GetElement(uiAuto, elmPhoneticDialog, UIA_NamePropertyId, "配置(L):", UIA_ComboBoxControlTypeId) 72 '[ルビ]エディットボックス取得 73 Set elmRubyEdit = GetElement(uiAuto, elmPhoneticDialog, UIA_AutomationIdPropertyId, "19") 74 '[オフセット]エディットボックス取得 75 Set elmOffsetEdit = GetElement(uiAuto, elmPhoneticDialog, UIA_AutomationIdPropertyId, "35") 76 '[フォント]エディットボックス取得 77 Set elmFontEdit = GetElement(uiAuto, elmPhoneticDialog, UIA_AutomationIdPropertyId, "1792") 78 '[サイズ]エディットボックス取得 79 Set elmSizeEdit = GetElement(uiAuto, elmPhoneticDialog, UIA_AutomationIdPropertyId, "1796") 80 81 '[ルビの解除]ボタンクリック 82 If flgClearReadingsButton = True Then 83 Set iptn = elmClearReadingsButton.GetCurrentPattern(UIA_InvokePatternId) 84 iptn.Invoke 85 End If 86 '[文字単位]設定 87 If flgGroup = False Then 88 Set iptn = elmMonoButton.GetCurrentPattern(UIA_InvokePatternId) 89 iptn.Invoke 90 End If 91 92 '[配置]コンボボックス設定 93 If alignmentValue <> "" Then 94 Select Case alignmentValue 95 Case "中央揃え", "均等割り付け 1", "均等割り付け 2", "左揃え", "右揃え" 96 Set aptn = elmAlignmentComboBox.GetCurrentPattern(UIA_LegacyIAccessiblePatternId) 97 Set accAlignmentComboBox = aptn.GetIAccessible 98 For i = 1 To accAlignmentComboBox.accChildCount 99 If accAlignmentComboBox.accName(i) = alignmentValue Then 100 accAlignmentComboBox.accDoDefaultAction i 101 Exit For 102 End If 103 Next 104 End Select 105 End If 106 107 '[オフセット]エディットボックス設定 108 If offsetValue <> 0 Then 109 Set vptn = elmOffsetEdit.GetCurrentPattern(UIA_ValuePatternId) 110 vptn.SetValue CStr(offsetValue) 111 End If 112 '[フォント]エディットボックス設定 113 If fontValue <> "" Then 114 Set vptn = elmFontEdit.GetCurrentPattern(UIA_ValuePatternId) 115 vptn.SetValue fontValue 116 End If 117 '[サイズ]エディットボックス設定 118 If sizeValue <> 0 Then 119 Set vptn = elmSizeEdit.GetCurrentPattern(UIA_ValuePatternId) 120 vptn.SetValue CStr(sizeValue) 121 End If 122 123 If Len(Trim(elmRubyEdit.GetCurrentPropertyValue(UIA_ValueValuePropertyId))) < 1 Then 124 elmRubyEdit.SetFocus 125 Else 126 '[OK]ボタンクリック 127 Set iptn = elmOkButton.GetCurrentPattern(UIA_InvokePatternId) 128 iptn.Invoke 129 End If 130End Sub 131 132Private Function GetElement(ByVal uiAuto As CUIAutomation, _ 133 ByVal elmParent As IUIAutomationElement, _ 134 ByVal propertyId As Long, _ 135 ByVal propertyValue As Variant, _ 136 Optional ByVal ctrlType As Long = 0) 137 Dim cndFirst As IUIAutomationCondition 138 Dim cndSecond As IUIAutomationCondition 139 140 Set cndFirst = uiAuto.CreatePropertyCondition(propertyId, propertyValue) 141 If ctrlType <> 0 Then 142 Set cndSecond = uiAuto.CreatePropertyCondition(UIA_ControlTypePropertyId, ctrlType) 143 Set cndFirst = uiAuto.CreateAndCondition(cndFirst, cndSecond) 144 End If 145 Set GetElement = elmParent.FindFirst(TreeScope_Subtree, cndFirst) 146End Function 147 148
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/13 08:13
2019/11/13 09:55