本帖最后由 gamexia 于 2024-11-21 16:11 编辑
利用excel数据,插入块,cad 返回这个错误: no function definition: MSXL-GET-RANGE
是啥问题,帮看看
excel路径:
"C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE"

网友答: 本帖最后由 kozmosovia 于 2024-11-20 20:18 编辑
这是因为没有加载Excel的 typelib导致的,不过可以找到错误代码位置,用vlax-get改写一下,就不需要msxl开头的函数了。我印象中不久之前有个帖子里我说过。你可以搜一下
要定位你的Excel.exe
(setq tlb "d:\\Program Files\\Microsoft Office\\Office12\\Excel.exe")
(vlax-import-type-library
:tlb-filename tlb :methods-prefix
"msxl-" :properties-prefix "msxl-"
:constants-prefix "msxl-"
)
网友答: 翻译一下就知道是缺少这个函数了网友答: 第十五行
(setp km (Ljx-read-excel-data "C" mm *sheet* ))
setq好像打成step了网友答:
第十五行setq 我修改了,还是不行,报错: no function definition: MSXL-GET-RANGE网友答: 定位Excel.exe后
又显示 错误: 参数类型错误: VLA-OBJECT nil网友答: 我搜索了下,用活动的excel就可以了
网友答:
我也遇到了这个问题 于是改用了c#网友答:
本帖最后由 llsheng_73 于 2024-11-22 10:12 编辑
一是象二楼那样通过lax-import-type-library连接EXCEL库,二是通过vlax-get-property vlax-put-property vlax-invoke-method这三大神器来处理,彻底避坑
(setq xls(vlax-get-or-create-object"excel.application"));获取EXCEL对象
#<VLA-OBJECT _Application 0c13458c>
_$ (setq books(vlax-get-property xls'workbooks));;EXCEL表
#<VLA-OBJECT Workbooks 0c0405bc>
_$ (setq book(vlax-invoke-method books 'add));新建空表
#<VLA-OBJECT _Workbook 0c040184>
_$ (setq sheet(vlax-get-property book 'activesheet));;;当面页;;;
#<VLA-OBJECT _Worksheet 08f70b74>
_$ (vlax-put-property(vlax-get-property sheet'range"A1")'value2 123.45);;给"A1"设置数值
nil
_$ (vlax-put-property xls 'visible 1);;;显示excel对象
.....
其它的如果不知道怎么写,可以录制宏来翻译,查看宏的时候主要关心对象及其属性或方法
网友答:
这还真的能运行,在VBA中必须引用excel对象库,才能用CreateObject创建excel程序对象。这尼玛直接就vlax-create-object创建出excel程序对象了。
利用excel数据,插入块,cad 返回这个错误: no function definition: MSXL-GET-RANGE
是啥问题,帮看看
excel路径:
"C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE"

- (defun c:mapan ()
- (vl-load-com)
- (setq exname "d:\\ABC.xls")
- (setq *excel* (vlax-create-object "excel.application"))
- (setq *xlapp* (vlax-invoke-method (vlax-get-property *excel* 'Workbooks) 'Open exname))
- (vla-put-visible *excel* 1) ;;显示工作表
- (setq *sheet* (vlax-get-property (vlax-get-property *xlapp* 'Worksheets) 'item "DEF"))
- (setq pt (getpoint "\n选择需要插入块的基点:"))
- (setq mm 2) ;mm从第二行开始
- (repeat 1080
- ;;;从EXCEL的C列mm行读取块名
- (setq km (Ljx-read-excel-data1 "C" mm *sheet* ))
- ;;;从excel的B列mm行读取角度
- (setq jiaodu (Ljx-read-excel-data1 "B" mm *sheet*))
- (command "_insert" km pt 1 1 jiaodu );以pt为基点插入指定块,x比例1,y比例1,角度为指定jiaodu
- (setq mm (1+ mm))
- )
-
- (vlax-invoke-method (vlax-get-property *excel* "ActiveWorkbook") 'Close 0)
- (vlax-invoke-method *excel* 'QUIT)
- (vlax-release-object *sheet*)
- (vlax-release-object *xlapp*)
- )
- ;;;;;读取数excel数据函数
- (defun Ljx-read-excel-data1 (vv hor sh) ;;;vv为列数直接输入字母、hor为 第几行,直接输入数字,sh为工作表对象sheet
- (vlax-variant-value (vlax-get-property (vlax-get-property sh 'Range (strcat vv (itoa hor))) 'Value2))
- )
- ;;;;;读取数excel数据函数输出text格式
- (defun Ljx-read-excel-text1 (vv hor sh / ru) ;;;vv为列数直接输入字母、hor为 第几行,直接输入数字,sh为工作表对象sheet
- (vl-princ-to-string (vlax-variant-value (vlax-get-property (vlax-get-property sh 'Range (strcat vv (itoa hor))) 'Value2)))
- )
- (defun ljx-vlxls-get-range-value1 ( sheet rangeid / range value valuelist )
- (setq range (vlax-get-property sheet 'Range rangeid))
- (setq value (vlax-get-property range 'Value2))
- (cond
- ((= (vlax-variant-type value) 8204);;;为数组时,即为区域;
- (progn
- (setq value (vlax-safearray->list(vlax-variant-value value)))
- (setq valuelist (mapcar (function (lambda (x) (mapcar 'vlax-variant-value x))) value))
- )
- )
- ( T;;;;为单个单元格;
- (setq valuelist (vlax-variant-value value))
- )
- );;;;cond
- valuelist
- )
网友答: 本帖最后由 kozmosovia 于 2024-11-20 20:18 编辑
这是因为没有加载Excel的 typelib导致的,不过可以找到错误代码位置,用vlax-get改写一下,就不需要msxl开头的函数了。我印象中不久之前有个帖子里我说过。你可以搜一下
要定位你的Excel.exe
(setq tlb "d:\\Program Files\\Microsoft Office\\Office12\\Excel.exe")
(vlax-import-type-library
:tlb-filename tlb :methods-prefix
"msxl-" :properties-prefix "msxl-"
:constants-prefix "msxl-"
)
网友答: 翻译一下就知道是缺少这个函数了网友答: 第十五行
(setp km (Ljx-read-excel-data "C" mm *sheet* ))
setq好像打成step了网友答:
Scarlet2001 发表于 2024-11-20 17:31
第十五行
(setp km (Ljx-read-excel-data "C" mm *sheet* ))
setq好像打成step了
第十五行setq 我修改了,还是不行,报错: no function definition: MSXL-GET-RANGE网友答: 定位Excel.exe后
又显示 错误: 参数类型错误: VLA-OBJECT nil网友答: 我搜索了下,用活动的excel就可以了

- (defun c:mapan ()
- (vl-load-com)
- ;;简单示例lisp读取excel里的数据(没有判断容错功能)by snddd2000 2011-11-17
- (setq excelapp0 (vlax-get-object "Excel.Application"))
- ;;excel程序对象,没开excel下边的都是白搭
- (setq activeworkbook0 (vlax-get-property excelapp0 'ActiveWorkbook))
- ;;excel工作簿对象
- (setq activesheet0 (vlax-get-property activeworkbook0 'ActiveSheet))
- ;;excel工作表对象
- (setq cells0 (vlax-get-property activesheet0 'cells))
- ;;获取excel单元格对象的示例 (get-cell 3 2) ;;;3是指3横行,2是指B竖列
- (setq mm 2) ;mm从第二行开始
- (setq pt (getpoint "\n选择需要插入块的基点:"))
- (setq mm 2) ;mm从第二行开始
-
- (repeat 1080
- (setq km (get-cell mm 3))
- (setq km (rtos km));转字符串
- (setq jiaodu (get-cell mm 2))
- ; (setq jiaodu (rtos jiaodu))
- (command "_insert" km pt 1 1 jiaodu );以pt为基点插入指定块,x比例1,y比例1,角度为指定jiaodu
- (setq mm (1+ mm))
- )
-
- )
- (defun get-cell (row col)
- (setq a1 (vlax-get-property cells0 'item row col))
- ;;A1单元格对象
- (setq a1-value
- (vlax-variant-value
- (vlax-get-property (vlax-variant-value a1) 'value)
- ;;或者'value
- )
- )
- ;;单元格里面的值里的值
- a1-value
- )
一是象二楼那样通过lax-import-type-library连接EXCEL库,二是通过vlax-get-property vlax-put-property vlax-invoke-method这三大神器来处理,彻底避坑
(setq xls(vlax-get-or-create-object"excel.application"));获取EXCEL对象
#<VLA-OBJECT _Application 0c13458c>
_$ (setq books(vlax-get-property xls'workbooks));;EXCEL表
#<VLA-OBJECT Workbooks 0c0405bc>
_$ (setq book(vlax-invoke-method books 'add));新建空表
#<VLA-OBJECT _Workbook 0c040184>
_$ (setq sheet(vlax-get-property book 'activesheet));;;当面页;;;
#<VLA-OBJECT _Worksheet 08f70b74>
_$ (vlax-put-property(vlax-get-property sheet'range"A1")'value2 123.45);;给"A1"设置数值
nil
_$ (vlax-put-property xls 'visible 1);;;显示excel对象
.....
其它的如果不知道怎么写,可以录制宏来翻译,查看宏的时候主要关心对象及其属性或方法
网友答:
llsheng_73 发表于 2024-11-22 10:04
一是象二楼那样通过lax-import-type-library连接EXCEL库,二是通过vlax-get-property vlax-put-property vl ...
这还真的能运行,在VBA中必须引用excel对象库,才能用CreateObject创建excel程序对象。这尼玛直接就vlax-create-object创建出excel程序对象了。