「保存」を、ただの作業から「資産管理」へ。SQL Serverと連携する究極のリビジョン管理術
こんにちは。現場の設計業務、日々お疲れ様です。
設計者のみなさん、こんな経験はありませんか?
「図面を保存するたびに、ファイル名の末尾に `_rev01`、`_rev02` と手入力している」
「どれが本当に最新の図面なのか、フォルダの中を見ても分からなくなった」
「間違えて古い版を最新だと思い込んで、修正してしまった」
もしあなたが、マクロの記録ボタンを押して「なんとなく動くもの」を作る段階から、「業務のルールをシステムとして組み込む」段階へステップアップしたいと考えているなら、この記事は最高のガイドになるはずです。
今日は、AutoCAD VBAとSQL Serverを組み合わせ、「保存ボタン一つで、データベースの版数を読み取り、自動でリビジョンを付与して別名保存する」という、プロフェッショナルな自動化ソリューションを解き明かしていきましょう。
ここをクリアすれば、あなたのAutoCAD活用術は「個人の便利ツール」から「組織のインフラ」へと進化しますよ。
1. なぜ「ファイル名管理」をデータベースに任せるのか?
通常、図面の世代管理はファイル名に依存します。しかし、ファイル名による管理には致命的な弱点があります。それは「人間は必ずミスをする」ということです。
- ファイル名の付け忘れ
- `_rev10` とすべきところを `_rev1` と書いてしまう
- どのファイルが最新か、DB(正解)とファイル(実態)が乖離してしまう
そこで、「図面の正解(版数)をSQL Serverという中央管理サーバーに持たせる」という設計思想を採用します。AutoCAD側は、そのサーバーに「今の版数は?」と聞きに行くだけ。これだけで、管理の精度は劇的に向上します。
システムの全体像
1. AutoCAD VBA: ユーザーの「保存」アクションをトリガーにする。
2. SQL Server: 現在の最新リビジョン番号を保持する。
3. 連携プロセス:
- DBから現在の版数を取得。
- 版数を +1 する。
- 新しいファイル名(`図面名_Rev02.dwg`)を生成。
- `SaveAs` メソッドで新しい名前で保存。
- DBの版数情報を更新。
2. 事前準備:データベースの設計
まずは、SQL Server側に図面情報を格納するシンプルなテーブルを用意しましょう。
-- 図面履歴管理テーブルの作成例
CREATE TABLE DrawingHistory (
DrawingID INT PRIMARY KEY IDENTITY(1,1),
OriginalFileName NVARCHAR(255) NOT NULL, -- 元の図面名(ベース名)
CurrentRevision INT NOT NULL DEFAULT 0, -- 現在のリビジョン番号
LastUpdated DATETIME DEFAULT GETDATE() -- 最終更新日時
);
-- テストデータの挿入
INSERT INTO DrawingHistory (OriginalFileName, CurrentRevision)
VALUES ('Project_A_Layout', 2);
3. 実装:魂を込めたVBAコード
ここからが本番です。AutoCAD VBAからSQL Serverに接続するには、`ADODB`(ActiveX Data Objects)というライブラリを使用します。
【重要】 VBAエディタのメニュー [ツール] -> [参照設定] から、「Microsoft ActiveX Data Objects x.x Library」にチェックを入れておいてください。これがないと、データベースとの会話ができません。
Option Explicit
' =================================================================
' プログラム名: SmartRevisionSave
' 概要: DBと連携し、自動でリビジョンを付与して保存する
' =================================================================
Sub SmartRevisionSave()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim connString As String
Dim baseFileName As String
Dim fullPath As String
Dim newFileName As String
Dim currentRev As Integer
Dim targetDocName As String
' --- 1. 設定エリア ---
' SQL Serverへの接続文字列(環境に合わせて書き換えてください)
connString = "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DB_NAME;Integrated Security=SSPI;"
' 現在開いている図面の情報を取得
' 例: "C:\Projects\Drawing_A.dwg"
fullPath = ThisDrawing.FullName
' 拡張子を除いたファイル名を取得(例: "Drawing_A")
baseFileName = Left(ThisDrawing.Name, InStrRev(ThisDrawing.Name, ".") - 1)
' データベース上の検索キーとなる名前(ここではファイル名を使用)
targetDocName = baseFileName
On Error GoTo ErrorHandler
' --- 2. データベース接続 ---
Set conn = New ADODB.Connection
conn.Open connString
Set rs = New ADODB.Recordset
' --- 3. 現在のリビジョンを取得 ---
' SQL文: 指定した図面名の最新リビジョンを検索
Dim sqlGet As String
sqlGet = "SELECT CurrentRevision FROM DrawingHistory WHERE OriginalFileName = '" & targetDocName & "'"
rs.Open sqlGet, conn, adOpenStatic, adLockReadOnly
If Not rs.EOF Then
' 既存データがある場合
currentRev = rs.Fields("CurrentRevision").Value
currentRev = currentRev + 1 ' 次のリビジョンへアップ
Else
' 新規図面の場合(DBに登録がない場合)
currentRev = 1
End If
rs.Close
' --- 4. 新しいファイル名の生成 ---
' 例: "Drawing_A_Rev03.dwg" (0埋めして見栄えを良くする)
newFileName = baseFileName & "_Rev" & Format(currentRev, "00") & ".dwg"
' 保存先のフォルダパスを維持
Dim folderPath As String
folderPath = ThisDrawing.Path & "\"
' --- 5. AutoCADでの保存実行 ---
' 重要: SaveAsを使用することで、現在の図面を新しい名前で保存し、
' 以降の操作はその新しいファイルに対して行われます。
ThisDrawing.SaveAs folderPath & newFileName
' --- 6. データベースの更新 ---
' 図面がDBになければINSERT、あればUPDATEする(UPSERT処理)
Dim sqlUpdate As String
If rs.EOF Then ' ※注: rsは既にCloseしているので、ロジック上、新規登録判定が必要
' ここでは簡略化のため、既存レコードがある前提のUPDATEコードを示します
' 実際には、rs.EOF判定を適切に使い分けるか、MERGE文を使うのがプロの技です
End If
' 既存レコードの更新SQL
sqlUpdate = "UPDATE DrawingHistory SET CurrentRevision = " & currentRev & _
", LastUpdated = GETDATE() WHERE OriginalFileName = '" & targetDocName & "'"
' もしレコードがなかった場合のINSERT
' (本来はここでレコード有無を確認して分岐させる)
' sqlInsert = "INSERT INTO DrawingHistory (OriginalFileName, CurrentRevision) VALUES ('" & targetDocName & "', " & currentRev & ")"
conn.Execute sqlUpdate
MsgBox "リビジョンアップ完了!" & vbCrLf & "保存名: " & newFileName, vbInformation, "システム通知"
CleanUp:
' 後片付け(これを行わないとメモリや接続が残り続けます)
If Not rs Is Nothing Then If rs.State = adStateOpen Then rs.Close
If Not conn Is Nothing Then If conn.State = adStateOpen Then conn.Close
Set rs = Nothing
Set conn = Nothing
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbCritical, "システムエラー"
Resume CleanUp
End Sub
4. アーキテクトの視点:陥りやすい「3つの罠」
このコードを現場に投入する前に、私が経験してきた「地雷」を共有しておきます。ここを回避できるかどうかが、初級者とプロフェッショナルの分かれ目です。
① オブジェクトのライフサイクル(メモリ管理)
コードの最後にある `CleanUp` セクションを見てください。`Set rs = Nothing` や `conn.Close` を忘れていませんか?
データベース接続は非常に「重い」リソースです。もしマクロを何度も実行し、接続を閉じ忘れると、SQL Serverの接続上限に達してしまい、「他の社員がDBに接続できなくなる」という大惨事を招きます。必ず「開けたら閉じる」を徹底してください。
② ファイルパスの扱い
`ThisDrawing.Path` は、一度も保存されていない新規図面の場合、空文字列を返します。空のパスに対してファイル名を結合しようとすると、エラーで止まってしまいます。実用的なシステムにするなら、`If ThisDrawing.Path = “” Then` のようなチェックを必ず入れましょう。
③ トランザクションの概念
今回のコードでは、「AutoCADの保存」と「DBの更新」が別々に行われています。
もし、「AutoCADの保存には成功したが、その直後にネットワークが切れてDBの更新に失敗した」場合、どうなるでしょうか?
ファイルは `Rev03` なのに、DBは `Rev02` のまま……。これが「データの不整合」です。
より高度なシステムでは、DB側でトランザクションを制御したり、エラーログを別途記録したりする設計が求められます。
5. まとめ:次の一歩へ
いかがでしたでしょうか?
「単なるファイル名の書き換え」に見える作業も、背後にあるデータベースとの対話、オブジェクトの管理、エラーへの備えを考えるだけで、立派な「システム」へと昇華されます。
マクロの記録から脱却したあなたは、今、「プログラムによって業務プロセスを定義する」という、エンジニアとしての真の力を手に入れようとしています。
まずは、自分のPC上のローカルSQL Expressなどでテスト環境を作り、このコードを動かすことから始めてみてください。一つ一つのエラーを潰していく過程こそが、あなたを伝説的なエンジニアへと導く唯一の道です。
応援していますよ。頑張ってください!
