こんにちは!SolidWorks自動化の現場で泥臭く、かつ優雅に図面バッチ処理と戦ってきた先輩エンジニアです。
「マクロの記録」で出力されたコードをそのまま動かしたら、既存の図面ビューが消滅したり、寸法線が明後日の方向に吹っ飛んだりして絶望した経験はありませんか?――そう、あれです。図面テンプレートやシートフォーマットの差し替えは、SolidWorks VBAにおいて最も地雷原の多い領域の一つです。
今回は、中級者へのステップアップとして、「図面テンプレート変更時に発生するシートフォーマット破損を防ぐ安全なVBA移行術」を徹底解説します。ここをクリアすれば、あなたのマクロは「おもちゃ」から「現場で頼られる実用ツール」へと生まれ変わりますよ。
—
1. なぜ「シートフォーマットの差し替え」で図面が崩壊するのか?
SolidWorksの図面(DrawingDoc)は、構造上、以下の2つの要素が重なり合ってできています。
1. シート(Sheet): 図面ビューやアノテーション(寸法、注記など)の「置き場所」
2. シートフォーマット(Sheet Format): 枠線や表題欄といった「背景デザイン」
マクロの記録機能で「プロパティ変更」を記録すると、古いフォーマットを強制上書きしようとして、シートに紐付いていたビューの参照ロストやスケールのリセットが起きます。これが崩壊の正体です。
これを防ぐための鉄則は、「既存のビュー構造を維持したまま、フォーマットファイル(.slddrt)のパスとサイズ指定を安全に再適用する」ことです。
—
2. APIの正しい呼び出し順序(ベストプラクティス)
安全な移行を実現するためのステップは以下の通りです。
1. 対象ドキュメントが「図面(Drawing)」であることを厳密にチェックする
2. 現在のシートのプロパティ(用紙サイズ、規格など)を取得する
3. `SetSheetProperties` メソッドを使い、ビューを破壊せずに新しいシートフォーマットファイルのみを割り当てる
4. 変更を確実に反映させるためにビューを強制再描画(Rebuild)する
言葉で言うのは簡単ですが、実際のコードには「SolidWorks特有の型」や「エラーハンドリング」の作法が必要です。次の実用コードを見てみましょう。
—
3. 実装コード:安全なシートフォーマット一括置換マクロ
以下のコードは、アクティブな図面の全シートに対して、指定した新しいシートフォーマットを安全に適用するマクロです。開発現場でそのままコピペして使えます。
Option Explicit
Sub SafeReplaceSheetFormat()
‘ — 1. 宣言と初期化 —
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントが開かれていない、または図面以外の場合は即座に離脱
If swModel is Nothing Then
MsgBox “図面ファイルが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If
If swModel.GetType <> swDocDRAWING Then
MsgBox “このマクロは図面ドキュメントでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If
Set swDraw = swModel
‘ — 2. 新しいシートフォーマットファイルのパス設定 —
‘ ※環境に合わせてパス書き換えてください
Dim newFormatPath As String
newFormatPath = “C:\Program Files\SolidWorks Corp\SolidWorks\data\templates\A3_NewStandard.slddrt”
‘ ファイルの存在確認(例外処理の基本)
If Dir(newFormatPath) = “” Then
MsgBox “指定されたシートフォーマットが見つかりません:” & vbCrLf & newFormatPath, vbCritical, “ファイルエラー”
Exit Sub
End If
‘ — 3. 全シートの走査と安全な置換 —
Dim sheetNames As Variant
sheetNames = swDraw.GetSheetNames()
Dim i As Long
Dim currentSheetName As String
Dim errors As Long
Dim warnings As Long
‘ 処理中の画面描画を停止してパフォーマンスを爆発的に上げるプロの技
swModel.Visible = False
On Error GoTo ErrorHandler
For i = LBound(sheetNames) To UBound(sheetNames)
currentSheetName = sheetNames(i)
‘ 対象シートをアクティブにする
swDraw.ActivateSheet currentSheetName
Set swSheet = swDraw.GetCurrentSheet()
‘ 現在のシート設定値を取得しておく(サイズや向きを維持するため)
Dim paperSize As Long
Dim templateType As Long
Dim width As Double, height As Double
Dim scale1 As Double, scale2 As Double
Dim isThirdAngle As Boolean
paperSize = swSheet.GetSize(templateType, width, height)
swSheet.GetScale scale1, scale2
isThirdAngle = swSheet.IsThirdAngle()
‘ 【最重要】ビューを維持したままシートフォーマットのみを安全に差し替える
‘ 引数: 規格, 用紙サイズ, テンプレートタイプ, 幅, 高さ, フォーマットパス, 縮分子, 縮分分母, 3角法か, ユーザー定義サイズか
Dim result As Boolean
result = swDraw.SetSheetProperties( _
swDwgPaperSizesA3, _ ‘ 例: A3 (実際のサイズ変数に合わせて調整)
paperSize, _
swDwgTemplateCustom, _
width, height, _
newFormatPath, _
scale1, scale2, _
isThirdAngle, _
True)
If Not result Then
Debug.Print “警告: シート [” & currentSheetName & “] のフォーマット更新に失敗しました。”
End If
Next i
‘ — 4. 終了処理と再描画 —
swModel.Visible = True
swModel.ForceRebuild3 True ‘ 全アノテーションとビューの整合性を強制回復
MsgBox “すべてのシートフォーマットの安全な置換が完了しました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ 予期せぬエラー時にも画面描画とファイルロックが残らないようにする保険
swModel.Visible = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
4. コードのここがポイント!プロの知見
① `swModel.Visible = False` による高速化とちらつき防止
シート数が多い図面でこれをやると、画面がパチパチと切り替わってイライラしますし、処理速度も落ちます。一度画面描画を裏側に隠すことで、処理スピードを劇的に向上させることができます。
② プロパティの「保持」と「再適用」
`swDraw.SetSheetProperties` を呼び出す際、既存の「用紙サイズ」「尺度」「図法(第三角法など)」をあらかじめ変数に退避させ、そのまま引数に渡しています。これにより、フォーマットだけが綺麗に入れ替わり、配置済みのビューのスケールや向きが勝手に変わる事故を完全に封じ込めています。
③ 最後の `ForceRebuild3`
APIで図面データをいじった直後は、メモリ上のデータとグラフィックの表示にズレが生じることがあります。最後に強制再ビルド(Rebuild)を挟むことで、寸法線のリンク切れやビューの表示崩れを防ぎます。
—
まとめ:マクロの記録を「卒業」しよう
いかがでしたでしょうか?
「マクロの記録」は便利ですが、APIの本質を知ることで、実務で本当に使える「頑健な(壊れない)プログラム」を書けるようになります。
「ここをこう変えたいんだけど、どのオブジェクトを使えばいいの?」といった疑問があれば、いつでもコメント欄などで聞いてくださいね。あなたのSolidWorks自動化ライフを、先輩エンジニアとして応援しています!
