【入門編】【上級】外部データベース(SQL Server)の情報を図面内のテーブル(AcadTable)へ自動反映する、BOM作成の自動化 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは! AutoCAD VBAの深淵へようこそ。世界最高峰の自動化アーキテクトである私と一緒に、今日からあなたも「真のオートメーション・マスター」への道を歩み始めましょう。

マクロの記録ボタンを押して図形をポチポチするだけの自動化は、今日で卒業です。今回は、実務の現場で最も求められる「外部データベース(SQL Server)とAutoCADの直結、そしてBOM(部品表)の完全自動生成」という、極上のテーマを紐解きます。

「データベース?難しそう……」「AcadTableの操作って癖が強いよね」
そんな不安を抱えていませんか? 大丈夫。ここをクリアすれば、あなたのCAD作業は「手作業」から「システム運用」へと劇的に進化します。優しく、そして本質的な知見を込めてガイドしていきましょう。

ぜんぶ自動化!SQL ServerからBOMを描画する全体像

私たちが目指すのは、「ボタン一つでSQL Serverに眠る最新の部品マスタを問い合せ、AutoCADの図面内に美しく整列された部品表(AcadTable)を爆速で構築する」という仕組みです。

これを手作業でやったらどうなりますか?
1. 基幹システムやSQL ServerからExcelにデータをエクスポートする。
2. その数値を睨めっこしながら、CADで表(TABLE)を線と文字で必死に描く。
3. 設計変更が入るたびに地獄の修正地獄……。

VBAとADO(ActiveX Data Objects)を使えば、この一連の工程をわずか数秒で終わらせることができます。しかも、ヒューマンエラーはゼロになります。

1. 開発の舞台裏:ADOとAcadTableの生態系を理解する

まずは、今回使用する2つの重要プレイヤーを知ることから始めましょう。

1. ADO (ActiveX Data Objects)
Windows環境において、データベース(SQL Serverなど)と対話するための共通言語です。VBAからSQL Serverの門を叩き、データを安全に引き剥がしてメモリ上に持ってきてくれる優秀なメッセンジャーだと思ってください。
2. AcadTable オブジェクト
AutoCADが持つ、Excelのテーブルによく似た強力な図形オブジェクトです。行と列を持ち、セルの結合や文字の配置、枠線の制御が可能です。ただし、COMの作法に厳格なため、行数や列数の動的な拡張にはちょっとしたコツがいります。

2. 【実戦コード】SQL Server連携・BOM自動生成マクロ

それでは、実務でそのまま使える骨太なコードを公開します。VBAエディタ(Alt + F11)を開き、標準モジュールに貼り付けてください。

※事前に「参照設定」から `Microsoft ActiveX Data Objects 6.x Library` にチェックを入れておくことをお忘れなく。

Option Explicit

‘ ==============================================================================
‘ 担当アーキテクト直伝:SQL Server連携によるBOM(部品表)自動生成プロシージャ
‘ ==============================================================================
Sub GenerateBOMFromSQLServer()
Dim conn As Object
Dim rs As Object
Dim connString As String
Dim query As String

‘ 1. ADOオブジェクトのインスタンス生成(早期バインディング推奨)
Set conn = CreateObject(“ADODB.Connection”)
Set rs = CreateObject(“ADODB.Recordset”)

‘ 2. 接続文字列の構築(環境に合わせてIPやパスワードを書き換えてください)
‘ ※SQL Server認証の例
connString = “Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME; ” & _
“Initial Catalog=PartsDB; User ID=your_user; Password=your_password;”

On Error GoTo ErrorHandler

‘ 3. データベース接続の確立
conn.Open connString

‘ 4. 最新の部品情報を取得するSQLクエリ
query = “SELECT PartNo, PartName, Material, Quantity, Remarks FROM T_PartsList ORDER BY PartNo ASC”
Set rs = conn.Execute(query)

‘ データを取得できたかチェック
If rs.EOF And rs.BOF Then
MsgBox “対象となる部品データがSQL Serverに見つかりませんでした。”, vbExclamation, “BOM自動生成”
GoTo Cleanup
End If

‘ 5. AutoCADの図面空間(ModelSpace)にAcadTableを動的生成
Call CreateOrUpdateBOMTable(rs)

MsgBox “SQL ServerからのBOM自動生成が正常に完了しました!”, vbInformation, “成功”

Cleanup:
‘ 6. オブジェクトのライフサイクル管理(メモリリーク防止の鉄則)
If rs.State = 1 Then rs.Close
If conn.State = 1 Then conn.Close
Set rs = Nothing
Set conn = Nothing
Exit Sub

ErrorHandler:
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical, “データベース連携エラー”
Resume Cleanup
End Sub

‘ ==============================================================================
‘ AcadTableを生成・配置するサブルーチン
‘ ==============================================================================
Private Sub CreateOrUpdateBOMTable(rs As Object)
Dim acadDoc As AcadDocument
Dim insertionPoint(0 To 2) Double
Dim bomsTable As AcadTable

Dim rowCount As Long
Dim colCount As Long
Dim i As Long, j As Long

Set acadDoc = ThisDrawing.ActiveDocument

‘ レコード数から行数を計算(ヘッダー行+1行分をプラス)
‘ ※RecordCountが正確に取れないプロバイダ対策としてMoveNextで数えるか、今回は簡易的に処理
rs.MoveLast
rowCount = rs.RecordCount + 1 ‘ ヘッダー分
rs.MoveFirst

colCount = rs.Fields.Count ‘ フィールド数(列数)

‘ テーブルの挿入基点(図面の原点 0,0,0 または任意の座標)
insertionPoint(0) = 0#
insertionPoint(1) = 0#
insertionPoint(2) = 0#

‘ 既存の図面に同名のテーブルがあれば削除するなどの実務的処理をここに挟むと尚良し

‘ モデル空間にテーブルオブジェクトを追加 (行数, 列数, 行の高さ, 列の幅)
Set bomsTable = acadDoc.ModelSpace.AddTable(insertionPoint, rowCount, colCount, 10, 50)

‘ スタイルやレイアウトの調整
bomsTable.SetText 0, 0, “部品表 (BOM – SQL Server Linked)”

‘ ヘッダー行の設定
For j = 0 To colCount – 1
bomsTable.SetText 1, j, rs.Fields(j).Name
‘ 背景色や文字サイズの変更もここで可能(APIの仕様を参照)
5 Next j

‘ データ行の流し込み(ADOのレコードセットからAcadTableへ一気に転記)
i = 2 ‘ データは3行目(Index=2)からスタート
Do Until rs.EOF
For j = 0 To colCount – 1
‘ Null値対策として空文字を結合
bomsTable.SetText i, j, Nz(rs.Fields(j).Value, “”)
Next j
rs.MoveNext
i = i + 1
Loop

‘ 図面を再描画して変更を反映
acadDoc.Regen acActiveViewport
End Sub

‘ 簡易Null置換関数
Private Function Nz(val As Variant, replacement As String) As String
If IsNull(val) Then
Nz = replacement
Else
Nz = CStr(val)
End If
End Function

3. 現場で躓きやすい「罠」と、その回避策

このコードは実務レベルの堅牢性を持たせていますが、AutoCAD VBAとデータベースを扱う際には、特有の「罠」が存在します。先輩エンジニアからのアドバイスとして心に留めておいてください。

罠その1:メモリリーク(COMオブジェクトの解放忘れ)

データベース接続(Connection)やレコードセット(Recordset)は、使い終わったら必ず `Close` し、`Set obj = Nothing` でメモリからキレイに消し去らなければなりません。これを怠ると、AutoCADが徐々に重くなり、最悪の場合は強制終了を引き起こします。上記のコードにある `Cleanup` ラベルの作法は、プログラミングの基本中の基本です。

罠その2:ADOの `RecordCount` の罠

一部のデータベースドライバでは、`rs.RecordCount` が正しく `-1` を返すことがあります。そのため、大規模なシステムを構築する際は、レコードセットを配列(Array)に一度一括格納(`GetRows`メソッド)してからテーブルに流し込む手法をとるのが、プロのエンジニアの常套手段です。今回は分かりやすさを優先してカーソル移動方式にしていますが、パフォーマンスを極めたい方は `GetRows` の研究をおすすめします。

ここをクリアすれば、AutoCAD VBAの基本はバッチリ!

お疲れ様でした! 外部データベースと繋がり、CADの図面が動的に書き換わる仕組みを目の当たりにすると、VBAの本当のポテンシャルが体感できたのではないでしょうか。

  • ADOを使った外部データへのアクセス
  • AcadTableオブジェクトの動的生成とセルの値操作
  • エラーハンドリングとリソースの解放(ライフサイクル管理)

ここをクリアしたあなたなら、もはや「初心者」ではありません。自社の業務フローに合わせた最強のBOM自動化ツールを構築し、まわりのエンジニアたちをあっと言わせる図面環境を作ってみせてください。

あなたのAutoCADライフが、もっと知性的で、もっとクリエイティブなものになりますように。次回の極限の知見もお楽しみに!

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