図面内のテキストのスペルと文法を一括で確認する|AutoCAD VBAマクロの作成方法
本ページではVBAを使ってAutoCADのモデル空間内に存在するテキストの文法とスペルを一括で確認する方法を解説していきます。(ここでいう”テキスト”は文字記入で生成された要素のこと)
AutoCADには標準の機能で英文字のスペルをチェックする[スペルチェック](SPELL)コマンドが存在します。この機能は文字通りスペル(綴り)のチェックしか行われないため、日本語の文法的な間違いは確認することが出来ません。そこで、ここではVBAを使ってMicrosoft Wordの文章校正機能を呼び出し、スペルチェックと合わせて日本語の文法も確認する方法を解説します。
アプリケーションとしては別ですが考え方としてはMicrosoft Excelを操作する方法と同じなので、「AutoCAD VBAでExcelを操作する方法」ページを先に一読しておくと本ページの内容が理解しやすくなるので併せてご参照ください。
テキストのスペルと文法を一括で確認する
本ページでは図面内にあるテキストのスペルと文法を一括確認するマクロを解説していきます。
サンプルコードは下記のような仕様になっています。技術的にはマルチテキストやブロック内テキストもスペルと文法の確認対象とすることはできますが、処理が少し複雑になるためここでは機能の核の部分を理解しやすいように文字記入で作成されたテキストのみを対象としています。
・テキストは文字記入で作成された要素(AcadTextオブジェクト)のみ対象
・ブロック内のテキストは対象外
・文法もしくはスペルが間違っているテキストの文字色を赤色にする
※前提条件としてマクロ実行端末にMicrosoft Wordがインストールされていること
文法とスペルチェックの正誤判定はWordの設定に依存する
Microsoft Wordには文章校正(入力した文章に間違いがある際に赤い波線で指摘してくれる)機能が備わっており、英単語のスペルチェックだけでなく、日本語の文法的な間違いも確認することができます。この文章校正の機能をAutoCADのVBAで利用することで、AutoCAD内で使用しているテキストの文字列に対してスペルチェックと文法の確認を行わせることができます。
スペルチェックと文章校正の判定はすべてWordの設定に依存します。サンプルコードではWordの[オプション]>[文章校正]の項目を上画像の通りの内容に設定して文章校正を行います。文書スタイルによっては文法間違いとして出す場合と出さない場合があるので、任意でWordの文章校正設定を変更してください。(テキストをWordに貼り付けたときに、赤い波線が出るかのみを判定しています)
サンプルコード
下記はアクティブドキュメントのモデル空間内にあるテキストのスペルと文法を一括確認するサンプルコードです。実行後に”裏側”でWordが開かれるため、メモリ使用量等のバックグラウンドの状況によってはWord起動の時間が多少かかり、処理の始まりが遅くなる可能性が稀にあります。
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
'---------------------------------------------------------------------------------- '- '- メイン処理 '- '---------------------------------------------------------------------------------- Sub main() Dim oWord As Object 'Word.Application Dim oDoc As Object 'Word.document Dim oEntity As AcadEntity Dim oColor As AcadAcCmColor Dim sText As String Dim vSplit As Variant 'Wordアプリケーション作成 Set oWord = CreateObject("Word.Application") Set oDoc = oWord.Documents.Add oWord.Visible = False 'モデル空間内要素ル-プ For Each oEntity In ThisDrawing.ModelSpace Select Case TypeName(oEntity) '■単一行テキスの場合 Case "IAcadText" sText = oEntity.TextString 'テキストの文法&スペル判定 If IsGrammarError(oWord, sText) = True Then Debug.Print "NG: " & sText 'テキストカラーを赤色に変更 Set oColor = oEntity.TrueColor Call oColor.SetRGB(255, 0, 0) oEntity.TrueColor = oColor Else Debug.Print "OK: " & sText End If End Select Next '再作図(描画更新) Call ThisDrawing.Regen(acActiveViewport) 'アプリケーション解放 Call oDoc.Close(False) Call oWord.Quit Set oWord = Nothing End Sub '---------------------------------------------------------------------------------- '- 文法とスペルを確認する (※Wordの文章校正の判定に完全依存) '- oWord :Wordアプリケーション '- sText :確認対象の文字列 '- 戻り値 :[True] 文法とスペルのいずれかに間違いがある '- [false] 文法とスペルのいずれも正しい '---------------------------------------------------------------------------------- Private Function IsGrammarError(oWord As Object, sText As String) As Boolean Dim oDoc As Object 'Word.document Dim oRngGramErr As Object 'Word.Range Dim oRngSpelErr As Object 'Word.Range Dim lCntError As Long Dim flgDefOpt1 As Boolean Dim flgDefOpt2 As Boolean Dim flgDefOpt3 As Boolean Dim flgDefOpt4 As Boolean Dim sDefStyle As String Set oDoc = oWord.ActiveDocument '現状の文章校オプション設定値を取得 flgDefOpt1 = oWord.Options.CheckGrammarWithSpelling '文章校正とスペルチェックを一緒に行う flgDefOpt2 = oWord.Options.CheckSpellingAsYouType '入力時にスペルチェックを行う flgDefOpt3 = oWord.Options.CheckGrammarAsYouType '自動文章校正 flgDefOpt3 = oWord.Options.ShowReadabilityStatistics '文書の読みやすさを評価する sDefStyle = oDoc.ActiveWritingStyle(oWord.Application.Language) '文書のスタイル '文章校正オプションの変更 oWord.Options.CheckGrammarWithSpelling = True oWord.Options.CheckSpellingAsYouType = True oWord.Options.CheckGrammarAsYouType = True oWord.Options.ShowReadabilityStatistics = True oWord.ActiveDocument.ActiveWritingStyle(oWord.Application.Language) = "公用文(校正用)" 'Wordドキュメントに文字列を入力 oDoc.Content.Text = sText '文法エラー数取得 lCntError = oDoc.GrammaticalErrors.Count 'スペルエラー数取得 lCntError = oDoc.SpellingErrors.Count + lCntError '文法もしくはスペルエラーがある場合はTrueを返す If lCntError > 0 Then IsGrammarError = True Else IsGrammarError = False End If 'オプションを元の値に戻す oWord.Options.CheckGrammarWithSpelling = flgDefOpt1 oWord.Options.CheckSpellingAsYouType = flgDefOpt2 oWord.Options.CheckGrammarAsYouType = flgDefOpt3 oWord.Options.ShowReadabilityStatistics = flgDefOpt4 oWord.ActiveDocument.ActiveWritingStyle(oWord.Application.Language) = sDefStyle End Function |
コード解説
サンプルコードの大まかなフローは下記の通りです。
② アクティブドキュメントのモデル空間内の要素をループしてテキスト判定
③ Wordの文章校正オプションを変更する
④ Wordにテキストの文字列を転記
⑤ Word VBAで文章校正エラーの数をカウント
⑥ エラー数が存在する場合はテキストの色を赤色に変更する
⑦ Microsoft Wordを終了
Microsoft Wordを起動して新規ドキュメント作成
Set oWord = CreateObject(“Word.Application”)
Set oDoc = oWord.Documents.Add
oWord.Visible = False
Wordアプリケーションが扱えるようになったら、「oWord.Documents.Add」でドキュメントを新規作成します。これはWordの文書を記載するエリアのオブジェクトで、新規作成したドキュメントはoDocという変数に格納しておきます。これにより「oDoc.Content.Text = “テキスト”」とすることでWordに任意の文字列を入力することができるようになります。
また、今回はWordアプリケーションを使った処理はユーザーの目に見えないよう”裏側”で行いたいため、「oWord.Visible = False」としてWord自体を画面上に表示させないようにしています。この値を「True」にするとWordアプリケーションが起動されていることが視覚的にわかるようになるので、コードの動きを確認したい場合はここをTrueにして実行すると処理内容がわかりやすくなります。
アクティブドキュメントのモデル空間内の要素をループしてテキスト判定
アクティブドキュメントのモデル空間はThisDrawing.ModelSpaceと表すことができるため、下記のように書くことでアクティブドキュメントのモデル空間内の要素でループ処理をすることができます。
Dim oEntity As AcadEntity
For Each oEntity In ThisDrawing.ModelSpace
Select Case TypeName(oEntity)
Case “IAcadText”
‘oEntityを使った処理
End Select
Next
モデル空間内の要素がテキストかの条件分岐を行うにはTypeName関数を使ってoEntityのオブジェクトタイプを調べることで判定することができます。単一行テキストの場合は「IAcadText」と取得することができるため、oEntityの中でも単一行テキストの場合にのみWordを使った文字列のスペルと文法確認を行うような処理にします。
ここに条件を追加することで、マルチテキストやブロック内のテキストを確認の対象にすることも可能です。ただしマルチテキストについては取得できるテキストに書式情報も付いてくるため、テキスト部分の文字列のみを抽出するような処理が必要になってきます。ブロック内のテキストに関しては「テキストの文字列を一括で置換する」ページで扱っているのであわせて参照下さい。
Wordの文章校正オプションを変更する
テキストのスペルチェックと文章校正を行うためのWordのオプション設定をVBAで変更します。文章校正オプションの値は下記の方法でアクセス可能です。VBAではオプションの設定値を変更したら元の設定に戻すという処理が一般的であるため、サンプルコードではそれに倣ってオプション変更前の設定値を取得しておき、関数の最後で設定値を元に戻すという処理を行っています。
oWord.Options.CheckGrammarWithSpelling ‘文章校正とスペルチェックを一緒に行う
oWord.Options.CheckSpellingAsYouType ‘入力時にスペルチェックを行う
oWord.Options.CheckGrammarAsYouType ‘自動文章校正
oWord.Options.ShowReadabilityStatistics ‘文書の読みやすさを評価する
oDoc.ActiveWritingStyle(oWord.Application.Language) ‘文書のスタイル
オプションの設定値としてサンプルコードでは文章校正オプションの値をすべて「True」にして、文書スタイルを「公用文(校正用)」にしています。このオプション設定の値によってスペルと文法チェックの判定が変わるので、任意で環境にあったオプション設定値に変更してください。
Wordにテキストの文字列を転記
Wordの文章校正の設定が完了したらAutoCADのテキストの文字列をWordのドキュメントに転記します。Wordのドキュメントには「Content」プロパティ、AutoCADのテキストの文字列には「TextString」プロパティを使いアクセスができるため、下記のように書くことでAutoCADテキストの文字列をWordのドキュメントに入力することができます。
oDoc.Content.Text = oEntity.TextString
サンプルコードでは上記処理をスペルと文法チェック用の関数内で行っているため、上記と書き方は違いますが処理内容としては同じことをやっています。
Word VBAで文章校正エラーの数をカウント
Wordに文字を入力すると文章校正のオプションで設定した内容で自動判定が適用されます。
このとき、ドキュメント内の文法上に誤のある文章は「GrammaticalErrors」プロパティ、スペル間違いのある単語は「SpellingErrors」プロパティよりアクセスすることができます。また、両プロパティは「Count」プロパティでその個数を取得することができるため、両プロパティの総数が1以上であれば文法もしくはスペルに間違いがある文字列であると判定することができます。
oDoc.GrammaticalErrors.Count ‘文法間違い数
oDoc.SpellingErrors.Count ‘スペル間違い数
サンプルコードでは文法とスペル間違いの区別はしていませんが、上記の通りそれぞれを判定したり文章にアクセスすることもできるため、Word VBAをさらに深くまで利用すればより詳細なテキストチェックを行うことも可能になります。
エラー数が存在する場合はテキストの色を赤色に変更する
Wordの文章校正で1つでもエラーが存在した場合は、テキストの色を赤色に変更します。
色の変更は「オブジェクトの色の取得と編集」ページでも解説している通り、AcadAcCmColorオブジェクトの「SetRGB」メソッドを使って行います。
色の変更後は画面を再作図(描画の更新)を行わないと、内部的には色の変更が行われていても画面上でのテキストの色は変更されないので注意が必要です。処理の最後に下記コードを書いて明示的に画面の描画を更新することでVBAマクロ実行後に色の変更も視覚的にわかるようにすることができます。
Call ThisDrawing.Regen(acActiveViewport)
Microsoft Wordを終了
処理がすべて終わったらインスタンス作成したWordを終了させる必要があります。
Wordの場合は下記3行を書くことでアプリケーションを終了させることができます。
Call oDoc.Close(False) ‘ドキュメントを閉じる
Call oWord.Quit ‘Wordを終了する
Set oWord = Nothing
まず1行目で初めに新規作成していたドキュメントを閉じます。このとき、引数を「Flase」とすることで保存するかの旨を聞かれるダイアログを表示せずにドキュメントを閉じることができます。次に2行目の「Quit」メソッドを使うことで、インスタンス作成したWordを終了(解放)することができます。最後のNothingはWordを格納していた変数内を明示的に空にするために行っている処理です。
まとめ
本ページではAutoCAD VBAからMicrosoft Wordの機能を呼び出すことで文章校正を行う方法について解説しました。このようにVBAを使うことで外部アプリケーションの機能を呼び出すことができ、AutoCADだけでは実現できない処理を行うことが可能になります。
本ページの内容はあくまでも一例で、たとえばExeファイルやバッチファイルを実行させてその結果を利用したり、自作のDllファイルを呼び出して画像認識を行わせたり、RPAでAutoCADの操作を自動化したりと、VBAを利用することでAutoCADの標準機能だけではできない様々なことが実現できます。
「作りたいものはあるけど作り方がわからない!」という方は下記リンク先のメインページでAutoCADのVBAマクロ案を募集しているのでぜひ勉強にご利用ください。