AutoCAD加载LISP函数关联VBA的步骤及运行报错解决
问题描述
VBA无法直接获取刚放置到AutoCAD屏幕上的对象句柄,已知AutoCAD LISP可通过entget(entlast)获取句柄。我找到了一段LISP代码并保存为Application.1.lsp:
(defun *entlast* () (cdr (assoc 5 (entget (entlast)))) )
同时找到用于关联VBA与LISP的代码:
Public Function entLast() As AcadEntity Dim vl As Object Dim vlFun As Object Dim Result As String Set vl = ThisDrawing.Application.GetInterfaceObject("VL.Application.1") Set vlFun = vl.ActiveDocument.Functions Result = vlFun.Item("*entlast*") Set entLast = ThisDrawing.HandleToObject(Result) End Function Public Sub testme() Dim ent As AcadEntity Set ent = entLast Debug.Print ent.ObjectName End Sub
已通过LISP编辑器加载上述LISP函数,但运行VBA宏的testme子程序时,弹出报错:
Problem in loading application.
现需解决:加载LISP函数并与VBA建立连接的正确步骤,以及上述报错的修复方案。
解决方案
一、LISP函数加载的正确步骤
- 路径配置:将
Application.1.lsp放在AutoCAD默认搜索路径下(如安装目录的Support文件夹),避免加载时出现路径找不到的问题。 - 加载方式:
- 命令行手动加载:在AutoCAD命令行输入
(load "Application.1.lsp"),回车后无报错则表示加载成功。 - 自动加载:将LISP文件路径添加到
acad.lsp或acaddoc.lsp中,实现AutoCAD启动时自动加载该函数。
- 命令行手动加载:在AutoCAD命令行输入
二、VBA代码修正与连接逻辑优化
原VBA代码存在两个核心问题:一是仅获取了LISP函数对象,未触发函数执行;二是VL.Application的调用逻辑有误,导致无法正确获取LISP执行结果。修正后的代码如下:
Public Function entLast() As AcadEntity Dim vl As Object Dim lispResult As Variant ' 初始化Visual LISP接口 Set vl = ThisDrawing.Application.GetInterfaceObject("VL.Application.1") ' 执行自定义LISP函数,获取最新实体的句柄 lispResult = vl.Eval("(*entlast*)") ' 通过句柄映射到AutoCAD实体对象 If Not IsEmpty(lispResult) Then Set entLast = ThisDrawing.HandleToObject(lispResult) End If End Function Public Sub testme() Dim ent As AcadEntity Set ent = entLast If Not ent Is Nothing Then Debug.Print ent.ObjectName Else Debug.Print "未找到最新实体或获取失败" End If End Sub
三、报错验证与排查
- 验证LISP加载状态:在AutoCAD命令行输入
(*entlast*),如果返回一串字符串(实体句柄),说明LISP函数加载正常。 - 检查VBA支持状态:通过AutoCAD的
OPTIONS对话框→「文件」选项卡,确认VBA支持组件已加载(部分版本需手动启用)。 - 测试流程:先在AutoCAD中绘制一个实体(如直线、圆),再运行
testme宏,查看VBA编辑器的立即窗口是否输出实体名称。
内容的提问来源于stack exchange,提问作者JMc1999
相关产品推荐
相关产品推荐

