资讯动态

SolidWorks二次开发入门:从录制宏到装配自动化的VBA实践

发布时间:2026/10/6 18:10:18 来源:尧图企业网站定制
简介一份面向SolidWorks二次开发初学者的系列教程内容围绕宏录制、VBA编辑、API调用三大核心展开适合具备基础建模能力、希望将重复设计流程自动化的工程师阅读学习。教程以doc文档形式整理共1个文件压缩包仅276KB篇幅紧凑但覆盖完整。已有六千余人学习下载实用价值得到验证。文档从录制第一个宏讲起逐步演示如何回放和修改录制代码清理自动生成但未使用的变量声明删除旋转视角等无关注视图语句甄别再选择与清除操作使代码简洁可靠。随后进入VBA编辑与调试环节介绍如何打开宏、调出最近九个编辑记录、以及旧版文件自动转换的处理方式让新手避开常见陷阱。进阶部分则重点剖析特征选取与对象获取的两个接口结合示例程序展示按名称选取和按索引获取两种操作方法帮助读者理解程序如何与模型交互并最终建立起二次开发的完整思维框架为后续编写插件或集成设计工具打下基础。1. 先说清这套 SolidWorks 二次开发教程从录宏到装配自动化的一条完整链路接触 SolidWorks 二次开发的人十有八九是从录制宏开始的——打开宏录制在模型上点几下停止满怀期待地运行。结果要么直接报错要么视图一顿乱转动作全不对。这套教程的起点恰好选在这里它不教你背 API 文档而是顺着“录一个宏 → 清理代码 → 学会选择对象 → 读取特征数据 → 修改特征 → 在装配体里插入零件并添加配合”这条链路走一遍每一步都给了能跑的 VBA 代码。它解决的核心问题很具体当你需要把重复设计动作变成自动化脚本时怎么从零写出一个不翻车的宏。适合做标准件库、批量改模型、装配体自动化的工程师。2. 录制宏不等于能跑VBA 里先删掉这三类“垃圾代码”2.1 录制宏之前的两个开关自动打开 VBA 与宏格式转换正式开始写代码之前先把 SolidWorks 的宏环境设置好。点击菜单栏的 Tools → Options → System Options在 General 选项卡里找到Automatically edit macro after recording。这个选项勾上之后每次录完宏SolidWorks 会自动打开 VBA 编辑器让你立刻看到刚才的操作生成了什么代码。如果你打算长期做二次开发这个开关一定要开否则录完还要手动去 Tools → Macro → Edit 里找到那个文件多一步操作而且容易找不到文件位置。宏文件有两种后缀.swp和.swb。.swb是旧版 SolidWorks 的宏格式当你用编辑功能打开一个.swb文件时SolidWorks 会自动把它转换成.swp并保存。如果你从同事或者旧项目里拿到一批.swb的宏不必手动转格式直接编辑一次它自己就变成.swp了。.swp本质上是 OLE 复合文档里面承载的就是 VBA 工程代码所以编辑宏的入口始终是 Tools → Macro → Edit。2.2 录出来的代码里哪些是必须删掉的录完一个宏打开 VBA 编辑器你会看到 SolidWorks 自动生成了变量声明加上一长串操作代码。这些代码里混杂着大量录制痕迹必须清理。第一类是没用的变量声明。录制器会自动声明这些对象但你的具体操作根本用不到留着不影响运行但会干扰你读代码Dim swApp As Object Dim Part As Object Dim boolstatus As Boolean Dim longstatus As Long, longwarnings As Long Dim FeatureData As Object Dim Feature As Object Dim Component As ObjectswApp和Part一般会用到但FeatureData、Component、longstatus、longwarnings这些通常用不上。原则是声明了的变量如果还没用到先删掉等后面真要用了再补回来。这样代码一开始就是干净的不会出现“这个变量到底是干嘛的”这种困惑。第二类是切换视图的代码。录制时只要旋转过模型就会生成像Part.ActiveView().RotateAboutCenter 0.0662574, 0.0346621这样的句子。这类代码毫无业务意义纯属视角残留直接删。我一般用查找功能搜RotateAboutCenter搜到就删一个不留。第三类是成对出现的选择/取消选择调用。录制时你每点一次对象VBA 里就会多一组SelectByID2和ClearSelection2经常是成对连续出现。清理时要遵循三条规则紧跟在ClearSelection2之前的SelectByID2删除紧跟在ClearSelection2之后的SelectByID2保留紧跟在SelectByID2之前的ClearSelection2删除。这组规则看起来绕实际逻辑不复杂录制产生的选择痕迹大多是为了完成“点选”这个动作本身而不是你的业务意图。真正有意义的保留那一次SelectByID2其余成对冗余的取消选择、重新选择全部删掉。如果后面还要继续选中别的对象再在合适的位置保留一次ClearSelection2清空状态。2.3 编辑宏的入口从模板宏切到真实场景清理完代码宏的骨架才勉强能跑。编辑宏的入口有两个一是 Macro 工具栏上的 Edit Macro 按钮二是 Tools → Macro → Edit 菜单项。编辑对话框里选择.swp文件后点击 Open就进入 VBA 编辑器。如果你近期编辑过某个宏Tools → Macro 菜单下面会直接列出最近 9 个宏文件点一下就能打开省去在文件对话框里翻路径的时间。这里有一个真实场景要注意VBA 编辑器打开后你会看到Sub main()这个入口函数。SolidWorks 录制宏默认生成的入口就是main你写的代码都放在这个 Sub 里面。这个约定在整套教程里一直延续后面出现的所有示例代码入口都是main或者自定义的 Sub 名称运行方式一致。3. 选中对象才能干活SelectByID2 与 GetSelectedObject5 的配合3.1 SelectByID2七个参数里真正要紧的是前六个在 SolidWorks 二次开发里90% 的操作第一步都是“选中一个对象”。官方提供了两个最常用的 APISelectByID2负责按名称选中对象GetSelectedObject5负责把选中的对象从选择集里取出来。这两个函数一个负责“指”一个负责“拿”配合使用基本能覆盖特征选择、面选择、装配体组件选择这些高频场景。先看SelectByID2的函数签名retval ModelDocExtension.SelectByID2(Name, Type, X, Y, Z, Append, Mark, Callout, SelectOption)参数含义Name要选择的对象名称如“拉伸 1”或空字符串Type对象类型大写字符串如BODYFEATURE或空字符串X, Y, Z选择位置的坐标一般传 0Append是否追加选择True 表示追加到当前选择集Mark标记值供需要有序选择的函数使用一般传 0Callout关联的标注对象一般传 NothingSelectOption选择选项swSelectOptionDefault可用 0 代替注意 Type 参数必须是大写比如特征类型写成BODYFEATURE面类型写成FACE。如果记不住类型字符串可以传空字符串但传了空字符串后 SolidWorks 会按名称模糊匹配可靠性下降。我的习惯是特征一定写BODYFEATURE面一定写FACE从来没出过问题。3.2 GetSelectedObject5从选择集里按索引取对象SelectByID2选完了对象进入选择集。要从选择集里把对象取出来用SelectionMgr.GetSelectedObject5retval SelectionMgr.GetSelectedObject5(AtIndex)AtIndex是对象在当前选择列表里的索引从 1 开始最大值是SelectionMgr.GetSelectedObjectCount。返回的是 Dispatch 对象指针需要Set到具体类型变量上。官方 API 里还有 GetSelectedObject2、GetSelectedObject3、GetSelectedObject4 等不同版本数字越大通常支持的返回类型越全教程里用的 5 是当前 SolidWorks 版本里常用的一档。如果返回 Nothing说明这个索引位置没有对象或者类型不支持。3.3 选“拉伸 1”并打印特征名一个能跑的完整宏把两个 API 串起来假设当前模型里有一个叫“拉伸 1”的特征下面的宏先选中它再从选择集里取出来打印特征名称Option Explicit Dim swApp As SldWorks.SldWorks Dim Model As ModelDoc2 Dim feat As Feature Dim boolstatus As Boolean Sub main() Set swApp Application.SldWorks Set Model swApp.ActiveDoc 通过名称选择拉伸 1特征 boolstatus Model.Extension.SelectByID2(拉伸 1, BODYFEATURE, 0, 0, 0, False, 0, Nothing, 0) If boolstatus True Then 从选择集里取第一个对象 Dim SelMgr As SelectionMgr Set SelMgr Model.SelectionManager Set feat SelMgr.GetSelectedObject5(1) Debug.Print feat.Name Else Debug.Print Error End If End Sub代码逻辑说明先通过Model.Extension.SelectByID2选中“拉伸 1”返回 True 代表选中成功。然后拿到Model.SelectionManager这个选择管理器对象调用GetSelectedObject5(1)把选择集里的第一个对象取出来。这里的索引 1 表示“当前选中列表里的第一项”因为刚才是一次单选所以索引一定是 1。最后用Debug.Print在 VBA 的立即窗口里输出特征名。需要注意两点。第一SelectByID2最后一个参数SelectOption作者写的是swSelectOptionDefault在Option Explicit模式下可以直接用 0 代替效果完全一样而且不用管常量定义。第二选择完成后如果后面还有别的选择操作要及时ClearSelection2避免选择集越积越多这个习惯在配合操作里尤其重要。4. 读数据和改数据从 GetDefinition 到 ModifyDefinition 再到装配体配合4.1 访问特征数据的四步固定流程能选中特征只是第一步真正干活是读取和修改特征的数据。SolidWorks 的 API 访问特征数据有一套固定流程四个步骤缺一不可定义一个特征对象变量通过GetSelectedObject5或SelectByID2拿到特征对象调用feature.GetDefinition获取特征的定义对象调用FeatData.AccessSelections(Model, Component)获得数据访问权限。AccessSelections这个函数很关键它返回布尔值True 表示可以安全地读写特征参数了。用完还要调用ReleaseSelectionAccess释放访问权否则特征会一直处于被占用的状态后面再修改同一个特征时可能报错。这里补一句在 SolidWorks API 里特征对象本身和特征的数据对象是分开的。特征对象是你在特征树里看到的那一项数据对象才是里面存着的具体参数比如拉伸深度、孔直径。理解不了这个区别后面很容易搞混调 API 时经常找不到属性。4.2 读取简单直孔的深度与直径下面这段程序演示怎么读取一个简单直孔特征的深度和直径。运行前先在模型里手动选中一个简单直孔特征然后再运行宏Option Explicit Dim swApp As SldWorks.SldWorks Dim Model As ModelDoc2 Dim curfeature As Feature Dim boolstatus As Boolean Dim featdata As SimpleHoleFeatureData2 Dim component As Component2 Dim dep As Double Dim dia As Double Dim SelMgr As SelectionMgr Dim ncount As Integer Sub getselected() Set swApp Application.SldWorks Set Model swApp.ActiveDoc Set SelMgr Model.SelectionManager Set curfeature SelMgr.GetSelectedObject5(1) 得到当前选中的第一个特征 MsgBox curfeature.Name Set featdata curfeature.GetDefinition 得到特征的定义 boolstatus featdata.AccessSelections(Model, component) 获得数据访问权限 ncount featdata.GetFeatureScopeBodiesCount 获取作用范围实体数量 MsgBox ncount dep featdata.Depth 读取孔深 dia featdata.Diameter 读取直径 MsgBox dia * dep 释放访问权重建模型 featuredata.ReleaseSelectionAccess Model.SaveModel Model.EditRebuild End Sub这里用SimpleHoleFeatureData2类型接收特征定义然后直接读Depth和Diameter属性。GetFeatureScopeBodiesCount返回的是这个孔特征影响的实体数量一般是 1。这段程序是教学用的没有做 if 容错如果当前选中的不是简单直孔GetDefinition返回的类型对不上后面读属性就会报错。实际写代码时必须在Set featdata curfeature.GetDefinition前后加类型判断下面例子会演示完整写法。4.3 修改基体拉伸长度从 GetDepth 到 ModifyDefinition读数据只是热身修改才是重头戏。下面的例子把基体拉伸凸台的长度翻倍这是教程里最完整的一段容错机制很全可以直接拿来改成自己的宏Dim swApp As SldWorks.SldWorks Dim Model As ModelDoc2 Dim Component As Component2 Dim CurFeature As Feature Dim isGood As Boolean Dim FeatData As Object Dim Depth As Double Dim SelMgr As SelectionMgr Sub doubleBE() Set swApp CreateObject(sldWorks.application) Set Model swApp.ActiveDoc 确保当前文档是零件或装配体 If Model.GetType 1 And Model.GetType 2 Then MsgBox 仅允许在零件或装配体上运行, vbOKOnly, Error Exit Sub End If Set SelMgr Model.SelectionManager Set CurFeature SelMgr.GetSelectedObject3(1) If CurFeature Is Nothing Then swApp.SendMsgToUser2 请选择一个拉伸特征, swMbWarning, swMbOk Exit Sub End If 检查特征类型名必须是拉伸 If Not CurFeature.GetTypeName Extrusion Then swApp.SendMsgToUser2 请选择一个拉伸特征, swMbWarning, swMbOk Exit Sub End If Set FeatData CurFeature.GetDefinition isGood FeatData.AccessSelections(Model, Component) If Not isGood Then swApp.SendMsgToUser2 无法访问特征数据, swMbWarning, swMbOk Exit Sub End If 确保是基体拉伸第一个拉伸特征 If Not FeatData.IsBaseExtrude Then swApp.SendMsgToUser2 请选择基体拉伸, swMbWarning, swMbOk FeatData.ReleaseSelectionAccess Exit Sub End If 读取当前深度并翻倍 Depth FeatData.GetDepth(True) FeatData.SetDepth True, Depth * 2 应用修改 isGood CurFeature.ModifyDefinition(FeatData, Model, Component) If Not isGood Then swApp.SendMsgToUser2 无法修改特征数据, swMbWarning, swMbOk FeatData.ReleaseSelectionAccess End If End Sub这段代码有几个要点值得说透。CreateObject(sldWorks.application)和Application.SldWorks都能拿到 SolidWorks 应用对象区别在于前者会在内存里创建一个新的 SolidWorks 实例如果已经有运行中的实例则复用后者直接拿当前运行的实例。在宏里推荐用Application.SldWorks因为宏本身就是运行在 SolidWorks 进程内的。文档类型判断这里有个真实的坑。教程作者在写If Model.GetType swDocPART And Model.GetType swDocASSEMBLY时swDocPART和swDocASSEMBLY在他的 VBA 环境里没有通过编译。他用了一个笨办法MsgBox Model.GetType把实际数值弹出来发现零件是 1装配体是 2于是直接用数字判断。如果你写的代码也遇到枚举常量未定义照这个方法查数值比去翻类型库定义快得多。类型名判断同样有坑。作者原本写If Not CurFeature.GetTypeName swTnExtrusion环境里swTnExtrusion也没通过改成字符串Extrusion就正常了。原因是 VBA 环境没有正确加载 SolidWorks 类型库的常量定义直接用字符串最省事。写这段代码时还遇到了特征“退回”状态的问题修改完特征后模型没有自动更新我是在代码末尾手动调用Model.Rebuild和Model.Save强制重建。这个现象后面放在避坑章节细说。4.4 装配体里插入零部件先 OpenDoc6 再 AddComponent4往装配体里插入零部件用的函数是AddComponent4。它的签名是retval AssemblyDoc.AddComponent4(compName, configName, x, y, z)参数含义compName要插入的零件或装配体的完整路径configName要加载的配置名称x, y, z组件中心点坐标这个函数有个非常容易踩的前提条件指定的文件必须先被加载到内存中。官方备注说得很清楚文件只有在当前 SolidWorks 会话中被打开过比如用OpenDoc6打开过文档或者打开过包含该文件的装配体才算在内存里。直接给一个硬盘路径是插不进去的。第一次用这个函数的人十有八九都会在这里卡一下。正确顺序是先打开文件再插零件。下面这段就是完整的插入流程Dim swApp As SldWorks.SldWorks Dim Model As ModelDoc2 Dim YSBmodel As ModelDoc2 Dim pth As String Dim strpath As String Dim nErrors As Long Dim nWarnings As Long Sub insertpart() Set swApp Application.SldWorks strpath swApp.GetCurrentWorkingDirectory 获取当前工作目录 Set Model swApp.ActiveDoc 当前文档即装配体 pth strpath 零件 1.SLDPRT 拼出完整文件路径 openpart pth 先打开零件到内存 Model.AddComponent4 pth, 配置 1, 0, 0, 0 再插入装配体 End Sub Sub openpart(ByVal pth As String) Dim newswapp As SldWorks.SldWorks Set newswapp Application.SldWorks Set YSBmodel newswapp.OpenDoc6(pth, 1, 0, , nErrors, nWarnings) YSBmodel.Visible False 不让零件窗口显示出来 End SubOpenDoc6的参数含义如下第一个是文档完整路径第二个是文档类型0 表示非 SolidWorks 文件、1 表示零件、2 表示装配体、3 表示工程图第三个是打开模式0 表示静默打开不带界面第四个是配置名空字符串表示按默认配置打开最后两个是错误码和警告码的输出参数打开失败时能从里面看到具体原因比如文件不存在、版本不兼容。打开后把Visible设为 False这样零件不会弹出窗口打断操作但已经加载到内存里AddComponent4就能顺利拿到它。实际项目里我习惯把OpenDoc6单独封装成一个函数传入路径和文档类型返回 ModelDoc2 对象。这样后面在装配体里插入多个零件时只需要循环调用这一个函数代码干净不少。4.5 添加配合的标准时序ClearSelection2 必须管好开头和结尾在装配体里添加配合是整套教程里最折腾的部分作者在文章开头直接说了“折腾了三天”。做配合时主要的难点在于选择配合实体面、线、基准面等以及配合函数AddMate2的参数时序。做配合的标准顺序是这样 第 1 步取消所有选择清空选择集 Model.ClearSelection2 True 第 2 步选择需要配合的实体 比如选择两个零件的面用 SelectByID2 按名称选中 或者用遍历面的方式选出符合条件的面 第 3 步调用 AddMate2 添加配合 AddMate2 参数较多不同配合类型传入的参数不同 第 4 步再次取消所有选择避免影响后续操作 Model.ClearSelection2 True为什么开头和结尾都要ClearSelection2因为AddMate2会把当前选择集里的实体拿去做配合运算如果选择集里有历史残留的选中项配合可能做错对象。开头清一次是确保干净起点结尾清一次是给后续操作让路。选面这个环节教程明确不建议用SelectByID2按名称选。原因很现实面的命名没有规律很多是系统自动生成的你根本猜不到名字用坐标值选面更糟糕模型稍微调整一下坐标就变了。正确的思路是遍历。拿到一个组件Component2后先GetBody拿到实体再通过GetFirstFace、GetNextFace遍历实体的所有面按类型平面、圆柱面、圆弧面和位置条件筛选出需要的面。虽然写起来比按名字选复杂但胜在稳定不依赖命名的偶然性。5. 常见问题与避坑记录五条最常见的翻车现场这套教程里出现的坑我几乎都踩过一遍。下面这五条是出现频率最高的按“现象 → 原因 → 解决”的顺序记下来希望你能绕开。5.1 录制的宏一运行就报错现象刚录完的宏直接运行VBA 报“运行时错误 91”或者“对象变量或 With 块变量未设置”。原因录制宏里残留了大量视图切换代码和冗余的SelectByID2/ClearSelection2调用这些调用在模型状态和录制时不一致时就会失败。解决严格按第二章的三类清理规则删代码删掉没用的变量声明、删掉RotateAboutCenter这类视图残留、删掉成对冗余的选择调用。清理完再运行。5.2 特征改了但模型不变出现“退回”状态现象用ModifyDefinition修改特征数据后特征树里的特征进入“退回”状态模型没有按新参数更新。原因ModifyDefinition只是把数据写进了特征定义对象但没有触发模型重建。SolidWorks 不会自动帮你 Rebuild特征退回状态就是数据已改、模型未更新的表现。解决在ModifyDefinition之后手动调用Model.Rebuild和Model.Save。教程作者当时的原话是“只能在代码执行到最后调用这两个函数来自动更新”。我现在的习惯是写完修改逻辑后立刻补Rebuild确认无误再Save。5.3 AddComponent4 提示文件不存在或插入失败现象用AddComponent4往装配体里插零件提示找不到文件或者函数返回 Nothing。原因AddComponent4要求文件必须先加载到内存。直接传一个硬盘路径SolidWorks 根本不去磁盘上找。解决先调用OpenDoc6把零件打开Visible设 False 隐藏再调用AddComponent4。顺序不能反。5.4 swDocPART、swTnExtrusion 这类常量在 VBA 里未定义现象代码里写了Model.GetType swDocPART或者CurFeature.GetTypeName swTnExtrusion编译时报“变量未定义”。原因VBA 环境没有正确加载 SolidWorks 类型库的枚举常量或者当前版本 API 里常量定义变了。解决用MsgBox把实际数值弹出来比如MsgBox Model.GetType得知零件是 1、装配体是 2然后直接用数字。类型名判断则直接用字符串swTnExtrusion改用Extrusion。这是最土但最可靠的办法不依赖任何常量定义。5.5 用 SelectByID2 选面总是失败现象按名称调用SelectByID2选面返回 False选不中。原因面的命名没有规律很多是程序自动生成的名称会随模型版本变化。解决改用遍历策略。拿到组件后GetBody取实体再用GetFirstFace、GetNextFace遍历所有面按面的类型和几何条件筛选。虽然代码量多一些但胜在稳定不会因为名字变化就废掉。6. 一个让宏更稳的收尾习惯Rebuild 和 Save 的顺序不要搞反6.1 我用的收尾套路ModifyDefinition、Rebuild、Save、弹窗的固定顺序写到这里说说我每次完成宏之后的固定动作。修改特征数据的宏最后三件事的顺序一定是ModifyDefinition → Rebuild → Save弹窗提示放最后。具体来说ModifyDefinition负责把新参数写进特征定义Rebuild让模型按新参数重建Save把结果写盘。如果先Save再Rebuild保存的是旧模型如果先弹窗再RebuildVBA 弹窗期间程序停住模型处于一个未定义状态你手动点掉弹窗后才继续多了一道人工干预。正确做法是把弹窗放到所有操作完成之后作为最终反馈。 正确收尾顺序 isGood CurFeature.ModifyDefinition(FeatData, Model, Component) If Not isGood Then swApp.SendMsgToUser2 无法修改特征数据, swMbWarning, swMbOk Exit Sub End If Model.Rebuild Model.Save swApp.SendMsgToUser2 修改完成, swMbInformation, swMbOk这套顺序看起来简单但实际项目里救过我好几次。早期我做装配体自动配合功能时每次跑完宏去看装配体配合关系要么没更新要么模型处于退回状态。排查了很久才发现是少了Rebuild。从那以后我每次写完宏都强制走一遍这个收尾顺序再也没出过这类问题。6.2 用窗口弹出替代 Debug.Print把宏交给别人用调试时用Debug.Print在立即窗口输出没问题但宏最终要交给不写代码的人用就得把反馈改成弹窗。教程里有用swApp.SendMsgToUser2的做法这个函数会弹出一个 SolidWorks 风格的消息框比MsgBox更专业。它有两个常用参数swMbWarning表示黄色警告图标swMbOk表示确定按钮。这个改动量不大但体验差很多。我见过太多宏功能没毛病就是失败时啥都不提示操作者以为成功了最后图纸出错。加一个SendMsgToUser2的失败分支成本极小回报极高。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑