こんにちは!AutoCAD VBAの世界へようこそ。
これまでマクロの記録を使ったり、決まりきったコードを動かしたりして、「もう少し自分の思い通りにAutoCADをコントロールしたいな」と感じていませんか?
今回は、一歩進んだプロフェッショナルな領域――「図面を開く前の条件分岐とカスタムダイアログ制御」について、徹底的に解説していきます。
「図面を開く前にダイアログを出して、ユーザーの入力によって処理を変えるなんて難しそう…」と思うかもしれませんが、安心してください。ここをクリアすれば、あなたのVBAスキルは確実に一段上のステージへ昇格します。
優しく、そして本質的な部分までしっかりと噛み砕いてお伝えするので、一緒にマスターしていきましょう!
—
1. なぜ「図面を開く前」の制御が重要なのか?
通常、AutoCAD VBAのプログラムは「図面が開いた後(`ThisDrawing`が有効な状態)」に実行されますよね。しかし、実務の現場ではこんな要望がよくあります。
- 「大量の図面を処理する前に、対象のプロジェクトコードをユーザーに入力させたい」
- 「図面のバージョンやステータスを事前にチェックし、条件に合わなければ開くのをキャンセルしたい」
- 「専用の入力フォーム(UserForm)で条件を指定してから、処理のルートを動的に切り替えたい」
これらを実現するためには、「AutoCADのアプリケーション全体をコントロールする(`ThisDrawing`の外側に立つ)」という視点が必要です。ここが今回の最大の肝になります。
—
2. 全体像の把握:アプリケーションレベルの制御
AutoCAD VBAでは、図面ごとのオブジェクト(`ThisDrawing`)のほかに、AutoCAD全体を司る`Application`オブジェクトが存在します。
図面が開いていない状態(あるいは起動直後)でも動くマクロを作るには、この`Application`を起点にし、独自に作成したUserForm(ユーザーフォーム)を呼び出す仕組みを作ります。
処理の流れ
1. トリガー実行: ユーザーが起動用のマクロを実行する。
2. カスタムダイアログ表示: UserFormが立ち上がり、ユーザーに条件(処理モードやパラメータ)を聞く。
3. 条件分岐(パース): 入力された値に応じて、開く図面の選定や、実行するロジックを切り替える。
4. 図面オープン&処理実行: `Documents.Open`メソッド等を使って安全に図面を開き、自動処理を流し込む。
—
3. 実装コード:カスタムダイアログと条件分岐の完全サンプル
それでは、実際に現場で使える実用的なコードを見ていきましょう。
ここでは、「プロジェクト選択用フォーム(`frmProjectSelector`)」をあらかじめ作成している前提で、標準モジュールに記述するメイン処理を解説します。
ステップ1:ユーザーフォームの準備(イメージ)
VBE(Visual Basic Editor)を開き、`UserForm1`(今回は `frmProjectSelector` とリネーム)を新しく挿入してください。
- テキストボックス(`txtProjectNo`):プロジェクト番号入力用
- コンボボックス(`cmbMode`):処理モード選択用(例:「図面チェック」「一括印刷」「レイアウト整理」)
- コマンドボタン(`cmdOK`):決定用
ステップ2:標準モジュールの記述
以下のコードを標準モジュール(例:`modAutoCADController`)に貼り付けてください。
Option Explicit
‘ =================================================================
‘ テーマ: 図面オープン前のカスタムダイアログ制御と条件分岐
‘ 執筆者: チーフアーキテクト
‘ =================================================================
Public g_ProjectNo As String
Public g_ExecutionMode As String
Public g_UserCancelled As Boolean
Sub Main_OpenAndProcessDrawing()
On Error GoTo ErrorHandler
‘ 1. 初期化
g_UserCancelled = False
‘ 2. カスタムダイアログ(UserForm)のインスタンス化と表示
Dim dlg As frmProjectSelector
Set dlg = New frmProjectSelector
dlg.Show
‘ ユーザーが「キャンセル」またはフォームを閉じた場合の処理
If g_UserCancelled Then
MsgBox “処理がキャンセルされました。”, vbInformation, “終了”
Exit Sub
End If
‘ 3. ダイアログから得た情報に基づく条件分岐とファイル操作
Dim targetFile As String
targetFile = “C:\AutoCAD_Projects\Templates\StandardTemplate.dwg” ‘ サンプルパス
‘ ファイルの存在確認(実務で必須のエラーハンドリング)
If Dir(targetFile) = “” Then
MsgBox “指定された図面が見つかりません: ” & vbCrLf & targetFile, vbCritical, “ファイルエラー”
Exit Sub
End If
‘ 4. アプリケーションレベルで図面を開く
Dim targetDoc As AcadDocument
Set targetDoc = ThisDrawing.Application.Documents.Open(targetFile)
‘ 開いた図面をアクティブにする
targetDoc.Activate
‘ 5. 選択されたモードによる条件分岐処理
Select Case g_ExecutionMode
Case “図面チェック”
Call RunDesignCheck(targetDoc)
Case “一括印刷”
Call RunBatchPrint(targetDoc)
Case “レイアウト整理”
Call RunLayoutCleanup(targetDoc)
Case Else
MsgBox “未知のモードが選択されました。”, vbExclamation
End Select
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
‘ — 以下、各モードのサブプロシージャ(サンプル) —
Private Sub RunDesignCheck(doc As AcadDocument)
MsgBox “プロジェクト [” & g_ProjectNo & “] のデザインチェックを実行します。”, vbInformation
‘ ここにレイヤ確認やブロック定義のチェックコードを記述
End Sub
Private Sub RunBatchPrint(doc As AcadDocument)
MsgBox “プロジェクト [” & g_ProjectNo & “] の一括印刷シーケンスを開始します。”, vbInformation
‘ ここに印刷設定(Plotオブジェクト)のコードを記述
End Sub
Private Sub RunLayoutCleanup(doc As AcadDocument)
MsgBox “プロジェクト [” & g_ProjectNo & “] のレイアウト整理を実行します。”, vbInformation
‘ ここにビューポートや不要レイアウト削除のコードを記述
End Sub
ステップ3:ユーザーフォーム側のコード
フォーム(`frmProjectSelector`)のコードウィンドウには、以下のように記述してデータをグローバル変数に渡します。
Option Explicit
Private Sub UserForm_Initialize()
‘ コンボボックスの初期化
With cmbMode
.AddItem “図面チェック”
.AddItem “一括印刷”
.AddItem “レイアウト整理”
.ListIndex = 0 ‘ デフォルトで先頭を選択
End With
End Sub
Private Sub cmdOK_Click()
‘ 入力チェック(バリデーション)
If Trim(txtProjectNo.Text) = “” Then
MsgBox “プロジェクト番号を入力してください。”, vbExclamation, “入力エラー”
txtProjectNo.SetFocus
Exit Sub
End If
‘ パブリック変数に値を格納
g_ProjectNo = Me.txtProjectNo.Text
g_ExecutionMode = Me.cmbMode.Value
g_UserCancelled = False
‘ フォームを閉じる
Unload Me
End Sub
Private Sub cmdCancel_Click()
g_UserCancelled = True
Unload Me
End Sub
—
4. 陥りやすい罠とプロの知見(エラー回避の極意)
現場でこのシステムを運用する際、初心者が必ずと言っていいほどハマる「罠」があります。プロとして、ここを事前にクリアしておきましょう。
罠1:`ThisDrawing` と `Documents.Open` の混同
図面が開いていない、あるいは複数図面が絡む状況で `ThisDrawing` を乱用すると、「オブジェクト変数または With ブロック変数が見つかりません(Error 91)」というお馴染みのエラーが発生します。
- 解決策: 図面を開く前や横断的な処理では、必ず `ThisDrawing.Application.Documents` を使用してください。AutoCADアプリケーション自体を上位オブジェクトとして捉えるのが鉄則です。
罠2:メモリリークとオブジェクトの解放
VBAで図面を開閉する際、開いたドキュメントオブジェクト(`AcadDocument`)を適切に変数管理しないと、AutoCADのプロセス裏でメモリが解放されず、動作が重くなったりフリーズしたりします。
- 解決策: 使い終わったオブジェクト変数は、処理の最後に `Set targetDoc = Nothing` と明示的に解放する習慣をつけましょう。
—
まとめ:ここをクリアすれば、基本はバッチリ!
今回は、図面オープン前のカスタムダイアログ制御と、条件分岐による高度な処理のルーティングについて解説しました。
1. `Application`オブジェクトを起点にしてAutoCAD全体をコントロールする
2. UserFormを使ってユーザーから確実に入力値を受け取る
3. `Select Case`で処理のルートを美しくスマートに分岐させる
4. エラーハンドリングとオブジェクトの解放を忘れない
ここをしっかりと理解し実装できるようになれば、単なる「マクロの自動再生」から、実務で本当に役立つ「業務自動化システム・エンジニア」へのステップアップは完了したも同然です。
ぜひご自身の開発環境でも試して、日々の図面管理・設計業務を圧倒的に効率化させてみてくださいね。応援しています!
