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

スポンサーリンク

【上級プロフェッショナル】SQL Server×AutoCAD VBA!外部DBから最新BOM(部品表)を自動生成する極意

こんにちは!AutoCAD VBAの開発に慣れてくると、「図面を描く」だけでなく「図面と外部データを連携させる」領域に挑戦したくなりますよね。

「手動でExcelの部品表を見ながらAutoCADに表を作成している…」
「SQL Serverにある最新の資材マスタや価格情報を図面上の表(`AcadTable`)に一括反映したい!」

今回は、そうした「マクロの記録」を完全に脱却し、エンタープライズレベルの業務自動化を目指す皆さんのために、SQL ServerからADO経由で直接データを抽出し、AutoCAD図面内に美しいBOM(部品表)テーブルを高速で自動生成するVBAソリューションを伝授します。

一見難しそうに見えますが、オブジェクトの仕組みとデータベース連携の本質を理解すれば大丈夫です。ここをクリアすれば、AutoCAD VBAの基本と応用はバッチリですよ!

1. 全体像とオブジェクト構造を理解しよう

まずは、今回動かす技術の全体像を頭に入れておきましょう。

AutoCAD VBAで外部データベースと連携して表を描画する場合、データの流れは以下のようになります。

[ SQL Server ]
│ (ADO接続 / T-SQLクエリ)

[ ADODB.Recordset ] (メモリ上のデータテーブル)
│ (VBAによるループ処理)

[ AcadDocument (ThisDrawing) ]
└─ [ ModelSpace ] ──> [ AcadTable ] (図面内のテーブルオブジェクト)

AutoCADのオブジェクト階層のポイント

1. `AcadApplication`: AutoCAD全体の親オブジェクト。
2. `AcadDocument` (`ThisDrawing`): 現在操作している図面ファイル。
3. `ModelSpace`: 図形や表を配置する空間。
4. `AcadTable`: AutoCADネイティブの「表」オブジェクト。

単に直線や文字を組み合わせて表を作るのではなく、AutoCADネイティブの`AcadTable`を利用することで、列幅の調整やスタイルの適用、値の制御が圧倒的にスマートになります。

2. 開発準備:ADO参照設定と環境構築

VBAからSQL Serverへ接続するためには、ADO(ActiveX Data Objects) というライブラリを使用します。

参照設定の手順

1. AutoCADで `ALT + F11` を押してVBAエディタ(VBE)を開きます。
2. メニューバーの [ツール] > [参照設定] を選択します。
3. 一覧から `Microsoft ActiveX Data Objects 6.1 Library`(または 2.8 等の最新版)にチェックを入れて [OK] を押します。

![参照設定のイメージ](https://via.placeholder.com/600×200?text=VBE+References:+Microsoft+ActiveX+Data+Objects)

3. 完全実装コード(コピペ&カスタマイズ可能)

それでは、実際のコードを見てみましょう。標準モジュールを追加([挿入] > [標準モジュール])し、以下のコードを貼り付けてください。

実務でそのまま使えるよう、エラー処理描画の高速化処理メモリ解放を組み込んだ本格的な構成にしています。

Option Explicit

” ==============================================================================
” 機能:SQL ServerからBOM情報を取得し、モデル空間にAcadTableを自動生成する
” 記述言語:AutoCAD VBA
” ==============================================================================
Public Sub ImportBOMFromSQLServer()

‘ — 1. 接続情報の設定 (ご自身の環境に合わせて変更してください) —
Dim serverName As String: serverName = “localhost” ‘ SQL Serverのサーバー名
Dim dbName As String: dbName = “ProductionDB” ‘ データベース名
Dim strConn As String

‘ OLE DB Driverを使用した接続文字列 (Windows認証の場合)
strConn = “Provider=MSOLEDBSQL;Data Source=” & serverName & _
“;Initial Catalog=” & dbName & “;Integrated Security=SSPI;”

‘ — 2. ADOオブジェクトの宣言 —
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String

‘ SQLクエリ:部品コード、部品名、材質、数量、単価、金額を抽出
sql = “SELECT PartCode, PartName, Material, Quantity, UnitPrice, ” & _
“(Quantity UnitPrice) AS TotalAmount ” & _
“FROM T_BOM_Master ORDER BY PartCode ASC”

On Error GoTo ErrorHandler

‘ — 3. データベースへの接続とデータ取得 —
Set cn = New ADODB.Connection
cn.ConnectionString = strConn
cn.Open

Set rs = New ADODB.Recordset
‘ カーソルタイプをStatic、ロックタイプをReadOnlyにして高速化
rs.Open sql, cn, adOpenStatic, adLockReadOnly

If rs.EOF Then
MsgBox “対象のBOMデータが見つかりませんでした。”, vbInformation, “処理中止”
GoTo CleanUp
End If

‘ — 4. AutoCAD図面側へのテーブル作成準備 —
Dim doc As AcadDocument
Set doc = ThisDrawing

‘ テーブルの挿入位置 (X, Y, Z)
Dim insertPoint(0 To 2) As Double
insertPoint(0) = 0# ‘ X座標
insertPoint(1) = 0# ‘ Y座標
insertPoint(2) = 0# ‘ Z座標

‘ 行数と列数の算出 (ヘッダー行 + レコード数)
Dim numRows As Long: numRows = rs.RecordCount + 2 ‘ Title + Header + Data
Dim numCols As Long: numCols = rs.Fields.Count

‘ 行の高さと列の幅
Dim rowHeight As Double: rowHeight = 8.0
Dim colWidth As Double: colWidth = 35.0

‘ — 5. 描画高速化のためのロック設定 —
‘ 画面描画の更新を抑制するためのテクニック
Dim acadTable As AcadTable

‘ モデル空間にテーブルオブジェクトを追加
Set acadTable = doc.ModelSpace.AddTable(insertPoint, numRows, numCols, rowHeight, colWidth)

‘ 再描画を一時停止して処理速度を劇的に向上させる
acadTable.RegenerateTableSuppressed = True

‘ — 6. テーブルのタイトル・ヘッダー設定 —
‘ タイトル設定
acadTable.SetText 0, 0, “【自動生成】装置BOM(部品集計表)”
acadTable.SetCellTextHeight 0, 0, 4.0

‘ ヘッダー名設定
Dim colIdx As Long
Dim headers As Variant
headers = Array(“部品コード”, “部品名称”, “材質”, “数量”, “単価”, “金額”)

For colIdx = 0 To UBound(headers)
acadTable.SetText 1, colIdx, headers(colIdx)
acadTable.SetCellAlignment 1, colIdx, acMiddleCenter
acadTable.SetCellTextHeight 1, colIdx, 2.5
Next colIdx

‘ — 7. DBデータの書き込みループ —
Dim rowIdx As Long: rowIdx = 2 ‘ 0:Title, 1:Header なのでデータは2から

Do Until rs.EOF
For colIdx = 0 To numCols – 1
Dim cellValue As Variant
cellValue = rs.Fields(colIdx).Value

‘ Nullチェック
If IsNull(cellValue) Then cellValue = “”

‘ セルへ値をセット
acadTable.SetText rowIdx, colIdx, CStr(cellValue)
acadTable.SetCellTextHeight rowIdx, colIdx, 2.0

‘ 数値データ列(数量・単価・金額)は右寄せ、文字列は左寄せ
If colIdx >= 3 Then
acadTable.SetCellAlignment rowIdx, colIdx, acMiddleRight
Else
acadTable.SetCellAlignment rowIdx, colIdx, acMiddleLeft
End If
Next colIdx

rowIdx = rowIdx + 1
rs.MoveNext
Loop

‘ — 8. テーブルの描画再開と最適化 —
‘ 再描画抑制を解除(これで一気に画面に描画される)
acadTable.RegenerateTableSuppressed = False

‘ 図面全体の再表示
doc.Regen acActiveViewport

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

CleanUp:
‘ — 9. オブジェクトの安全な解放 (メモリリーク防止) —
On Error Resume Next
If Not rs Is Nothing Then
If rs.State = adStateOpen Then rs.Close
Set rs = Nothing
End If
If Not cn Is Nothing Then
If cn.State = adStateOpen Then cn.Close
Set cn = Nothing
End If
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました:” & vbCrLf & Err.Description, vbCritical, “エラー”
Resume CleanUp
End Sub

4. プロアーキテクトが教える!ハマりやすい穴と極限の知見

プログラミング初心者から一歩抜け出すために、絶対に知っておくべき3つの重要ポイントを解説します。

① 爆速化の鍵:`RegenerateTableSuppressed`

AutoCADの `AcadTable` は、1つのセルに値を書き込むたびに内部で表の再計算と描画処理を行おうとします。そのため、データが数文字・数文字と増えるにつれて指数関数的に処理が遅くなります

コード内で使用した以下のプロパティが超重要です。

acadTable.RegenerateTableSuppressed = True ‘ 再描画を一時停止
‘ … ここで大量のデータ書き込み …
acadTable.RegenerateTableSuppressed = False ‘ 最後にまとめて再描画

これを設定するだけで、100行を超える部品表の生成時間が「数十秒」から「一瞬(1秒未満)」へと劇的に高速化します。

② メモリのライフサイクル管理(`CleanUp` セクション)

VBAで外部DB(ADO)を扱う際、処理が途中でエラーになっても、接続(`Connection`)やレコードセット(`Recordset`)を明確に閉じ(`.Close`)、参照を破棄(`Set … = Nothing`)しなければなりません。

これを行わないと、AutoCADを終了するまでSQL Serverへの接続が残り続け、DB側にロックがかかったりメモリリークを引き起こしたりします。 `GoTo CleanUp` のパターンを必ず身につけましょう。

③ セルの文字サイズと配置のアライメント

`AcadTable` では、テキストを設定するだけでなく、`SetCellTextHeight`(文字高)や `SetCellAlignment`(配置)を明示的に指定するのがキレイなBOMを作るコツです。

  • `acMiddleLeft`: 左揃え中央(文字列用:部品名など)
  • `acMiddleRight`: 右揃え中央(数値用:数量、金額など)
  • `acMiddleCenter`: 中央揃え(ヘッダーやコード用)

5. まとめ

今回のソリューションをマスターすることで、以下のスキルが身につきました!

1. ADOを使ったVBAからのSQL Server操作
2. AutoCAD内部での `AcadTable` オブジェクトの動的生成
3. `RegenerateTableSuppressed` によるパフォーマンスチューニング
4. 堅牢なエラーハンドリングとメモリ管理

手作業で図面内の数値を打ち替える時代はもう終わりです。データベースとAutoCADが直結することで、設計変更があっても「ボタン一発で最新の部品表に更新」できるようになります。

ここをクリアすれば、AutoCAD VBAの基礎はバッチリです!
ぜひご自身の現場のデータベース環境に合わせてアレンジし、業務自動化のインパクトを体感してみてくださいね。応援しています!

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