こんにちは!SolidWorks自動化の世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺めて、「なんだかよく分からないけれど動くからいいか…」と諦めていませんか?
図面の作成業務において、設計変更に伴う「用紙サイズ変更(例:A3からA2へ)」は日常茶飯事です。しかし、これを手動で行うのは面倒ですし、適当にサイズを変えると図枠が崩れたり、ビューが意図しない位置に吹っ飛んだりしてストレスが溜まりますよね。
今回は、初心者の方が「マクロの記録」の呪縛から抜け出し、SolidWorks VBAで安全かつ確実にシートサイズを変更し、カスタム用紙サイズにも対応するための極意を優しく、そして本質的に解説していきます。
ここをクリアすれば、あなたのVBAスキルは確実にワンランク上のステージへ到達しますよ。それでは、一緒に見ていきましょう!
—
1. なぜ「マクロの記録」だけではシートサイズ変更がうまくいかないのか?
SolidWorksでシートサイズを変更する際、「マクロの記録」を使うと、次のようなコードが出力されます。
‘ ※これはマクロの記録から生成される典型的な「あまり良くない」コードのイメージです
boolstatus = Part.SetIDmso(“DrawingSheetProperties”)
これ、実はブラックボックスの塊です。裏側で何が起きているのか全く見えず、別の図面や異なるシートフォーマットの図面に適用した途端にエラーで止まってしまいます。
なぜなら、SolidWorksの図面(DrawingDoc)とシート(Sheet)は、それぞれ独立したオブジェクト階層を持っており、「どのシートの、どのプロパティを書き換えるのか」をコードで明示的に指定してあげる必要があるからです。
—
2. SolidWorks VBAの核心:DrawingDoc と Sheet オブジェクト
SolidWorksの図面自動化をマスターするための第一歩は、APIの階層構造を理解することです。
1. SldWorks.ModelDoc2 (ドキュメント全体の基本機能)
2. SldWorks.DrawingDoc (図面特有の機能。シートの管理など)
3. SldWorks.Sheet (個々のシート。用紙サイズ、図枠、スケールを持つ)
シートサイズを変更するということは、最下層にある `Sheet` オブジェクトのプロパティを書き換える作業に他なりません。この構造を頭に叩き込んでおくだけで、エラーに怯えることはなくなります。
—
3. 【実践】安全にシートサイズを変更するVBAコード
それでは、実務でそのまま使える、堅牢(ロバスト)なコードを見てみましょう。
このコードでは、現在アクティブな図面のシートサイズを「A3縦(あるいは指定のサイズ)」に変更し、カスタム用紙サイズにも対応できるように設計しています。
Sub ChangeSheetSize_Sample()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim sheetName As String
Dim paperSize As Long
Dim templateName As String
Dim width As Double
Dim height As Double
Dim status As Boolean
‘ 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
‘ 2. 現在アクティブなシートのオブジェクトを取得
Set swSheet = swDraw.GetCurrentSheet()
sheetName = swSheet.GetName()
‘ 【重要】既存のシートプロパティ(スケール等)を保持するため、現在の設定を一度取得する
‘ swSheet.GetPropertiesの戻り値配列:
‘ 0: テンプレート, 1: 用紙サイズ, 2: 規格, 3: スケール分子, 4: スケール分母, 5: 単位, 6: 幅, 7: 高さ
Dim props As Variant
props = swSheet.GetProperties()
Dim scaleNum As Double, scaleDenom As Double
scaleNum = props(3)
scaleDenom = props(4)
‘ —————————————————-
‘ 3. 用紙サイズの設定(規格サイズの場合)
‘ swDwgPaperSizes_e 列挙体を使用します
‘ 例: swDwgPaperA3 = 2 (A3サイズ)
‘ —————————————————-
paperSize = swDwgPaperA3 ‘ ここを用途に合わせて変更してください
‘ 標準規格サイズを指定する場合、幅と高さは通常 0 を渡します(SolidWorksが自動計算)
width = 0#
height = 0#
templateName = “” ‘ テンプレートを変更しない場合は空文字、またはパスを指定
‘ 4. シートプロパティの適用(ここが核心!)
‘ SetupSheet5 メソッドを使用することで、カスタム用紙サイズや詳細設定を安全に行えます
‘ 引数: Name, PaperSize, TemplateIn, Scale1, Scale2, ShowCustomDWG, TemplateFileName, Width, Height, DataSource
status = swDraw.SetupSheet5( _
sheetName, _
paperSize, _
swDwgTemplateNone, _ ‘ テンプレートを維持・変更する設定
scaleNum, _
scaleDenom, _
True, _ ‘ カスタムプロパティを表示するか
templateName, _
width, _
height, _
True ‘ ユーザー定義のプロパティを許可
)
If status Then
‘ 画面を最新の状態に強制更新
swModel.WindowRedraw
MsgBox “シート [” & sheetName & “] のサイズ変更が完了しました!”, vbInformation, “成功”
Else
MsgBox “シートサイズの変更に失敗しました。”, vbCritical, “エラー”
End If
End Sub
—
4. 知っておくべき「カスタム用紙サイズ」の罠と攻略法
JIS規格や社内独自の特殊な図面枠を使っていて、「標準のA3やA4じゃなくて、微妙に寸法が違うカスタム用紙サイズにしたい!」という現場は非常に多いです。
その場合、上記のコードの `paperSize` に `swDwgPaperUserDefined`(ユーザー定義 = 12など) を指定し、`width`(幅)と `height`(高さ)にミリ単位(メートル法なので「メートル」単位に換算する必要がある点に注意!」)の値を渡す必要があります。
> ⚠️ 開発者への極意:SolidWorks APIの単位系
> SolidWorks APIの内部処理は、基本的にすべて「メートル(m)」で計算されています。
> もし「幅 420mm、高さ 297mm(A3サイズ)」のカスタム用紙を指定したい場合は、コード上で次のように換算しなければなりません。
> `width = 0.42` (420mm)
> `height = 0.297` (297mm)
> ミリのまま `420` を渡すと、地球儀のように巨大な用紙サイズになってしまい、SolidWorksがフリーズするかエラーを起こします。ここ、絶対にテストしてくださいね!
—
5. 初心者がハマりがちなエラーと回避のチェックリスト
1. 「オブジェクト変数または With ブロック変数が見つかりません」エラー
- 原因: 図面以外のファイル(部品やアセンブリ)を開いた状態でマクロを実行しています。
- 対策: サンプルコードのように `swModel.GetType() <> swDocDRAWING` で型チェックを必ず挟みましょう。
2. 図枠やビューが変な位置にズレる
- 原因: `SetupSheet5` を実行する際に、既存のスケール(分子・分母)を継承させずデフォルト値で上書きしてしまっているためです。
- 対策: `swSheet.GetProperties()` から現在のスケール値を事前に抽出し、そのまま再設定時に引き渡すのがプロの技です。
—
おわりに
いかがでしたでしょうか?
今回は、図面シートのサイズ変更とカスタム用紙サイズ対応について、SolidWorks VBAの本質的なオブジェクト操作を交えて解説しました。
「マクロの記録」の殻を破り、APIの階層構造と引数の意味を理解できるようになると、SolidWorks自動化の世界は一気に自由で楽しいものに変わります。
ここをクリアしたあなたなら、もう立派な自動化エンジニアの第一歩を踏み出しています。ぜひ、日々の業務効率化にこのコードを活用してみてくださいね。それでは、次回の高度な自動化テクニックでお会いしましょう!
