【入門編】【初心者向け】AcadApplication.WindowStateの制御:処理中にAutoCADを最小化し、Excel側の操作を邪魔させない工夫 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCADの自動化の世界へようこそ。
ExcelとAutoCADを行ったり来たりするマクロを作っていると、こんなイライラを感じたことはありませんか?

  • 「ExcelからAutoCADを動かした途端、AutoCADの画面がパカパカ切り替わって邪魔だな…」
  • 「処理が重い間、ユーザーが勝手にAutoCADを触ってエラーになっちゃったよ…」
  • 「こっちはExcel側で進捗バーを見せたいのに、AutoCADが前面に出てきちゃって見えない!」

分かります。その悩み、今日のテーマである `WindowState`(ウィンドウステート)の制御 ですべて解決できます。

ここをクリアすれば、あなたの作るツールは「ただ動くマクロ」から「プロが作った洗練された業務システム」へと生まれ変わります。さあ、優しく紐解いていきましょう!

1. なぜウィンドウ制御が必要なのか?(オブジェクトモデルの核心)

ExcelのVBAからAutoCADを操作するとき、裏側では「COM(Component Object Model)」という技術を使って、Excelが親、AutoCADが子として通信しています。

ここで知っておくべき、チーフアーキテクトからの最初の極意です。

> 「GUI(画面の描画)の更新と裏での計算処理は、CPUにとって重い二重苦である」

処理の最中にAutoCADの画面を最大化や標準表示にしていると、AutoCADは「今、ユーザーに見せるために画面をキレイに描き直さなきゃ!」と余計なパワーを使ってしまいます。さらに、ユーザーがうっかりマウスでAutoCADをクリックしようものなら、処理がフリーズしたり予期せぬエラー(COM例外)が起爆したりします。

だからこそ、「重い処理をする前にはAutoCADを最小化し、裏方に徹してもらう」。これが実務における鉄則なのです。

2. WindowStateの基本と3つの状態

AutoCADのウィンドウ状態を制御するのは、`AcadApplication.WindowState` というプロパティです。これには以下の3つの定数が用意されています。

  • `acAcdMax` : 最大化(ウィンドウを画面いっぱいにする)
  • `acAcdMin`最小化(タスクバーに隠す。今回一番使う主役!)
  • `acAcdNorm` : 標準(元のサイズに戻す)

これらをExcelのVBAから操ることで、AutoCADを自在にコントロールできるようになります。

3. 【実践】ExcelからAutoCADを最小化して安全に処理するコード

それでは、実際にExcelのVBAエディタ(SEの皆さんはお馴染みですね)に貼り付けて動かせるサンプルコードを見てみましょう。

今回は、Excel側からAutoCADを起動(または取得)し、ウィンドウを最小化して安心・安全に図形を描画し、終わったら元の状態に戻すという一連の流れを実装します。

Sub ControlAutoCADWindow_Sample()
Dim acadApp As Object
Dim originalState As Integer

On Error GoTo ErrorHandler

‘ 1. AutoCADが起動しているか確認し、オブジェクトを取得する(なければ新規起動)
On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If acadApp Is Nothing Then
Set acadApp = CreateObject(“AutoCAD.Application”)
End If
On Error GoTo ErrorHandler ‘ エラー監視を元に戻す

‘ 2. AutoCADの視認性を確保(必要に応じて表示)
acadApp.Visible = True

‘ 3. 現在のウィンドウ状態を退避しておく(処理が終わったら元に戻すため!)
originalState = acadApp.WindowState

‘ ★ここが本日のハイライト:AutoCADを最小化してExcelに主導権を渡す!
acadApp.WindowState = acAcdMin

‘ —————————————————-
‘ 【裏方での処理エリア】
‘ ここに重たい図形描画や一括処理を書きます
‘ ユーザーはExcel側で進捗を確認しながら安心して待てます
MsgBox “AutoCADを最小化しました。「OK」を押すと重い処理のシミュレーションを開始します。”, vbInformation, “進捗確認”

‘ 処理中の擬似ウェイト(実際にはここで大量のDraw処理などを行う)
Application.Wait (Now + TimeValue(“0:00:03”))
‘ —————————————————-

‘ 4. 処理が完了したら、ウィンドウの状態を元の大きさに戻す
acadApp.WindowState = originalState

MsgBox “すべての処理が安全に完了しました!”, vbInformation, “完了”
Exit Sub

ErrorHandler:
‘ エラー時の安全装置:万が一途中で止まってもウィンドウを元に戻す配慮を忘れない
If Not acadApp Is Nothing Then
acadApp.WindowState = originalState
End If
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub

コードの解説ポイント

1. 現在の状態を退避する (`originalState`)
処理が終わったとき、ユーザーが最初「最大化」で使っていたのか「標準サイズ」で使っていたのかを忘れて勝手に戻すと、ユーザーは少しイラッとします。元の状態を記憶しておき、最後にそれを代入する。この「気配り」がプロのエンジニアの証です。
2. エラーハンドリングの重要性
処理の途中で予期せぬエラーが起きたとき、AutoCADが最小化されたまま放置されるとユーザーは焦ります。`ErrorHandler`を記述し、異常終了時でもウィンドウの状態を復元できるようにするのが堅牢なシステムの組み方です。

4. 初学者が陥りがちな罠とエラー回避の知見

ここで、AutoCAD VBAを学び始めた人が必ずと言っていいほどハマる「罠」を先回りして共有しておきます。

罠①:「定数(`acAcdMin`など)」が使えない!?

ExcelのVBAからAutoCADを操作する場合、ExcelのVBAエディタは初期状態ではAutoCADの定数(`acAcdMin`など)を知りません。(コンパイルエラー「変数が定義されていません」が出ます)

【解決策】
対策は2つあります。

  • 方法A(初心者向け): 定数の代わりに実際の数値を使う(`acAcdMin` は `2` です)。

acadApp.WindowState = 2 ‘ 2 = 最小化 (acAcdMin)

  • 方法B(スマートな方法): ツール > 参照設定 から `AutoCAD 20xx Type Library` にチェックを入れる(これで定数が使えるようになります)。

罠②:非表示(`Visible = False`)との違い

「画面に出したくないなら、`Visible = False` にすればいいのでは?」と思うかもしれません。
確かにそれも一つの手ですが、AutoCADを完全に非表示にすると、一部の古いバージョンや複雑なアドオン(AutoLISPや外部コマンド)が絡んだときに予期せぬメモリリークや固まり方をすることがあります。
そのため、「アプリケーション自体はVisible(表示)のまま、WindowStateをMin(最小化)にする」方が、COMのライフサイクルにおいて圧倒的に安定します。

まとめ

いかがでしたか?今回は `AcadApplication.WindowState` を使って、処理中にAutoCADを最小化し、Excel側の操作性と安心感を守るテクニックを解説しました。

  • 処理中は `WindowState = acAcdMin` でAutoCADを裏方に徹させる!
  • 終わったらユーザーが元々使っていた状態に優しく戻してあげる!
  • エラー時もウィンドウの復元を忘れない!

ここをクリアすれば、あなたのAutoCAD VBAスキルは確実に一段階ステップアップしています。ぜひ明日の実務から取り入れて、まわりのメンバーをあっと言わせる快適なツールを作ってみてくださいね。

それでは、次回の極意でお会いしましょう!

タイトルとURLをコピーしました