AutoCAD VBAの限界を超えろ:SQL Server連携による「図面バージョン統合管理」の深淵
AutoCADの図面管理において、「どのDWGが最新か」という問いに、人間が介在している時点でそのシステムは既に破綻している。
現場のシニアエンジニア諸君なら理解しているはずだ。ファイルサーバ上の日付やファイル名など、信頼に値しない。真の管理とは、「図面データの実体」と「DB上のメタデータ(リビジョン情報)」の完全な同期にある。
本稿では、AutoCAD VBAをハブとし、SQL Serverを信頼できる唯一の情報源(SSOT)として運用する、極限の自動化アーキテクチャを提示する。
—
1. アーキテクチャの要諦:非同期処理の回避とメモリの解放
VBAはシングルスレッドであり、COMインターフェースを介したAutoCADの制御は極めて繊細だ。特に、外部DBとのコネクションを確立しながら図面を操作する場合、オブジェクトの解放(`Nothing`代入)を怠れば、AutoCADのプロセスは瞬く間にメモリリークで肥大化する。
実装における鉄則
- ADOによる遅延のない接続: `ADODB.Connection`の接続文字列は、認証のオーバーヘッドを最小化するために、可能な限りネイティブドライバ(`SQL Server Native Client`)を使用せよ。
- COMオブジェクトの厳格な解放: AutoCADの`Application`、`Document`、`Database`オブジェクトは、スコープを抜ける前に明示的に`Set obj = Nothing`せよ。これができないエンジニアは、そもそもAutoCAD VBAを触る資格がない。
—
2. 実装コード:SQL Serverと連動した「強制同期オープン」
以下のコードは、DB内のリビジョンIDとローカルファイルのハッシュ(またはタイムスタンプ)を比較し、不一致であれば最新版をストリームとしてローカルにダウンロードした後に開く、という一連の処理だ。
‘ 必要な参照設定: Microsoft ActiveX Data Objects x.x Library
Option Explicit
Public Sub OpenLatestDrawingFromDB(ByVal DrawingID As Long)
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String
Dim dbPath As String, localPath As String
‘ 1. SQL Server接続の確立
Set conn = New ADODB.Connection
conn.ConnectionString = “Provider=SQLNCLI11;Server=YOUR_SERVER;Database=CAD_DB;Trusted_Connection=yes;”
conn.Open
‘ 2. 最新のファイルパスとバージョン情報を取得
strSQL = “SELECT FilePath, VersionHash FROM Drawings WHERE ID = ” & DrawingID
Set rs = conn.Execute(strSQL)
If Not rs.EOF Then
dbPath = rs!FilePath
localPath = “C:\CAD_Cache\” & DrawingID & “.dwg”
‘ 3. バージョン比較と同期処理(FileSystemObjectを使用)
If IsFileOutdated(localPath, rs!VersionHash) Then
DownloadFileFromDB dbPath, localPath ‘ BLOBデータをローカルへ書き出し
End If
‘ 4. AutoCADで開く(Read-Onlyで開くのが堅牢性のコツ)
ThisDrawing.Application.Documents.Open localPath, True
End If
‘ 5. 明示的解放(メモリ管理の極意)
rs.Close: Set rs = Nothing
conn.Close: Set conn = Nothing
End Sub
Private Function IsFileOutdated(ByVal path As String, ByVal remoteHash As String) As Boolean
‘ ここでファイルハッシュの比較を行う(SHA256等を利用し整合性を保証)
‘ 実務ではFSOのDateLastModifiedよりもハッシュ値比較を推奨
IsFileOutdated = True ‘ 簡略化のため常にTrue
End Function
—
3. レガシー環境を生き抜くためのWindows API活用
時に、AutoCADの`Documents.Open`メソッドだけでは、バックグラウンドでのプロセス競合や、モーダルダイアログによるハングアップが発生する。これを回避するために、`User32.dll`を用いてウィンドウの状態を監視し、強制的に制御権を奪還するテクニックが必要だ。
‘ モーダルダイアログの回避・制御用API定義
Private Declare PtrSafe Function FindWindow Lib “user32” Alias “FindWindowA” _
(ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
`FindWindow`を使用して、AutoCADが「図面を開く過程」で警告ダイアログ(プロキシ警告など)を出していないか監視し、見つけ次第`SendKeys`または`SendMessage`で「OK」を送り込む。これが、無人運用における「真の自動化」だ。
—
4. 伝説のエンジニアからの提言
AutoCAD VBAは古臭い言語かもしれない。しかし、その内部で駆動しているCOMオートメーションは、現代のどの最新ツールよりも深くAutoCADの心臓部にアクセスできる。
- エラーハンドリングの徹底: `On Error GoTo` を使わないコードはゴミだ。DB通信の失敗、ファイルアクセス権の欠如、AutoCADのビジー状態。これら全てを想定し、ログを吐き出せ。
- 疎結合な設計: DBのロジックとCAD操作のロジックは必ず分離せよ。将来的にAutoCAD APIが.NETベースの`ObjectARX`へ完全に移行した際、DBアクセス層をそのまま流用できるようにしておくのが、シニアの矜持だ。
君たちが構築するのは単なるスクリプトではない。会社の設計資産を守り抜く「防壁」であることを忘れるな。健闘を祈る。
