こんにちは!いつもSolidWorksでの設計業務、本当にお疲れ様です。
マクロの「自動記録」ボタンを押してコードを生成し、「なんとなく動いたけれど、中身がよくわからない…」「応用しようとするとエラーで止まってしまう…」と悩んだ経験はありませんか?
安心してください。それはすべての優れたVBAエンジニアが必ず通ってきた道です。
今回は、「マクロ記録からの脱却」を目指すあなたに向けて、実務でそのまま使える「社内標準カラーパレット一括適用マクロ」の作成を通じて、SolidWorks APIの本質的な扱い方を優しく、そして深掘りして解説します。
ここをクリアできれば、SolidWorks VBAの基本オブジェクト操作とデータ構造の扱いはバッチリ掴めますよ!一緒にステップアップしていきましょう。
—
1. なぜ「マクロの記録」では色の変更がうまくいかないのか?
SolidWorksのGUI上で「外観」を変更し、それをマクロ記録してみたことがあるかもしれません。しかし、記録されたコードを見て絶望したことはありませんか?
‘ マクロ記録が吐き出すコードの例(複雑で解読不能…)
Dim swApp As Object
Dim Part As Object
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
‘ どこを変更しているのかさっぱり分からない長大なパラメータ…
マクロ記録は「画面のどのボタンを押したか」を機械的に記録するだけなので、「指定したRGB値(社内標準色)を計算して動的にセットする」といった知的な処理ができません。
プロの自動化エンジニアは、APIが裏で管理している「配列データ」を直接操作します。
—
2. SolidWorksの「色」を司るデータ構造:MaterialPropertyValues
SolidWorksのパーツモデルの色(外観)は、API内部では「9つの要素を持つ配列(Double型)」として保持されています。
ここが最初の重要ポイントです!
9つの要素の中身(インデックス 0 〜 8)
| インデックス | 役割 | 設定範囲 | 解説 |
| :— | :— | :— | :— |
| 0 | 赤 (R) | 0.0 〜 1.0 | ここ! 255で割った正規化値 |
| 1 | 緑 (G) | 0.0 〜 1.0 | ここ! 255で割った正規化値 |
| 2 | 青 (B) | 0.0 〜 1.0 | ここ! 255で割った正規化値 |
| 3 | 環境光 (Ambient) | 0.0 〜 1.0 | 光の当たりやすさ |
| 4 | 拡散光 (Diffuse) | 0.0 〜 1.0 | 表面の基本反射 |
| 5 | 鏡面光 (Specular) | 0.0 〜 1.0 | ハイライトの強さ |
| 6 | 光沢度 (Shininess) | 0.0 〜 1.0 | ツヤの質感 |
| 7 | 透明度 (Transparency)| 0.0 〜 1.0 | 0.0で不透明、1.0で完全透明 |
| 8 | 放射 (Emission) | 0.0 〜 1.0 | 自己発光の強さ |
⚠️ 初学者が最も陥りやすい「RGB 255の罠」
普段私たちが使うRGB値は `0 〜 255` ですよね(例: 鮮やかな赤=R:255, G:0, B:0)。
しかし、SolidWorks APIは `0.0 〜 1.0` の範囲で値を要求します。
- 誤り: `R = 255` (画面が真っ白に白飛びするかエラーになります)
- 正解: `R = 255 / 255#` (つまり `1.0`)
この「255で割って正規化する」というロジックさえ覚えておけば、もう色の設定で怖がる必要はありません!
—
3. 実務即応!社内標準カラー一括適用マクロ(完全コード)
それでは、実際に使えるVBAコードを書いていきましょう。
以下のコードをコピーして、SolidWorksのマクロ編集画面(VBAエディタ)に貼り付けてみてください。
【VBAソースコード】
Option Explicit
‘ ==============================================================================
‘ 【マクロ名】 ApplyStandardColor.swp
‘ 【概要】 社内標準のカラーパレット(RGB)をパーツのデフォルト色として一括適用する
‘ 【対応バージョン】 SolidWorks 2018以降推奨
‘ ==============================================================================
‘ 1. 社内標準カラーパレットの定義(RGB値を定数化)
Private Const COLOR_MECH_BLUE_R As Double = 41# ‘ 機械設計標準ブルー (R)
Private Const COLOR_MECH_BLUE_G As Double = 128# ‘ 機械設計標準ブルー (G)
Private Const COLOR_MECH_BLUE_B As Double = 185# ‘ 機械設計標準ブルー (B)
Sub main()
‘ — APIオブジェクトの宣言 —
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
‘ — 1. SolidWorksアプリケーションへの接続 —
Set swApp = Application.SldWorks
‘ 現在アクティブなドキュメントを取得
Set swModel = swApp.ActiveDoc
‘ — 2. 安全装置(エラーハンドリング) —
‘ ドキュメントが開かれていない場合
If swModel Is Nothing Then
MsgBox “SolidWorksでパーツモデルを開いてから実行してください。”, vbExclamation, “注意”
Exit Sub
End If
‘ 開いているファイルが「パーツ」ではない場合(アセンブリや図面では動作させない)
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイル(.sldprt)専用です。”, vbExclamation, “注意”
Exit Sub
End If
‘ — 3. メイン処理:標準カラーの適用 —
‘ モデルをPartDoc型として取得
Set swPart = swModel
‘ カラー適用サブルーチンの呼び出し
Call SetPartDefaultColor(swModel, COLOR_MECH_BLUE_R, COLOR_MECH_BLUE_G, COLOR_MECH_BLUE_B, “機械標準ブルー”)
End Sub
”’
”’
Private Sub SetPartDefaultColor( _
ByVal model As SldWorks.ModelDoc2, _
ByVal r255 As Double, _
ByVal g255 As Double, _
ByVal b255 As Double, _
ByVal colorName As String)
Dim vMatProp As Variant
‘ 現在の材質/カラープロパティ配列(9要素)を取得
vMatProp = model.MaterialPropertyValues
‘ もしプロパティが初期化されていない場合は新規で配列を作成(要素数0〜8の計9個)
If IsEmpty(vMatProp) Then
ReDim vMatProp(8) As Double
vMatProp(3) = 0.5 ‘ Ambient (環境光)
vMatProp(4) = 0.5 ‘ Diffuse (拡散光)
vMatProp(5) = 0.5 ‘ Specular (鏡面反射)
vMatProp(6) = 0.5 ‘ Shininess (光沢)
vMatProp(7) = 0.0 ‘ Transparency (透明度: 0は不透明)
vMatProp(8) = 0.0 ‘ Emission (放射)
End If
‘ — RGB値の正規化(0〜255 を 0.0〜1.0 に変換) —
vMatProp(0) = r255 / 255# ‘ R
vMatProp(1) = g255 / 255# ‘ G
vMatProp(2) = b255 / 255# ‘ B
‘ — モデルへ値を書き戻し —
model.MaterialPropertyValues = vMatProp
‘ — 画面の強制描画更新(グラフィックの再描画) —
‘ これを実行しないと画面上の色が即座に変わりません
model.GraphicsRedraw2
‘ 完了通知
MsgBox “パーツの色を「” & colorName & “」に変更しました!”, vbInformation, “完了”
End Sub
—
4. プロの視点で読み解く!コードの解説とポイント
このコードには、初心者が「プロのVBAエンジニア」へ脱皮するための大切なエッセンスが詰め込まれています。ポイントを3つに絞って解説しますね。
① ガードクローズ(エラーの未然防止)
If swModel Is Nothing Then Exit Sub
If swModel.GetType <> swDocPART Then Exit Sub
マクロを実行したとき「ファイルが開かれていなかったら?」「図面ファイルで実行されたら?」を予測し、プログラムがクラッシュする前に優しく処理を抜けるコードを入れています。これがあるだけで、社内配布した際の「マクロが動かない!」という問い合わせが激減します。
② `model.MaterialPropertyValues` への配列代入
配列を取得し、必要な箇所(0, 1, 2番目のRGB)だけを書き換えて、最後に `model.MaterialPropertyValues = vMatProp` と戻しています。
SolidWorks APIでは、「プロパティを一括で配列として受け取り、書き換えて一括で戻す」というパターンが非常によく使われます。
③ 画面の描画更新 `model.GraphicsRedraw2`
データを変更しても、3D画面を描画し直さなければ色の変化が目に見えません。`GraphicsRedraw2` を呼び出すことで、GPUに「画面を塗り替えて!」と命令を出しています。
—
5. 応用編:部署ごとのカラーパレットに拡張してみよう!
このマクロの素晴らしいところは、拡張がとても簡単な点です。
例えば、`main` 関数の中身を少し書き換えて、メッセージボックスで部署を選べるようにしてみましょう。
‘ 部署選択の拡張例
Dim selectDept As VbMsgBoxResult
selectDept = MsgBox(“適用する色を選んでください。” & vbCrLf & _
“【はい】: 設計部(ブルー)” & vbCrLf & _
“【いいえ】: 安全管理(イエロー)”, vbYesNoCancel + vbQuestion, “カラー選択”)
If selectDept = vbYes Then
‘ 設計部カラー(R:41, G:128, B:185)
Call SetPartDefaultColor(swModel, 41, 128, 185, “設計部標準ブルー”)
ElseIf selectDept = vbNo Then
‘ 安全管理カラー(R:241, G:196, B:15)
Call SetPartDefaultColor(swModel, 241, 196, 15, “安全管理イエロー”)
End If
このようにサブルーチン(`SetPartDefaultColor`)として処理を分けておけば、後から何度でも使い回すことができますね!
—
まとめ:SolidWorks VBA掌握への第一歩
お疲れ様でした!今回のポイントを振り返りましょう。
1. SolidWorksの色情報は「9つの要素を持つ配列」で管理されている
2. RGB値は `255` で割って `0.0 〜 1.0` に正規化して渡す
3. 色変更後は `GraphicsRedraw2` で画面を更新する
マクロ記録のコードは複雑で読みづらいですが、APIの構造を直接理解して書いたコードはとてもシンプルで美しく、そして高速に動作します。
「ここをクリアできれば、SolidWorks VBAの基本はバッチリですよ!」
ぜひご自身の環境で動かしてみて、色の数値を変えたり、会社のテーマカラーを設定したりして遊んでみてください。その小さな成功体験の積み重ねが、あなたを社内で頼られる最高の自動化エンジニアへと導いてくれます。
次回はさらに一歩進んで、「フィーチャ(押し出しやカット)ごとに色を塗り分ける高度なテクニック」をご紹介する予定です。お楽しみに!
