【入門編】【レガシー保守】古いSolidWorks 2010時代の古いVBAマクロを最新のSolidWorks 2024環境へ完全移行する手順 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!チーフアーキテクトの私です。
今日は、多くの現場で悲鳴が上がっている「レガシーマクロの現代化」について、魂を込めてお話ししますね。

皆さんの会社や現場には、「SolidWorks 2010時代に作られ、誰も中身を触れないまま動いている伝説のVBAマクロ」はありませんか?「動くには動くけれど、今の2024環境だと時々フリーズする」「新しいPCに変えたらエラーが出るようになった」――そんな悩みを抱えていませんか?

マクロの記録から一歩抜け出し、長年生き残る堅牢なコードを書くためには、「APIの進化の歴史」を知る必要があります。
今回は、古いレガシーコードを最新のSolidWorks 2024環境へと蘇らせ、未来永劫メンテナンスできるようにするための「完全移行の極意」を一緒に紐解いていきましょう。ここをクリアすれば、あなたのVBAスキルは間違いなくプロの領域に到達しますよ!

1. なぜ古いマクロは最新のSolidWorksで動かなくなるのか?

SolidWorksは毎年進化を続けています。それに伴い、内部を支えるCOM APIも新陳代謝を繰り返しています。
2010年から2024年の間に何が起きたか? 一言で言えば、「曖昧な型や、古いメモリ管理に依存した実装の廃止(Obsolete)」です。

特に以下の3点が、レガシーコードが現代の環境でクラッシュする主な原因です。

1. バリアント型(Variant)や暗黙の型変換への依存
昔のコードは `Dim swApp As Object` のように、何でも `Object` 型で受けていました。これが最新の.NETベースの内部アーキテクチャと衝突し、予期せぬ型ミスマッチを引き起こします。
2. 廃止されたメソッド(Obsolete Methods)の存在
引数の仕様が変わったにもかかわらず、古いインターフェースを呼び出し続けているケースです。
3. エラーハンドリングの欠如
フィーチャの生成失敗や、ドキュメントのポインタ取得失敗(Nothing判定)を無視して処理を続行するため、突然の強制終了(Fatal Error)につながります。

それでは、実際のレガシーコードを題材に、現代の作法へリファクタリングしていきましょう。

2. 実践:レガシーコードの「ビフォー・アフター」

ここに、2010年当時に書かれた「怪しいパーツ作成マクロ」があります。これをSolidWorks 2024完全対応の型安全なコードに生まれ変わらせます。

【Before】レガシーな破綻コード(2010年スタイル)

‘ ⚠️絶対に真似してはいけない古いコードの例
Sub CreateBox_Legacy()
Dim swApp As Object
Dim swPart As Object
Set swApp = CreateObject(“SldWorks.Application”)
Set swPart = swApp.ActiveDoc

‘ 突然のマジックナンバーと曖昧なメソッド
swPart.SketchManager.InsertSketch True
swPart.CreateCenterRectangle 0, 0, 0, 0.1, 0.05, 0
swPart.FeatureManager.FeatureExtrusion2 True, 0, 0, 0, 0, 0.02, 0, False, False, False, False, 0, 0, False, False, False, False, 1, 1, 1, 0, 0, False

MsgBox “完了!”
End Sub

【ここがダメ!】

  • `CreateObject` で無理やり起動している(SolidWorksがすでに起動している場合、二重起動やポインタ迷子の原因になります)。
  • `swApp.ActiveDoc` をそのまま `Object` で受けているため、現在開いているのが図面やアセンブリだった場合に大爆発します。
  • 呪文のような長大な引数を持つ `FeatureExtrusion2` は、仕様変更に非常に弱いです。

【After】2024年対応!モダンで堅牢なプロ仕様コード

こちらが、私たちが目指すべき型安全(Type-Safe)な最新コードです。

‘ ==============================================================================
‘ @Title : Modern Part Creator for SolidWorks 2024
‘ @Description : 型安全とエラーハンドリングを徹底したモダンVBAテンプレート
‘ ==============================================================================
Option Explicit

Sub CreateBox_Modern()
‘ 1. 明示的な型宣言(Early Bindingに近い安全性確保)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swSketchMgr As SldWorks.SketchManager
Dim boolstatus As Boolean
Dim longstatus As Long

‘ 2. 実行中のSolidWorksインスタンスを安全に取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的なエラー”
Exit Sub
End If

‘ 3. アクティブドキュメントの取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。パーツを開いてから実行してください。”, vbExclamation, “警告”
Exit Sub
End If

‘ 4. ドキュメントタイプの検証(パーツ環境以外では弾く)
If swModel.GetType <> swDocPART Then
MsgBox “このマクロは「パーツ(Part)ファイル」でのみ実行可能です。”, vbExclamation, “形式エラー”
Exit Sub
End If

‘ 5. マネージャーの取得
Set swSketchMgr = swModel.SketchManager
Set swFeatMgr = swModel.FeatureManager

‘ 6. スケッチ作成(エラーチェックを伴う実装)
swModel.ClearSelection2 True
boolstatus = swSketchMgr.InsertSketch(True)

‘ 中心矩形の描画(APIの仕様変更に強い最新メソッドを使用)
‘ ※環境に合わせて適切なスケッチ平面が選択されている前提
boolstatus = swSketchMgr.CreateCenterRectangle(0, 0, 0, 0.1, 0.05, 0)

‘ スケッチを閉じる
swSketchMgr.InsertSketch True

‘ 7. フィーチャ生成(最新の FeatureExtrusion3 または適切なAPIを使用)
‘ 押し出し:盲穴、深さ 20mm (0.02m)
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatMgr.FeatureExtrusion3( _
ThinFeature:=False, _
ReverseDir:=False, _
BothEnd:=False, _
EndCond:=swEndCondBlind, _
EndCondBack:=swEndCondBlind, _
Depth:=0.02, _
DepthBack:=0, _
DraftOutward:=False, _
DraftOutwardBack:=False, _
DraftAngle:=0, _
DraftAngleBack:=0, _
StartCondition:=0, _
Offset:=0, _
Flip:=False, _
Autoselect:=True, _
AssemblyScope:=True, _
ImportedCut:=False, _
CacheGraphics:=False _
)

‘ 8. 最終結果の検証
If swFeat Is Nothing Then
MsgBox “フィーチャの生成に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If

‘ 画面を最新の状態に更新
swModel.ViewZoomtofit2

MsgBox “SolidWorks 2024環境でのパーツ生成が正常に完了しました!”, vbInformation, “成功”
End Sub

3. コードのポイントと「知見」の解説

ここからは、なぜこの書き方が「プロ仕様」なのか、重要なポイントを噛み砕いて解説します。

① `Application.SldWorks` の活用

レガシーコードによくある `CreateObject(“SldWorks.Application”)` は、すでに立ち上がっているSolidWorksとは別のプロセスを勝手に立ち上げようとして競合を起こす原因になります。
マクロを実行している本人のSolidWorksを確実に捉えるために、常に `Application.SldWorks` を使いましょう。

② `swModel.GetType` による型チェック

「パーツファイルを開いているついでにアセンブリ用のマクロを押してしまった」というミスは現場で本当によくあります。
ここで `swDocPART`(定数=1)を厳密にチェックすることで、予期せぬ型変換エラーを未然に防ぐことができます。

③ 引数付きメソッドの「名前付き引数(:=)」の活用

SolidWorksのAPI、特に `FeatureExtrusion3` のような複雑なフィーチャ生成メソッドは、引数が数十個に及びます。
これをカンマ(`,`)だけで繋いでいくと、「どの引数が何を意味しているのか」が後から全く分からなくなります。
VB.NETやモダンVBAのように `ThinFeature:=False` のように名前を指定して渡すことで、保守性が劇的に向上し、将来のバージョンアップ時にも迷わなくなります。

4. 陥りやすいエラーとトラブルシューティング

最後に、レガシー移行の際によくぶつかる壁と、その対処法を授けておきます。

  • Q: 「コンパイルエラー: ユーザー定義型が定義されていません」と言われます。
  • A: VBAの編集画面(IDE)で、メニューの `[ツール]` > `[参照設定]` を確認してください。SolidWorksのタイプライブラリ(`SldWorks 202X Type Library` など)のチェックが外れているか、古いバージョンのまま残っています。一度チェックを外し、現在の2024環境のライブラリにチェックを入れ直してください。
  • Q: 処理が途中でフリーズしたようになります。
  • A: モデリングの処理中に画面描画が追いついていない可能性があります。処理の最初に `swApp.CommandInProgress = True` を入れ、最後に `False` に戻す、あるいは画面更新を抑制する `swModel.EditRebuild3` などの作法を挟むと改善します。

まとめ

いかがでしたでしょうか?
古いレガシーマクロの移行は一見面倒に思えますが、「明示的な型宣言」「インスタンスの安全な取得」「名前付き引数によるコードの可読性向上」という基本さえ押さえれば、驚くほど安定した最新マクロに生まれ変わらせることができます。

ここをクリアすれば、SolidWorks VBAの基本だけでなく、APIをコントロールする本質的なエンジニアリング力が身につきますよ。あなたの自動化ライフがより快適になることを、心から応援しています!

タイトルとURLをコピーしました