☰
CAD VBA二次开发入门:从宏到对象模型与自动化实战
2026/11/4 2:42:18 网站建设 项目流程

简介:《CAD-VBA开发人员手册》是一份面向AutoCAD二次开发入门与进阶者的技术文档,由解祥成编写,适合希望用VBA扩展CAD功能、实现绘图自动化的设计人员与开发者,也可作为院校相关课程或项目实施的参考读物。全书十章,从VBA工程组织、宏与IDE操作讲起,依次展开ActiveX自动操作基础、对象模型与集合访问、AutoCAD环境控制、图元创建与编辑、标注与公差、菜单和工具栏定制、事件处理、三维坐标与实体编辑、布局与打印,最后落到光栅图像、块与属性等高级绘图组织技术,章节衔接完整,便于按需查阅。资源包内为1个PDF文件,约3.16MB,单文件即是整本手册,适合离线阅读与打印使用。目前已有2492人学习下载,可作为CAD二次开发查漏补缺的常备资料。

1. 先说清楚:CAD 里的 VBA 到底是个什么东西

刚接触 CAD 二次开发的人,十个里有八个会问同一句话:我不就是想让它少点几下鼠标吗,怎么一上来就是工程、宏、对象模型这些词?换个说法就好懂了——把 VBA 想成一套“录音加复读”的机制:你在 CAD 里点菜单、画线、改图层,这些动作被写成一段指令,以后遇到同样的活,按一下按钮让它自己跑一遍。所谓 CAD 二次开发,就是在别人做好的 CAD 上,加一层只服务于你自己工作流的按钮和自动流程;VBA 就是写这层东西最省事的入口语言,它内嵌在 CAD 里,不用装编译器、不用配环境,打开软件就能写、写完就能跑。这份《CAD-VBA 开发人员手册》走的就是这条路线:从“什么是工程和宏”讲到“怎么创建图元、加菜单、做标注、接事件”,十章一路铺下来,,会画图但没写过代码的人也能跟着上。

2. 为什么值得学:从每天点三百次鼠标到按一个按钮

先别急着打开编辑器。零基础学一样东西最容易半途而废的时刻,不是遇到难语法,而是“我学它到底图什么”这个问题没想明白。这一章就把这件事讲透:VBA 能替你干掉哪些活,它在整个 CAD 二次开发里的位置,以及开工前你该准备什么。

2.1 三种最典型的重复劳动,看你中了几条

第一种是批量改属性。一张老图纸传过来,图层名不统一、几百条线颜色不一样、线型还混着,手工一个个点,一下午就没了。这种活对程序来说反而是最轻松的:一个循环遍历完模型空间,把所有直线的颜色改成指定值,或者按规则搬到对应图层,几十行代码干完,下次还能重复用。

第二种是批量出图。几十张图,每张都要设置打印样式、选打印机、设定图纸尺寸、指定打印范围,然后确认。手工做一遍人就烦了,做错一张还得重来。VBA 里调用打印相关的方法,可以把这一整套流程写成一个宏,点一次批量跑完,出图前还可以先做一遍自检。

第三种是批量统计和标注。数一下这张图里有多少个图块、各类设备分别多少个、管道总长多少,最后生成一张材料表。或者给一堆对象按顺序编号、加引线、加文字说明。这类活最怕漏和重,人眼盯久了必出错,而程序遍历一遍从来不会漏。

这三类活有个共同点:规则明确、重复次数多、出错代价不小。它们正是自动化最值钱的地方。你不需要把工作全部自动化,只要能把这三种活里的任意一种做顺,学 VBA 花的时间就回来了。

2.2 VBA 在 CAD 二次开发里的位置:它不快,但它是最近的门口

能对 CAD 做二次开发的路子不止一条。CAD 自带一门方言式的脚本语言,写起来快、改起来也快,但代码一多就容易乱,做复杂界面和数据结构比较吃力;用 .NET 那一路(C# 或 VB.NET)能力最强,能做出接近商业插件的效果,代价是需要搭开发环境、懂面向对象、编译、部署,零基础上手会卡在“环境都装不好”这一步;用 Python 走外部接口也行,灵活,但同样要装解释器和第三方库。

VBA 的优势不在于性能和语言先进程度,而在于三件事:第一,编辑器内嵌在 CAD 里,按一个命令就打开,写完直接跑,不用切软件;第二,它通过 COM 接口直接够到 CAD 的对象模型,你想要的“模型空间里所有直线”“当前图层”“这张图的打印设置”,都能用接近大白话的写法拿到;第三,它天生带单步调试,代码跑飞了可以一行一行看着它走,这对新手来说是极其宝贵的反馈。

所以对零基础的你,最合理的路径是:先用 VBA 把“对象模型”这套心智建立起来——搞清楚一张图纸在程序眼里是怎么被组织和访问的——之后再转 .NET,会发现只是换了语法,脑子里的地图是同一张。手册本身也是这么排的,前三章全在打地基,第四到十章才是各种具体活。

2.3 零基础开工前要准备的三样东西

第一样是一台装着 CAD 的电脑,外加一个 VBA 组件。有些版本装完软件后,VBA 模块是要单独装的,如果你在命令行敲了打开编辑器的命令,提示“未知命令”,八成就是这个原因,先把它补装上,别在这一步怀疑自己。

第二样是一张可以随便折腾的空图纸。千万别拿公司正在用的正式图纸练手,你会在最开始十分钟里把它改得面目全非。新建一个文件,画几条线、几个圆、两个图块,够用了。

第三样是能随时查的手册和一颗允许自己报错的心。VBA 的报错信息在中文环境下常常翻译得很含糊,比如“要求对象”“类型不匹配”,新手看了完全不知道从哪改。手册里对属性、方法、参数的解释,就是你对着报错排查时的字典,别指望背下来,能查就行。

提示:学习顺序不要按手册目录一章一章硬啃。先把第 1 章的工程概念和第 2 章的对象模型看懂,再回头补第 3 章的环境控制,其余章节等真正用到那天再翻,效率高得多。

3. 第一次动手:15 分钟跑通第一个能看见结果的宏

概念讲再多,不跑通一次都是空的。这一章的目标很单一:让你在编辑器里写下第一段代码,运行它,然后看着图面上真的多出一条线。跑通这一下,后面就有底气了。

3.1 先把编辑器叫出来:认识工程窗口

在 CAD 命令行输入打开编辑器的命令并回车,几秒后会弹出一个灰白色的窗口,这就是 VBA 的集成开发环境。左边通常有一个“工程”窗口,如果没有,按 Ctrl+R 调出来。里面会列着当前所有已加载的工程,默认那个叫 ACADProject,展开它,你能看到代表当前图纸的 ThisDrawing,以及可以往里加模块的区域。

第一次进这个界面容易发懵:菜单那么多,窗口那么小。先不用管,只认三样东西——工程窗口里你要往哪个工程里写代码、代码窗口里你要在哪写、以及怎么运行。其余的属性窗口、工具箱,等你要做界面的时候再认识它们。

如果你在工程窗口看到的是空白,或者根本没有这个工程,说明当前没有可用工程,通过管理器新建一个就行。新工程默认名字是 ACADProject,改名字的地方在属性窗口里,这一点后面会专门讲。

3.2 第一个宏:画一条线,再弹个框告诉你画完了

在工程窗口里右键,插入一个模块,然后把下面这段代码粘进去。

Sub DrawFirstLine() ' 声明两个点,CAD 里的点是三个双精度数:X、Y、Z Dim startPt(0 To 2) As Double Dim endPt(0 To 2) As Double ' 起点 (0,0,0),终点 (100,50,0),Z 留 0 表示画在平面上的模型空间 startPt(0) = 0: startPt(1) = 0: startPt(2) = 0 endPt(0) = 100: endPt(1) = 50: endPt(2) = 0 ' 在模型空间里添加一条直线,AddLine 会返回这条线的对象 Dim lineObj As AcadLine Set lineObj = ThisDrawing.ModelSpace.AddLine(startPt, endPt) ' 给这条线单独指定颜色,acRed 是 CAD 内置的颜色常量 lineObj.Color = acRed ' 缩放到全图,保证你一眼能看到它 ThisDrawing.Application.ZoomExtents MsgBox "画完了,起点 0,0 终点 100,50" End Sub

这段代码没有任何高深技巧,就是把你在界面上做的三件事翻译成句子:画一条线、改它的颜色、缩放到全图。最后那句弹框只是给你一个明确信号,证明代码确实执行到了结尾,而不是中途悄悄报错退出。

写完以后按 F5,或者在 CAD 命令行运行宏并选中 DrawFirstLine。图面上应该出现一条红色线段,同时弹出一个提示框。如果出现了,恭喜,你已经跨过了最难的那道坎——从“我不会编程”到“我写的东西在 CAD 里真的生效了”。

3.3 逐行拆解:数组、对象变量和那个必须写上的 Set

上面那段代码里,有几个地方是新手第一次写必然要卡住的,值得单独说清楚。

Sub ... End Sub是一段可执行过程的包装,一个宏就是一个这样的盒子。名字自己起,但不要和已有的重名,也不要起中文名之外的怪字符。

Dim startPt(0 To 2) As Double声明了一个能装三个双精度数的数组。为什么是三个?因为 CAD 里的一个点由 X、Y、Z 三个坐标组成,哪怕你只在平面上干活,Z 也得占一个位置,写 0。这一步搞错,后面所有跟坐标有关的代码都会跟着错。

Set lineObj = ...里的 Set 是新手第一大坑。在 VBA 里,给普通变量(数字、字符串)赋值直接写等号;给对象变量赋值必须加 Set。少写这个 Set,你就会得到一个“运行时错误 91:对象变量或 With 块变量未设置”,而这条报错信息你光看是猜不出原因的。

ThisDrawing.ModelSpace.AddLine(startPt, endPt)是一句“从大到小”的导航:ThisDrawing 是当前这张图纸,ModelSpace 是它的模型空间,AddLine 是模型空间提供的一个方法。方法接收的参数和返回值,手册里都会列成表,第一次看不懂没关系,照着抄两遍就熟了。

参数类型说明
startPt三个双精度数的数组直线起点坐标
endPt三个双精度数的数组直线终点坐标
返回值AcadLine 对象新建的直线,可用于后续改属性

lineObj.Color = acRed是给刚创建出来的对象设置属性。acRed 这类以 ac 开头的名字是 CAD 预置的常量,代表颜色编号,不用你自己记数字。

3.4 运行、单步和保存:三个命令要记牢

运行宏有两种常用方式。一是通过宏对话框:命令行输入运行宏的命令,弹出列表,选中你要跑的那个,点运行。二是直接在编辑器里把光标放在过程内部按 F5。

真正让新手受益的是单步。按 F8 可以一行一行执行,每按一次走一行,当前行会高亮,把鼠标悬停在变量上还能看到它此刻的值。这是你搞清楚“代码到底走到哪一步出问题”的最好工具,比盯着报错信息瞎猜强太多。配合在可疑行上按 F9 打断点,程序会自己跑到那里停下来。

保存这件事要单独提醒。VBA 工程有两种存在形式:一种是嵌在图纸文件里,跟着图纸一起存;另一种是独立的工程文件。保存独立工程要用编辑器文件菜单里的保存,或者管理器的另存为;工程名称和文件名是两个不同的东西,工程名称在属性窗口里改,文件名在另存为对话框里改,很多人改了半天发现文件名没变,就是搞混了这两个。

3.5 嵌入工程和全局工程,新手到底该选哪个

这是手册开篇就讲的一对概念,也是新手最容易忽略、后面又最容易吃亏的地方。

嵌入工程保存在图纸内部。图纸一打开,工程就自动加载,用户什么都不用做,这对分发特别友好——你把图纸发给同事,宏就跟着过去了。代价是它的能力受限:它不能去打开或关闭其它图纸,因为它的函数只活在它所在的这张图里。

全局工程保存在独立的工程文件里,能力更全,能跨图纸运行,也能打开关闭图纸,适合存放你长期积累的通用工具库。但它不会自动加载,每次用之前得手动装载,而且用户得知道自己的宏在哪个文件里。

对比项嵌入工程全局工程
存放位置图纸文件内部独立工程文件
是否自动加载打开图纸时自动加载需手动装载
能否开关其它图纸不能能
一张图能有几个只能有一个不受限,可同时装载多个
适合场景一次性交付、随图分发的专用宏长期积累的通用工具库

入门阶段的建议是:练手用全局工程,因为改起来方便、不污染图纸;等你做出一个要交给别人用的东西,再把工程嵌进图纸里发出去。切换开关在 VBA 管理器里,装载、卸载、嵌入、分离都在那个界面,别在命令行瞎试。

4. 对象模型:二次开发真正的门槛在这里

第一段代码能跑起来之后,很多人会陷入第二个瓶颈:抄来的代码能改数字,但换个需求就完全不知道从哪下手。原因几乎都一样——脑子里没有一张“图纸在程序眼里长什么样”的地图。这张地图就叫对象模型,手册用整整一章讲它,是全书最值得慢读的部分。

4.1 用一个“文件柜”的比喻记住层次

把整个 CAD 程序想成一栋楼。最顶层是应用程序本身,也就是这栋楼;楼里有很多层,每一层对应一个打开的文档,图纸就是文档;每个房间里放着两个大柜子,一个叫模型空间,一个叫图纸空间;柜子里的一格格抽屉里装的,就是线、圆、圆弧、文字、图块这些图元。

除了这两个大柜子,房间里还有一排“管理用”的柜子:图层集合、文字样式集合、标注样式集合、线型集合。这些柜子装的是规则,不是图形,但图元的显示和打印全靠它们。

这个比喻的价值在于:你在代码里写的每一个名词,都是这栋楼里的一个具体位置。你要改一条线的颜色,路径就是“应用程序 → 文档 → 模型空间 → 某条线 → 颜色”;你要新建一个图层,路径是“应用程序 → 文档 → 图层集合 → 添加”。想不清楚路径的时候,回到这个比喻里找一找,几乎每次都能定位到该用哪个对象。

手册里对对象层次的展开,比这个比喻细得多,它把每个集合下面能装什么、每个对象有哪些父对象都列了。第一次看会觉得很杂,建议对着比喻看,把陌生的名字往柜子上贴,贴完就不乱了。

4.2 从 ThisDrawing 出发:遍历集合是第一个真本事

写代码时最常用的入口是 ThisDrawing,它代表当前这张图纸。注意“当前”两个字:在全局工程里,ThisDrawing 指向运行宏那一刻处于活动状态的那张图;在嵌入工程里,它通常指向装着这个宏的那张图。这个差别在同时开好几张图的时候会咬人,后面避坑那章会专门讲。

拿到 ThisDrawing 之后,最常见的动作是遍历集合。下面这段代码统计模型空间里有多少条直线。

Sub CountLines() Dim ent As AcadEntity ' 声明一个通用图元变量 Dim n As Long ' 计数器用长整型,别用 Integer,图元多了会溢出 n = 0 ' For Each 会依次取出模型空间里的每一个图元 For Each ent In ThisDrawing.ModelSpace ' TypeOf ... Is 用来判断这个图元到底是不是直线 If TypeOf ent Is AcadLine Then n = n + 1 End If Next ent MsgBox "模型空间里共有 " & n & " 条直线" End Sub

这段代码的核心是For Each ... In 集合。集合就是前面说的那个柜子,循环会把抽屉一个个拉开给你看。变量 ent 声明成 AcadEntity,是所有图元的“通用类型”,因为一个模型空间里可能混着线、圆、文字,你得先用通用类型接住,再用 TypeOf 判断它具体是什么,才能安全地访问它特有的属性。

这个套路可以套用到几乎所有集合上:遍历图层集合找某个名字的图层、遍历选择集处理用户选中的对象、遍历块定义看有哪些块。把这一段练熟,你就已经能做很多实际的活了。

n用 Long 而不是 Integer 是一个很现实的细节:Integer 在 VBA 里上限是三万多,一张复杂图纸的图元数量轻松超过它,溢出报错的时候你会一头雾水。这种“血泪经验”手册里未必都写,遇到了记住就好。

4.3 属性和方法,还有那个让人发懵的变体类型

属性是对象的特征,方法是对象能做的动作。判断标准很简单:能用一个值描述的是属性,比如一条线的颜色、起点、终点、所在图层;需要做一件事的是方法,比如添加、删除、旋转、移动、打印。编辑器里输入一个对象加点,会自动弹出成员列表,属性前面是不同的小图标,用两次就能分辨。

真正让新手困惑的是变体类型,也就是 Variant。它是个“什么都能装”的万能盒子,VBA 里很多方法的参数和返回值都是它。典型场景是取用户输入的点:返回值不是三个数的数组,而是一个变体,里面装着三个数。

Sub CircleByUserInput() Dim ctr As Variant ' 这里必须是 Variant,不能用数组类型 Dim radius As Double ' GetPoint 让用户在屏幕上点一下,返回值是变体 ' 第一个参数留空表示不需要基准点,第二个是命令行提示语 ctr = ThisDrawing.Utility.GetPoint(, "点一下圆心位置:") ' GetDistance 让用户再点一下确定半径 radius = ThisDrawing.Utility.GetDistance(ctr, "再点一下确定半径:") ' 用拿到的圆心和半径画圆 ThisDrawing.ModelSpace.AddCircle ctr, radius ThisDrawing.Application.ZoomExtents End Sub

这段代码做的事很朴素:问用户要两个信息,然后画个圆。GetPoint 的返回值直接赋给变体,不用 Set,因为它虽然装着数组,但整体被当成值传递。GetDistance 的第一个参数是基准点,传进去后屏幕上会有一条橡皮筋跟着鼠标走,用户能直观看到自己在量什么。

参数含义这里值得强调:GetPoint 的第一个参数如果传空,用户点的位置是绝对坐标;如果传一个基准点,返回的是相对于那个点的位移。这两个行为完全不同,但提示语长得一样,写错了不会报错,只会得到莫名其妙的结果。

手册在这一章还讲了类型库、父对象、在数据库里取第一个图元这些内容。第一次读可以跳过,等你需要精确判断某个对象属于哪个库、或者要从父对象往上找的时候再回来翻,那时你会觉得它写得挺细。

5. 新手最容易翻车的六个坑:现象、原因和解决

这一章按“出问题时的样子”来组织,不讲原理,只讲怎么从症状倒推原因。里面每一条都是新手头一个月必然遇到至少两次的东西,遇到时照着对一遍,比重新翻书快。

5.1 代码跑不起来:四个高频故障

坑一:图纸一打开就提示宏,代码一行都不执行。

现象是打开图纸时弹出关于代码启用与否的警告,你点了禁用,之后所有按钮都没反应,也不报错。原因是工程被装载了但代码被禁止执行,这种状态下程序看起来“在”,实际是空的。解决办法是在那个警告框里选择启用代码;如果这台机器上的图纸来源可信,可以把常用目录加入可信位置,避免每次都弹。反过来,来源不明的图纸一定要选禁用,宏病毒不是都市传说,这是少有的不能图省事的地方。

坑二:报“要求对象”或运行时错误 424,指着一行看起来很正常的代码。

现象是代码写到某个对象属性时突然崩,前面几行都好好的。原因通常是三选一:对象变量忘了用 Set 赋值;集合是空的,你要找的东西根本不存在,比如图层名写错一个字;或者上一个操作失败了但没检查,返回了一个空对象。解决办法是把那一行前面加上判断——先用集合的 Count 看看有没有东西,再检查对象是否为空,然后才访问它的属性。养成“先判断再访问”的习惯,能消掉一大半这类报错。

坑三:明明画了,图上却看不见。

现象是代码不报错,弹框也正常显示,但图面上空空如也。原因常见的有三种:当前图层被关闭或冻结了,新图元默认画在当前图层上,自然看不见;新图元画在了离你视野很远的地方,坐标写错了;或者视图没刷新。解决办法是先调用一次缩放到全图,如果还是看不见,就检查当前图层的开关和冻结状态,再打印一下你写入的坐标值,看看是不是多写或少写了一个零。

坑四:坐标数组写错,一路报错或者画到奇怪的地方。

现象是 AddLine、AddCircle 这类方法一调用就报类型不匹配,或者画出来的东西位置完全不对。原因是在 VBA 里点不能用(0,0,0)这种写法,必须声明成Dim p(0 To 2) As Double然后逐個赋值,或者用 Array 构造。另外下标默认是从 0 开始的,如果你声明成Dim p(1 To 3),某些方法就会判你长度不对。解决办法是统一用 0 To 2 的写法,养成肌肉记忆,别在这一点上创新。

5.2 工程和文件层面的坑:东西丢了比报错更疼

坑五:宏在 A 图上跑,结果改的是 B 图。

现象是你明明对着这张图点按钮,改动的却是另一张。原因是 ThisDrawing 指向的是“运行那一刻的活动文档”,如果你同时开了好几张图,而焦点不在你以为的那张上,代码就会跑到别处去。嵌入工程相对安全,全局工程就得小心。解决办法是在关键操作前显式判断活动文档,或者干脆在代码开头把要操作的文档对象固定下来,别在中途依赖 ThisDrawing。我第一次遇到这个问题时,一张画了两小时的图被改乱了,从那以后凡是跨图操作,我都会先确认活动文档。

坑六:分离工程时手一抖点了“否”,几天的代码没了。

现象是把工程从图纸里分离出去,弹出一个“是否在删除前输出”的提示,你顺手点了否,工程就从图纸里消失了,独立文件也没生成。原因是分离这个动作本身就是在删除,系统给的那次提示是唯一的后悔药,跳过就真没了。解决办法很简单但必须变成习惯:任何涉及分离、卸载、覆盖的操作之前,先手动另存为一份独立工程文件,有了备份再动。嵌入工程的好处是跟着图纸一起保存,但这也意味着如果图纸本身没保存就崩了,代码一起没。

注意:装载工程时出现的那次安全提示不是走过场。它决定的不是“能不能用”,而是“这段代码会不会被执行”。选错了不会报错,只会让你在接下来半小时里反复怀疑自己的代码写错了。

6. 接下来学什么:一条三个月能走通的路线

跑通第一个宏、会遍历集合之后,最怕的是漫无目的地翻手册。下面这条路线是按“能做出东西”倒推的,你可以照着排自己的节奏。

阶段大概时间重点练什么对应手册内容
第一周每天半小时工程概念、编辑器操作、单步调试第 1 章
第二到三周每天一小时对象模型、集合遍历、属性与方法第 2 章
第四到五周周末集中打开保存图纸、系统变量、取用户输入第 3 章
第六到八周结合工作创建与编辑图元、图层颜色线型、文字第 4 章
第九周起按需标注、菜单工具栏、事件、布局打印第 5 到 9 章

前三周别贪快。对象模型没打通就去看标注和三维,等于地基没浇就砌墙,抄来的代码改一个参数就崩。判断自己有没有过关的标准很朴素:给你一个需求,比如“把这章图里所有红色直线改成蓝色并移到名为 0 的图层”,你能不看示例,自己写出遍历、判断、改属性这三步,就算过了。

具体技巧上,我建议你从第一天起就建一个自己的“工具箱模块”。凡是写过的、跑通的、以后可能再用的过程,全部扔进同一个模块里,函数名起得直白一点,比如“批量改颜色”“统计图块数量”。三个月后你会发现,新需求的六成以上是从这个模块里拼出来的,真正要新写的没多少。这个习惯的价值不在于省时间,而在于你会慢慢形成自己的命名和结构,回头改半年前的代码时还看得懂。

另一个建议是别一开始就做界面。菜单、工具栏、窗体这些在手册第六、七章讲得很细,也很诱人,但界面只是壳子,壳子底下的逻辑跑不通,做出来就是个点一下就报错的按钮。先把功能写成能在编辑器里直接运行的宏,稳定之后再包一层按钮,这条路反过来走会很痛苦。

最后提一句心态。VBA 这门语言本身不复杂,真正花时间的是熟悉 CAD 的对象模型——哪些对象有哪些属性、哪些方法要什么参数。这些东西没法一次背完,只能用到一次查一次,查三次自然就记住了。手册的正确用法是当字典,不是当小说,从头读到尾反而记不住。

我带过的新人里,进步最快的那个有个习惯:每写完一段代码,不管成没成功,都会在旁边写一行中文注释,说明这段在干什么、参数为什么这么填。三个月后他的代码别人能看懂,自己的也能改。而我自己早年吃过亏,图省事不写注释、不做备份,一个小改动把一周的活覆盖掉,只能重写。从那以后我每次动结构性的改动之前,都强制先另存一份带日期后缀的工程文件,再开始改。慢三十秒,省一星期。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询