【SolidWorks VBA】図面シートサイズ動的変更の極意:A3からA2へ、スケール崩れを防ぐ堅牢なプロパティ操作
業務自動化エンジニアの私だ。設計現場において、図面サイズの変更は日常茶飯事である。「A3で収まると思ったが情報量が多すぎたためA2へスケールアップする」「社内規格の改定に伴い図枠テンプレートを差し替える」――これらを人の手でやっているようでは、エンジニアの名が廃る。
今回は、SolidWorks VBAを用いて図面シートのサイズを動的に変更し、図枠のスケール崩れやビューの破綻を防ぐための「堅牢なプロパティ操作」を授けよう。ネット上の浅いサンプルコードをコピペして「なぜか図面が崩れた」「エラーで止まった」と頭を抱えているなら、ここから先の本質的な知見を見てほしい。
—
1. なぜ「シートサイズ変更」で図面が崩れるのか?(APIの裏側)
SolidWorksの図面(DrawingDoc)において、シートサイズ(A4, A3, A2など)の変更は単なる「紙の大きさの変更」ではない。
背後で何が起きているかを知るのが、チーフアーキテクトとしての第一歩だ。
- 用紙フォーマット(Sheet Format)の結びつき: シートサイズを変更すると、SolidWorksは指定された標準サイズ(またはカスタムサイズ)の `.slddrt`(図枠ファイル)をロードしようとする。
- 原点(Origin)とビュー位置の相対関係: 単にサイズを変更すると、図面の左下原点(または中心)を基準にレイアウトが再計算され、配置したアセンブリや部品図のビュー、寸法線が宙に浮いたり、図枠からはみ出したりする。
これを防ぐためには、「シートプロパティの正確な書き換え」と「カスタム用紙サイズへの対応」をプログラム側で完全に制御しなければならない。
—
2. 現場で使える!堅牢なプロダクションコード
以下のコードは、アクティブな図面ドキュントのシートサイズを動的に変更し、必要であればカスタム用紙サイズを指定するための実践的なVBAマクロだ。エラーハンドリングを徹底し、実務の現場でそのまま組み込めるクオリティに仕上げている。
Option Explicit
‘ ==============================================================================
‘ 処理名 : АctiveSheet_ChangeSize
‘ 概要 : アクティブな図面のシートサイズを動的に変更する
‘ 備考 : 標準サイズだけでなく、カスタムサイズ(幅・高さ指定)にも対応
‘ ==============================================================================
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim boolstatus As Boolean
Dim lngPaperSize As Long
Dim dblWidth As Double
Dim dblHeight As Double
Dim strTemplatePath As String
‘ 1. アプリケーションおよびドキュメントの取得
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
Set swSheet = swDraw.GetCurrentSheet()
If swSheet Is Nothing Then
MsgBox “アクティブなシートを取得できませんでした。”, vbCritical, “エラー”
Exit Sub
End If
‘ ==========================================================================
‘ 【パラメータ設定エリア】
‘ 規格化されたサイズを使う場合: swDwgPaperSizes_e 列挙体を使用
‘ 例: swDwgPaperA3Size = 2, swDwgPaperA2Size = 3
‘ ==========================================================================
lngPaperSize = swDwgPaperA2Size ‘ ここをA2に変更
‘ カスタムサイズを使用する場合(swDwgPaperSizes_e を swDwgPaperUserDefined に設定)
‘ lngPaperSize = swDwgPaperUserDefined
dblWidth = 0.594 1000 ‘ A2幅 (mm) -> メートル単位で渡す必要があるAPIもあるため注意が必要だが、
dblHeight = 0.42 1000 ‘ SolidWorks APIの単位系に依存する(基本はメートル)
‘ テンプレート(図枠)のパスを指定する場合(空欄の場合は既存フォーマットを維持/調整)
‘ 例: “C:\ProgramData\SolidWorks\SolidWorks 2023\lang\japanese\sheet format\A2画用紙.slddrt”
strTemplatePath = “”
‘ ==========================================================================
‘ 2. シートプロパティの適用(ここが核心)
‘ SetupSheet5 または SetupSheet6 を使用することで、スケールやフォーマットを安全に制御
‘ 引数: PaperSize, TemplateIn, Scale1, Scale2, FirstAngle, Width, Height
‘ ==========================================================================
‘ 既存のスケール(縮尺)を維持するために現在の値を取得
Dim curScale1 As Double, curScale2 As Double
curScale1 = swSheet.GetScale(curScale1, curScale2) ‘ 簡易取得
‘ ※正確には配列で返るため、安全にカスタムスケールを維持する処理を挟むと吉
boolstatus = swSheet.SetupSheet6( _
lngPaperSize, _
swDwgTemplateNone, _ ‘ テンプレートを自動変更しない場合はNone、変更時はパスを指定
1, curScale2, _ ‘ スケールの分子・分母
True, _ ‘ 投影図法(第一角法=True, 第三角法=False ※環境依存)
strTemplatePath, _ ‘ 図枠テンプレートファイルパス
dblWidth, _ ‘ カスタム幅 (m)
dblHeight, _ ‘ カスタム高さ (m)
True) ‘ バックグラウンドを有効にするか
If Not boolstatus Then
MsgBox “シートサイズの変更に失敗しました。”, vbCritical, “致命的エラー”
Exit Sub
End If
‘ 3. 画面の強制再描画(ビューのキャッシュ破綻を防ぐ)
swModel.GraphicsRedraw2
swModel.WindowRedraw
MsgBox “シートサイズが正常に変更されました。”, vbInformation, “完了”
End Sub
—
3. チーフアーキテクトが教える「絶対に押さえるべき3つの実装鉄則」
プロの現場でこのマクロを運用するにあたり、以下の3点は絶対に外してはならない。
① 単位系(Unit System)の罠にハマるな
SolidWorksのAPIは、基本的に内部単位として「メートル(m)」と「ラジアン」を使用している。カスタム用紙サイズ(`dblWidth`, `dblHeight`)を指定する際、ミリメートルで `594` と入力すると、ギガサイズのエラー用紙が生成されてSolidWorksがフリーズする。必ず `0.594` のようにメートル換算で渡すこと。
② 図枠(.slddrt)のパス切れ対策
`SetupSheet6` の引数にテンプレートパスを渡す際、社内共有サーバーのパスをハードコーディングするのは素人のやり方だ。
- ネットワーク負荷によるタイムアウト
- 部署異動やSolidWorksバージョンアップによるパス変更
これらを回避するため、テンプレートパスは外部の設定ファイル(INIやJSON)、あるいはExcelの管理シートから動的に読み込ませるアーキテクチャにすべきである。
③ 処理後の「再描画」を怠るな
APIでプロパティを書き換えた直後の画面は、描画キャッシュが古いままになっていることがある。そのまま保存すると、ビューが消えたように見える「ゴースト現象」が発生する。必ず `GraphicsRedraw2` と `WindowRedraw` をセットで呼び出し、グラフィックエンジンに強制同期をかけろ。
—
4. おわりに
図面サイズの動的変更は、単なるコードの貼り付けでは動かない「SolidWorks特有のクセ」が存在する領域だ。しかし、今回解説したAPIのライフサイクルと単位系、そして安全なメソッド(`SetupSheet6`)の使い所さえ押さえれば、あなたの設計業務から「手動での図枠調整」という無駄な時間は完全に消滅する。
愚直な手作業をコードで駆逐し、真に創造的な設計の時間を作り出すこと――それこそが、我々エンジニアの使命である。
