質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

1回答

4525閲覧

VBAファンクション定義で「ユーザ定義型が定義されていません」とコンパイルエラーが表示される。

Surface-Yuki

総合スコア34

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2019/11/13 06:07

環境: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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

おそらく下記のページを参考にされたのかと思いますが、

[Word VBA]ルビ(ふりがな)ダイアログの操作に挑む | 初心者備忘録

そこに、

※ UIAutomationClient(UIAutomationCore.dll)要参照

との記述がありますが、UIAutomationClientの参照設定はしましたか。

参照設定の仕方については下記をご参考に。

VBA 参照設定

投稿2019/11/13 07:54

編集2019/11/13 07:56
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Surface-Yuki

2019/11/13 08:13

はい。初心者備忘録を参考に作りました。 UIAutomationClientを参照から追加したところ、先ほどのエラーは消えました。 しかし、コンパイルエラー:Meキーワードの使用方法が不正です。 という新たなエラーが出ました。
hatena19

2019/11/13 09:55

リンク先に > ※ [ThisDocument]に記述 という説明もありますが、 コードを ThisDocument に記述してますか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問