こんにちは!SolidWorks VBAの世界へようこそ。
日々、設計業務の効率化のためにマクロと格闘していることと思います。「マクロの記録」から一歩抜け出して、実際の現場で使える自動化ツールを作り始めると、避けて通れない大きな壁にぶつかりますよね。
そう、「複数ユーザーによるファイル競合(排他制御)」です。
共有サーバーやSOLIDWORKS PDMの環境下で、自分がVBAでアセンブリをいじろうとしたまさにその瞬間、他の設計者が同じファイルを開いていたら……?
最悪の場合、データが破損したり、知らぬ間に上書きされて大惨事になったりします。
今回は、プロの現場で必ず実装されている「ファイルの読取専用(Read-Only)の自動判定と安全な排他制御」について、魂を込めて解説します。ここをクリアすれば、あなたのVBAスクリプトは一気に「実用レベルの堅牢性」を手に入れますよ。一緒にマスターしていきましょう!
—
なぜ「ファイルロック回避」がプロの必須スキルなのか?
初学者がやりがちなコードは、次のようなものです。
‘ 【危険なアンチパターン】
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
‘ いきなりファイルを開きにいくだけ
Dim swModel As SldWorks.ModelDoc2
Dim longstatus As Long
Set swModel = swApp.OpenDoc6(“C:\Shared\Assembly.sldasm”, swDocASSEMBLY, swOpenDocOptions_Silent, “”, longstatus, longstatus)
このコードの何が問題か分かりますか?
もし誰かがこの `Assembly.sldasm` を排他ロック(編集中)していた場合、SOLIDWORKSは問答無用で「読取専用」として開くか、エラーを吐きます。さらに、VBA側でそれが「本当に自分が編集可能な状態(書き込み権限あり)で開けたのか」を判定していないため、知らずにプログラムが勝手にファイルを上書き保存してしまい、他人の変更を吹き飛ばすという悪夢を引き起こすのです。
これを防ぐためには、「開く前にファイルのステータスを察知し、ダメなら安全に処理を中断・回避する」という大人の振る舞いがVBAにも求められます。
—
現場で使える!安全な排他制御の全体像
SOLIDWORKS APIには、ドキュメントを開く前にファイルの属性やロック状態をチェックする機能、そして開いた後に「本当に書き込み可能(Writeable)か」を判定する強力なプロパティが用意されています。
今回は、以下のステップで安全な排他制御を実装します。
1. ファイルの存在確認とネットワーク上のアクセス可能性チェック
2. `OpenDoc6` による適切なオプション指定でのオープン
3. `IsWriteable` プロパティによる編集権限の厳密な判定
4. 読取専用だった場合の安全な離脱(クローズ処理)
—
実装コード:堅牢なアセンブリ・オープン関数
それでは、そのまま実務のテンプレートとして使えるVBAコードを公開します。
先輩エンジニアからの丁寧なコメントを隅々まで読んで、動きのイメージを掴んでください。
Option Explicit
‘ メイン処理:安全にアセンブリを開くプロシージャ
Sub SafeOpenAssemblyDemo()
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
Dim targetPath As String
targetPath = “D:\SharedDesign\MasterAssembly.sldasm” ‘ ※環境に合わせて変更してください
‘ 1. ファイルが存在するかチェック
If Dir(targetPath) = “” Then
MsgBox “指定されたファイルが存在しません。” & vbCrLf & targetPath, vbCritical, “ファイルなし”
Exit Sub
End If
‘ 2. 安全にファイルを開く(関数を呼び出し)
Dim swModel As SldWorks.ModelDoc2
Set swModel = OpenAssemblySafely(swApp, targetPath)
If swModel Is Nothing Then
‘ 処理中断
Exit Sub
End If
‘ — ここから先は安全に編集権限が確保された状態での処理 —
MsgBox “ファイルを開き、書き込み権限の取得に成功しました!自動処理を続行します。”, vbInformation, “成功”
‘ 例:ここに合致(Mate)の追加や部品配置のコードが入る
‘ 処理終了後の保存クローズなど
‘ swModel.Save3 …
End Sub
‘ ==============================================================================
‘ 職人技:ファイルロックを検知し、安全にモデルオブジェクトを返す関数
‘ ==============================================================================
Function OpenAssemblySafely(ByVal swApp As SldWorks.SldWorks, ByVal filePath As String) As SldWorks.ModelDoc2
Dim swModel As SldWorks.ModelDoc2
Dim fileError As Long
Dim fileWarning As Long
‘ 既にメモリー上に開かれているかチェック
Set swModel = swApp.GetOpenDocumentByName(filePath)
If Not swModel Is Nothing Then
‘ すでに開かれている場合、現在のセッションでの書き込み権限をチェック
GoSub CheckWriteability
Set OpenAssemblySafely = swModel
Exit Function
End If
‘ 【重要】OpenDoc6メソッドを使用
‘ swOpenDocOptions_Silent を指定することで、余計なポップアップダイアログを出さずにコード側で制御する
Dim openOptions As Long
openOptions = swOpenDocOptions_Silent + swOpenDocOptions_LoadModel
Set swModel = swApp.OpenDoc6(filePath, swDocASSEMBLY, openOptions, “”, fileError, fileWarning)
If swModel Is Nothing Then
MsgBox “ファイルのオープンに失敗しました。エラーコード: ” & fileError, vbCritical, “オープン失敗”
Set OpenAssemblySafely = Nothing
Exit Function
End If
‘ 書き込み権限の判定へ飛ぶ
GoSub CheckWriteability
Set OpenAssemblySafely = swModel
Exit Function
CheckWriteability:
‘ ————————————————————————–
‘ 決定打:IsWriteable プロパティ
‘ 他のユーザーが掴んでいる、あるいはPDMの権限がない等の理由で
‘ 「読取専用(Read-Only)」として開かれていないかを厳密にチェックします。
‘ ————————————————————————–
If Not swModel.IsWriteable Then
MsgBox “【警告】このアセンブリは現在、他のユーザーが編集中(または読取専用)です。” & vbCrLf & _
“データ破損を防ぐため、マクロの実行を中断します。”, vbExclamation, “排他制御ロック発動”
‘ 変更を加えずにファイルを閉じる(変更破棄: False)
swApp.CloseDoc swModel.GetTitle
Set swModel = Nothing
End If
Return
End Function
—
コードのポイントと「プロの知見」
1. `swOpenDocOptions_Silent` の重要性
バックグラウンドや自動バッチ処理でVBAを走らせる際、ファイルがロックされていたり警告が出たりすると、SOLIDWORKSは画面上にモーダルダイアログ(「誰かが開いています。読取専用で開きますか?」など)を表示して処理をストップさせてしまいます。
これが起きると、夜間の自動処理やタスクが永遠にフリーズします。`Silent` オプションを使い、ダイアログを出させずにコード側でハンドリングするのがプロの鉄則です。
2. `IsWriteable` プロパティの確実性
ファイルを開いた「後」に、`swModel.IsWriteable` を叩くことで、そのドキュメントが完全な書き込み権限を持っているかを真偽値(Boolean)で取得できます。
もし `False` であれば、即座に `swApp.CloseDoc` でファイルを閉じ、ユーザーに警告を飛ばして安全に処理を打ち切ります。これにより、意図しない上書き事故を100%防ぐことができます。
—
ここをクリアすれば、SolidWorks VBAの基本はバッチリ!
お疲れ様でした!
今回紹介した「ファイルの排他制御と例外ハンドリング」は、単なる小手先のテクニックではなく、実務でシステムを安定稼働させるための最重要アーキテクチャです。
「動けばいいや」で作ったマクロは、いつか必ず現場でファイルを破壊し、信頼を失います。しかし、今回のような堅牢なガードを組み込んでおけば、同僚や上司から「お、分かってるね!」と一目置かれるエンジニアになれること間違いなしです。
ここをクリアしたあなたなら、次は複数アセンブリのバッチ処理や、PDM APIとの連携といった、さらなる高みへ挑戦する資格が十分にあります。
明日からの設計自動化ライフを、より安全でスマートなものにしていきましょう。それでは、また次の極限知見でお会いしましょう!
