マクロ記録からの脱却。図面標準を統治する「コンプライアンスチェッカー」の設計思想
こんにちは。設計自動化の世界へようこそ。
「マクロの記録」ボタンを押して、録画されたコードを眺めて「ふーん、こうやって動いてるんだ」と思ったことはありませんか? もしそうなら、あなたは今、プログラミングの入り口に立っています。しかし、そこから先にある「設計の自動化エンジニア」というプロフェッショナルな領域へ進むには、「オブジェクトの繋がり」と「設計の正しさ(ガバナンス)」を意識する必要があります。
今日は、単なる「作業の自動化」を超えた、一歩上のステップをご紹介しましょう。
テーマは、【図面フォーマット(.slddrt)のコンプライアンスチェッカー】です。
1. なぜ「フォーマットの検証」が必要なのか?
大規模な設計現場では、数百、数千の図面がやり取りされます。ここで恐ろしいのが、「古いテンプレート(.slddrt)を使い続けている図面」が混入することです。
- 図面の枠線(タイトルブロック)が古いバージョンのまま。
- 社内の最新規定に基づいた、新しい属性情報(プロジェクト番号や承認欄)が欠落している。
- 不正に改変された、独自のルールを持つテンプレートが使われている。
これらは、一見すると小さなミスに見えますが、データの集計ミスや、製造現場への誤情報の伝達といった、致命的なリスクを孕んでいます。
そこで、「この図面は、我が社の最新標準フォーマットを使っているか?」をプログラムで瞬時に判定し、違反があれば警告を出す。これこそが、エンジニアリングにおける「ガバナンス(統治)」の自動化です。
2. SolidWorks API の「階層構造」を理解する
コードを書く前に、設計図の「構造」を頭の中に描いてください。マクロ記録のコードが読みづらいのは、この構造を無視して「画面上の操作」を羅列しているからです。
プロは、以下のようなオブジェクトの階層(ツリー構造)を辿って、目的のデータにアクセスします。
SldWorks (アプリケーション全体)
└── ModelDoc2 (開いているファイル)
└── DrawingDoc (図面ファイル特有の機能)
└── Sheet (図面シート)
└── SheetFormatFileName (使用されている .slddrt のパス) ⭐ここが重要!
今回のチェッカーの目的は、この一番下の `SheetFormatFileName` を取得し、それが「許可されたパスにあるか」を検証することです。
3. 実践:コンプライアンスチェッカーのコード
それでは、実際に動くコードを見てみましょう。
このコードは、現在開いている図面が「最新の標準テンプレート」を使用しているかをチェックします。
Option Explicit
' ==============================================================================
' プログラム名: DrawingFormatComplianceChecker
' 概要: 現在開いている図面のシートフォーマット(.slddrt)が、
' 指定された標準パスに含まれているかを検証する。
' ==============================================================================
Sub Main()
' --- 1. オブジェクトの宣言 ---
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim currentFormatPath As String
Dim standardFormatPath As String
Dim isComplianceOK As Boolean
' --- 2. 定数の設定 (ここを社内のルールに合わせて書き換える) ---
' 本来はサーバー上のパスなどを指定します
standardFormatPath = "C:\Standard_Templates\Company_Standard_A.slddrt"
' --- 3. SolidWorksへの接続と初期チェック ---
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' ファイルが開かれていない、または図面ファイルではない場合のガード処理
If swModel Is Nothing Then
MsgBox "図面ファイルを開いてから実行してください。", vbExclamation
Exit Sub
End If
If swModel.GetType <> swDocDRAWING Then
MsgBox "このマクロは図面ファイル専用です。", vbExclamation
Exit Sub
End If
' --- 4. 図面オブジェクトへのキャスト ---
' ModelDoc2をDrawingDocとして扱うことで、図面特有のプロパティにアクセス可能にする
Set swDraw = swModel
' --- 5. 現在のシート情報の解析 ---
' 現在表示されているシートを取得
Set swSheet = swDraw.GetCurrentSheet
' シートに適用されているフォーマットファイルのフルパスを取得
currentFormatPath = swSheet.GetSheetFormatFileName
' --- 6. コンプライアンス検証ロジック ---
' パスの文字列比較(大文字小文字を区別しない)
If LCase(currentFormatPath) = LCase(standardFormatPath) Then
isComplianceOK = True
Else
isComplianceOK = False
End If
' --- 7. 結果の出力 ---
If isComplianceOK Then
MsgBox "【合格】" & vbCrLf & _
"最新の標準フォーマットが適用されています。", vbInformation, "Compliance Check"
Else
MsgBox "【警告:規格外のフォーマットです!】" & vbCrLf & vbCrLf & _
"現在のパス: " & currentFormatPath & vbCrLf & _
"期待されるパス: " & standardFormatPath & vbCrLf & vbCrLf & _
"最新のテンプレートでシートを再作成してください。", vbCritical, "Compliance Violation"
End If
' --- 8. メモリの解放 (プロの作法) ---
Set swSheet = Nothing
Set swDraw = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
4. ここがプロの分かれ道! 陥りやすいエラーと回避術
コードを書く際、初心者が必ずと言っていいほどハマるポイントが3つあります。ここをクリアすれば、あなたはもう「マクロ記録レベル」ではありません。
① 「Nothing」への配慮(オブジェクトのライフサイクル)
コードの最後にある `Set swSheet = Nothing`。これは単なるお作法ではありません。
SolidWorksのような巨大なアプリケーションでは、メモリ上にオブジェクトが残り続けると、動作が重くなったり、最悪の場合、SolidWorksがクラッシュしたりします。使い終わったオブジェクトは、明示的に「空っぽにする」のが鉄則です。
② 型の「キャスト」をマスターする
`swModel` は `ModelDoc2` 型として宣言されています。しかし、図面特有の操作(シートの切り替えなど)をしたい場合、`ModelDoc2` にはその命令がありません。
そこで、`Set swDraw = swModel` とすることで、「このModelDoc2は、実はDrawingDocなんだよ」とプログラムに教えてあげる必要があります。これを「キャスト」と呼びます。
③ 文字列比較の罠
`”C:\Temp\format.slddrt”` と `”c:\temp\format.slddrt”` は、人間には同じに見えますが、コンピュータにとっては別物です。
`LCase()` 関数を使って、両方を小文字に揃えてから比較することで、大文字小文字の違いによる「誤検知」を防ぐことができます。
5. さらなる高みへ:このツールをどう進化させるか?
今回ご紹介したのは、最もシンプルな「1つのパスとの比較」です。実務で使える強力なツールにするには、以下のような拡張が考えられます。
- 複数規格への対応: 「A図面なら規格A、B図面なら規格B」というように、リスト(配列)を持たせて判定する。
- 自動修正機能: 規格外だった場合、プログラムから自動的に最新の `.slddrt` を読み込み、シートを上書きする。
- ログ出力: 誰が、いつ、どの図面で規格違反を起こしたかを、CSVファイルやデータベースに自動記録する。
まとめ
SolidWorks VBAの真の価値は、単に「クリックを代行すること」ではなく、「設計品質をコードによって担保すること」にあります。
「マクロの記録」で得た知識を、こうして「オブジェクトの構造」として捉え直し、業務のルール(コンプライアンス)を組み込んでいく。そのプロセスこそが、エンジニアとしての成長そのものです。
一歩ずつ、着実に。コードの向こう側にある「設計の未来」を、一緒に作っていきましょう!
