図面内のテキストのスペルと文法を一括で確認する|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起動の時間が多少かかり、処理の始まりが遅くなる可能性が稀にあります。

'----------------------------------------------------------------------------------
'-
'-  メイン処理
'-
'----------------------------------------------------------------------------------
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
 

コード解説

サンプルコードの大まかなフローは下記の通りです。

① Microsoft Wordを起動して新規ドキュメント作成
② アクティブドキュメントのモデル空間内の要素をループしてテキスト判定
③ Wordの文章校正オプションを変更する
④ Wordにテキストの文字列を転記
⑤ Word VBAで文章校正エラーの数をカウント
⑥ エラー数が存在する場合はテキストの色を赤色に変更する
⑦ Microsoft Wordを終了
 

 Microsoft Wordを起動して新規ドキュメント作成

AutoCADからWord VBAを利用するにはWordアプリケーションのインスタンスを作成する必要があります。アプリケーションのインスタンスはCreateObject関数を使い下記のように記載します。これによりoWordはWord VBA上でのApplicationオブジェクトとして扱うことができるようになります。

 icon-code  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と表すことができるため、下記のように書くことでアクティブドキュメントのモデル空間内の要素でループ処理をすることができます

 icon-code  モデル空間内の要素ループ 

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ではオプションの設定値を変更したら元の設定に戻すという処理が一般的であるため、サンプルコードではそれに倣ってオプション変更前の設定値を取得しておき、関数の最後で設定値を元に戻すという処理を行っています。

 icon-code Wordの文章校正オプション 

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のドキュメントに入力することができます。

 icon-code  インスタンス元のブロック要素を取得 

oDoc.Content.Text = oEntity.TextString

サンプルコードでは上記処理をスペルと文法チェック用の関数内で行っているため、上記と書き方は違いますが処理内容としては同じことをやっています。
 

Word VBAで文章校正エラーの数をカウント

Wordに文字を入力すると文章校正のオプションで設定した内容で自動判定が適用されます。
このとき、ドキュメント内の文法上に誤のある文章は「GrammaticalErrors」プロパティ、スペル間違いのある単語は「SpellingErrors」プロパティよりアクセスすることができます。また、両プロパティは「Count」プロパティでその個数を取得することができるため、両プロパティの総数が1以上であれば文法もしくはスペルに間違いがある文字列であると判定することができます。

 icon-code  文法 & スペル間違いの総数取得 

oDoc.GrammaticalErrors.Count    '文法間違い数
oDoc.SpellingErrors.Count
            'スペル間違い数

サンプルコードでは文法とスペル間違いの区別はしていませんが、上記の通りそれぞれを判定したり文章にアクセスすることもできるため、Word VBAをさらに深くまで利用すればより詳細なテキストチェックを行うことも可能になります。
 

エラー数が存在する場合はテキストの色を赤色に変更する

Wordの文章校正で1つでもエラーが存在した場合は、テキストの色を赤色に変更します。
色の変更は「オブジェクトの色の取得と編集」ページでも解説している通り、AcadAcCmColorオブジェクトの「SetRGB」メソッドを使って行います。

色の変更後は画面を再作図(描画の更新)を行わないと、内部的には色の変更が行われていても画面上でのテキストの色は変更されないので注意が必要です。処理の最後に下記コードを書いて明示的に画面の描画を更新することでVBAマクロ実行後に色の変更も視覚的にわかるようにすることができます。

 icon-code 再作図の実行 

Call ThisDrawing.Regen(acActiveViewport)

 

Microsoft Wordを終了

処理がすべて終わったらインスタンス作成したWordを終了させる必要があります。
Wordの場合は下記3行を書くことでアプリケーションを終了させることができます。

 icon-code Wordの終了 

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マクロ案を募集しているのでぜひ勉強にご利用ください。
 

メインページへ戻る
 

 関連書籍

AutoCAD,VBA