記録マクロを卒業し、「設計の自動化エンジニア」へ。型番駆動型ファミリーチューブの構築術
こんにちは。設計自動化の深淵へようこそ。
「マクロの記録」ボタンを押して、録画されたコードを眺めては、「なぜか動かない」「途中で止まる」「動きが遅すぎる」と頭を抱えていませんか?
もしあなたが、単なる「作業の自動化」ではなく、「データを入れるだけで、設計図面からPDF、フォルダ仕分けまでが魔法のように完結するシステム」を作りたいと考えているなら、今日この瞬間から、あなたの視点は「操作の記録」から「オブジェクトの制御」へと進化する必要があります。
今回は、エンタープライズ領域で求められる【外部DB連動型・型番駆動型ファミリーチューブ】の構築をテーマに、プロの設計者がどのような思考プロセスでコードを書き、どのような「罠」を回避しているのかを、その核心までお伝えします。
1. 設計思想:プロの自動化は「データ」から始まる
初心者が陥る最大の罠は、SolidWorksの画面を操作することから始めてしまうことです。しかし、プロフェッショナルな自動化エンジニアは、「データの流れ(Data Flow)」から設計します。
今回構築するシステムの全体像は、以下のフローです。
1. Source (外部データ): ExcelやSQL Serverに格納された「製品仕様(型番、寸法、材質など)」を読み込む。
2. Controller (VBA): データを解析し、SolidWorksへ「指示」を出す。
3. SolidWorks (3D/2D): 指定されたコンフィギュレーションへ切り替え、図面を生成・更新する。
4. Output (成果物): PDFとして書き出し、FileSystemObjectを用いて適切なフォルダへ自動仕分けする。
これを実現するためには、SolidWorksのAPIを単なる「ボタンの代わり」として使うのではなく、「オブジェクトのライフサイクル」を管理する司令塔として扱う必要があります。
2. 核心的なテクニック:オブジェクトの制御とパフォーマンス
効率的な自動化には、避けては通れない「重み」があります。
グラフィックス更新の抑制(スピードの鍵)
SolidWorksは、モデルや図面が変更されるたびに画面を描画しようとします。100個の図面を作る際、毎回画面が動いていたら、処理時間は数倍に膨れ上がります。
`swApp.Visible = False` にするだけでなく、描画更新を抑制する制御を組み込むのがプロの作法です。
コンフィギュレーション切替の「同期」
ここが最も重要なポイントです。
「コンフィギュレーションを切り替えた直後に図面を更新しようとしても、SolidWorksの内部計算が追いついていない」という事象が多発します。
`swModel.ForceRebuild3` を呼び出し、モデルの計算を強制的に完了させてから図面操作に移る。この「待ち」の概念こそが、エラーを防ぐ境界線です。
3. 実践:エンタープライズ・オートメーション・テンプレート
それでは、実際に「Excelのリストを読み込み、コンフィギュレーションを切り替え、図面をPDF化して保存する」という一連の流れを実装した、骨格となるコードを見てみましょう。
このコードは、そのままコピペして使うのではなく、「どのようなロジックでオブジェクトを繋いでいるか」を読み解くための地図として使ってください。
' ==============================================================================
' プロジェクト名: Type-Driven Family Tube Generator
' 概要: Excelから仕様を読み込み、SWモデルのConfig切替、図面生成、PDF出力を行う
' ==============================================================================
Option Explicit
' Microsoft Scripting Runtime への参照設定を推奨
' Microsoft Excel Object Library への参照設定を推奨
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDrawing As SldWorks.DrawingDoc
Dim xlApp As Excel.Application
Dim xlWB As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim fso As Object
' --- 1. 初期化フェーズ ---
On Error GoTo ErrorHandler
Set swApp = Application.SldWorks
Set fso = CreateObject("Scripting.FileSystemObject")
' Excelの起動(外部データソース)
Set xlApp = New Excel.Application
Set xlWB = xlApp.Workbooks.Open("C:\Data\ProductList.xlsx") ' パスは環境に合わせて変更
Set xlSheet = xlWB.Sheets(1)
' 描画更新を停止して高速化(プロのテクニック)
swApp.Visible = True ' デバッグ時はTrue、本番はFalseを検討
Dim i As Integer
Dim lastRow As Long
lastRow = xlSheet.Cells(xlSheet.Rows.Count, 1).End(xlUp).Row ' 最終行取得
' --- 2. ループ処理フェーズ(データ駆動型) ---
For i = 2 To lastRow ' 2行目から開始(ヘッダーを除く)
Dim partPath As String: partPath = xlSheet.Cells(i, 1).Value ' A列: モデルパス
Dim configName As String: configName = xlSheet.Cells(i, 2).Value ' B列: Config名
Dim drawingTemplate As String: drawingTemplate = xlSheet.Cells(i, 3).Value ' C列: 図面テンプレート
Dim outputFolder As String: outputFolder = xlSheet.Cells(i, 4).Value ' D列: 保存先
' A. 3Dモデルを開く
Set swModel = swApp.OpenDoc6(partPath, swDocPART, swOpenDocOptions_Silent, "", 0, 0)
If Not swModel Is Nothing Then
' B. コンフィギュレーションの切り替え
' ここでモデルの計算を強制的に完了させるのが重要!
swModel.ShowConfiguration2 configName
swModel.ForceRebuild3 True
' C. 図面の生成(テンプレートから新規作成)
Dim swDrawModel As SldWorks.ModelDoc2
Set swDrawModel = swApp.NewDocument(drawingTemplate, 0, 0, 0)
Set swDrawing = swDrawModel
If Not swDrawing Is Nothing Then
' D. 図面へのビュー配置(簡易的な例)
' 本来はここで座標計算やシートフォーマット制御を行う
swDrawing.CreateDrawViewFromModelView3 partPath, "*Isometric", 0.1, 0.1, 0
' E. PDF出力
Dim pdfPath As String
pdfPath = outputFolder & "\" & configName & ".pdf"
' 保存先フォルダが存在しない場合は作成
If Not fso.FolderExists(outputFolder) Then
fso.CreateFolder outputFolder
End If
' PDF書き出し実行
swDrawModel.Extension.SaveAs pdfPath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, 0, 0
' F. 後片付け(メモリ解放とクローズ)
swApp.CloseDoc swDrawModel.GetTitle
End If
swApp.CloseDoc swModel.GetTitle
End If
Debug.Print "Processed: " & configName
Next i
' --- 3. 終了フェーズ ---
xlWB.Close SaveChanges:=False
xlApp.Quit
Set xlApp = Nothing
MsgBox "全工程が完了しました。お疲れ様でした!", vbInformation
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました。行: " & i & vbCrLf & "内容: " & Err.Description, vbCritical
If Not xlApp Is Nothing Then xlApp.Quit
End Sub
4. 陥りやすい「3つの罠」と回避策
プロへの階段を登る際、必ずと言っていいほどぶつかる壁があります。
罠①:`Nothing` の恐怖(オブジェクトの不在)
`Set swModel = swApp.OpenDoc6(…)` を実行した際、ファイルパスが間違っていると `swModel` は `Nothing` になります。これに気づかず次の行で `swModel.ShowConfiguration2` を実行すると、プログラムは即座にクラッシュします。
対策: 必ず `If Not swModel Is Nothing Then` という条件分岐を挟む癖をつけましょう。
罠②:メモリリーク(リソースの解放漏れ)
ループの中で大量のドキュメントを開き、閉じずに放置すると、SolidWorksのメモリ消費が爆発的に増え、最終的にPCがフリーズします。
対策: `swApp.CloseDoc` を確実に呼び出し、ループの終わりでは使用したオブジェクトを `Set obj = Nothing` で解放する意識を持ちましょう。
罠③:パスの区切り文字とFileSystemObject
Excelから取得したパスに末尾の `\` があるかないかで、ファイル保存に失敗することがあります。
対策: 今回のコードのように `FileSystemObject` を使い、フォルダの存在確認 (`FolderExists`) と作成 (`CreateFolder`) を自動化するロジックを組み込むのがスマートです。
5. おわりに:技術の先にあるもの
ここまで読んでくれたあなたは、もう単なる「マクロの記録者」ではありません。
「データがどう動き、オブジェクトがどう制御されるか」を理解しようとする、立派な自動化エンジニアの卵です。
今回紹介したコードは、あくまで基礎的な骨組みです。ここから、図面内の寸法値を自動で書き換える、特定のレイヤーを表示・非表示にする、SQL Serverから直接データをPullする……といった具合に、無限に拡張していくことができます。
一歩ずつ、コードの「意味」を噛み締めながら進んでいってください。
もしエラーが出ても、それは失敗ではなく、APIの仕様を学ぶための貴重なヒントです。
「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ」
さあ、次の自動化へ向けて、キーボードを叩きましょう!
