跳到主要內容
Hai 二次開發工作室

SOLIDWORKS

SOLIDWORKS 錄製的巨集,換個零件就失效?原因與改法

用 SOLIDWORKS 的「錄製巨集」把一連串操作錄下來,在原本的檔案上執行很正常, 換一個零件、換一台電腦就出錯或沒有反應?原因通常不是巨集壞了, 而是錄製的程式碼本來就只描述了「那一次」的操作。

本文目錄(7 節)

錄製器記下的是「這一次」的點選

錄製巨集時,SOLIDWORKS 會把你的每個動作轉成 VBA 程式碼。選取物件的動作, 通常會變成類似這樣的一行:

boolstatus = Part.Extension.SelectByID2("Boss-Extrude1", "BODYFEATURE", 0, 0, 0, False, 0, Nothing, 0)

SelectByID2 是依「名稱+類型」(有時再加上座標)去找物件。 錄製當下的特徵名稱、面的位置都被原封不動寫進程式,換到另一個檔案時, 名稱或位置不同,選取就會失敗,後續的步驟跟著出錯。

名稱寫死:換檔案、換語系就找不到

  • 特徵名稱:同一種特徵在不同零件的編號不同(A 零件是第 1 個伸長,B 零件是第 3 個),或已被重新命名
  • 基準面名稱:中文版錄製的是「前基準面」,同一個巨集拿到英文版 SOLIDWORKS 的範本上,名稱是 Front Plane,就找不到
  • 組合件元件:錄到的是「零件名稱-1@組合件名稱」這類完整路徑,換個組合件就不存在

數值看起來很怪:API 使用公尺與弧度

錄製出來的程式裡,常看到 0.010.025 這種數字, 這是因為 SOLIDWORKS API 內部一律使用公尺弧度, 不受文件設定的單位影響。

介面上輸入程式中的值
10 mm0.01
25 mm0.025
90°1.5707963(π/2)

直接修改巨集裡的尺寸時,忘了換算單位,結果就會差 1000 倍。

路徑與檔名寫死

錄製「另存新檔」或「開啟檔案」時,完整路徑會被寫進程式,例如C:\Users\某人\Desktop\零件1.SLDPRT。換一台電腦、換一個使用者,路徑就不存在。 輸出 PDF 的檔名也是固定的,連續執行只會一直覆蓋同一個檔案。

沒有判斷:遇到不同狀況就中斷

錄製的巨集是一條直線,不會判斷目前的狀況,常見的中斷情形:

  • 沒有開啟任何文件就執行,出現「物件變數或 With 區塊變數未設定」(執行階段錯誤 91)
  • 在工程圖上執行了只適用於零件的巨集
  • 選取失敗後沒有停下來,後面的步驟對著空的選取繼續做

有些操作錄不到

並不是所有操作都會被錄製器轉成程式碼,部分對話框或屬性管理員裡的設定不會完整出現在錄製結果中。 錄完之後建議先在另一個檔案上測試一次,確認每個步驟都有被記錄下來。

改法:把「錄製」改寫成「規則」

錄製巨集適合用來「查出某個操作要呼叫哪個 API」,要能重複使用,需要改寫成依規則判斷的程式:

  1. 先確認環境:有沒有開啟文件、文件類型對不對
  2. 用規則找物件,不用名稱:例如依特徵類型逐一尋找、依自訂屬性判斷,而不是寫死特徵名稱
  3. 路徑從文件本身推算:輸出位置以目前檔案所在的資料夾為基準,檔名由屬性組合
  4. 每一步檢查結果:選取或輸出失敗時,停止並告訴使用者原因

第一步的寫法大致如下:

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Sub main()
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

    If swModel Is Nothing Then
        MsgBox "請先開啟零件"
        Exit Sub
    End If

    If swModel.GetType <> swDocPART Then
        MsgBox "這個巨集只適用於零件"
        Exit Sub
    End If

    ' 以下依規則處理…
End Sub

功能少、只有自己用時,改寫過的巨集就很夠用;要給整個部門長期使用、需要統一安裝與更新時, 再考慮做成 Add-in。

LINE諮詢開發需求