初学lisp 还不是太懂 在论坛搜到一个excel操作函数的合集 遇到一点问题
首先是一个初始化的
 - ;0·初始化
- ;|
- Examples:
- (vlxls-app-init) ==> 33
- |;
- (defun vlxls-app-Init
- (/ OSVar GGG Olb8 Olb9 Olb10 TLB Out msg msg1 msg2)
- (if *Chinese*
- (setq msg "\n 初始化微软Excel "
- msg1 "\042初始化Excel错误\042"
- msg2 (strcat
- "\042 警告"
- "\n ===="
- "\n 无法在您的计算机上检测到微软Excel软件"
- "\n 如果您确认已经安装Excel, 请发送电子邮"
- "\n 件到kozmosovia@hotmail.com获取更多的解决方案\042"
- )
- )
- (setq msg "\n Initializing Microsoft Excel "
- msg1 "\042Initialization Error\042"
- msg2 (strcat
- "\042 WARNING"
- "\n ======="
- "\n Can NOT detect Excel97/200X/XP in your computer"
- "\n If you already have Excel installed, please email"
- "\n us to get more solution via kozmosovia@hotmail.com\042"
- )
- )
- )
- (if (null msxl-xl24HourClock)
- (progn
- (if (and (setq GGG
- (vl-registry-read
- "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Excel.EXE"
- "Path"
- )
- )
- (setq GGG (strcase (strcat GGG "Excel.EXE" )))
- )
- (progn
- (foreach OSVar (list "SYSTEMROOT" "WINDIR"
- "WINBOOTDIR" "SYSTEMDRIVE"
- "USERNAME" "COMPUTERNAME"
- "HOMEDRIVE" "HOMEPATH"
- "PROGRAMFILES"
- )
- (if (vl-string-search (strcat "%" OSVar "%" ) GGG)
- (setq GGG (vl-string-subst (strcase (getenv OSVar)) (strcat "%" OSVar "%" ) GGG))
- )
- )
- (setq Olb8 (findfile (vl-string-subst "EXCEL8.OLB" "EXCEL.EXE" GGG))
- Olb9 (findfile (vl-string-subst "EXCEL9.OLB" "EXCEL.EXE" GGG))
- Olb10 (findfile (vl-string-subst "EXCEL10.OLB" "EXCEL.EXE" GGG))
- )
- (cond
- ((= (vl-filename-base (vl-filename-directory GGG)) "OFFICE16")
- (setq TLB GGG Out "2016")
- )
- ((= (vl-filename-base (vl-filename-directory GGG)) "OFFICE11")
- (setq TLB GGG Out "2003")
- )
- ((= (vl-filename-base (vl-filename-directory GGG)) "OFFICE10")
- (setq TLB GGG Out "XP")
- )
- (Olb9 (setq TLB Olb9 Out "2000"))
- (Olb8 (setq TLB Olb8 Out "97"))
- (T (setq Out "Version Unknown" ))
- )
- (if TLB
- (progn
- (princ (strcat MSG Out "..." ))
- (vlax-import-type-library
- :tlb-filename TLB :methods-prefix
- "msxl-" :properties-prefix
- "msxl-" :constants-prefix "msxl-"
- )
- )
- )
- )
- (progn
- (if vldcl-msgbox
- (vldcl-msgbox "x" msg1 msg2)
- (alert (read msg2))
- )
- (exit)
- )
- )
- )
- )
- msxl-xl24HourClock
- )
我在我电脑上执行这个程序是返回nil的 在另一台电脑上可以 看程序示例应该要返回33 不是很清楚那个OSVar是什么变量 希望有大神解答下
然后还有个 另一台电脑上执行后 然后打开xls 无法赋值
 - ;0·从指定单元格开始赋值
- ;|
- Examples:
- (vlxls-cell-put-value *xlapp* "C12" "xx") ==> #<VLA-OBJECT Range 093a7764>
- (vlxls-cell-put-value *xlapp* "C12:F3" "xx") ==> #<VLA-OBJECT Range 43c5ac64>
- (vlxls-cell-put-value *xlapp* "C12:D13" ‘ (("zz" "xx") ("xx" "zz"))) ==> #<VLA-OBJECT Range 1b8f2a64>
- |;
- (defun vlxls-cell-put-value
- (xl id Data / vllist-explode idx xx yy ary Rtn)
- (defun vllist-explode (lst)
- (cond
- ((not lst) nil)
- ((atom lst) (list lst))
- ((append (vllist-explode (car lst))
- (vllist-explode (cdr lst))
- )
- )
- )
- )
- (if (null id) (setq id "A1" ))
- (if (= (type id) 'list) (setq id (vlxls-rangeid id)))
- (if (= (type (car Data)) 'LIST)
- (setq ARY (vlax-make-safearray
- vlax-vbstring
- (cons 0 (1- (length Data)))
- (cons 1 (length (car Data)))
- )
- XX (1- (length (car Data)))
- YY (1- (length Data))
- )
- (setq ARY (vlax-make-safearray
- vlax-vbstring
- (cons 0 1)
- (cons 1 (length Data))
- )
- XX (1- (length Data))
- YY 0
- )
- )
- (if (= xx yy 0)
- (msxl-put-value2
- (setq Rtn (msxl-get-range xl id))
- (car (vllist-explode data))
- )
- (progn
- (setq id (vlxls-cellid-calc id xx yy))
- (msxl-put-value2
- (setq Rtn (msxl-get-range xl id))
- (vlax-safearray-fill ary data)
- )
- )
- )
- Rtn
- )
我直接按照程序示例 输入(vlxls-cell-put-value *xlapp* "C12" "xx") 提示返回 错误: 参数类型错误: consp "xx"
如果删除XX的双引号 改成 (vlxls-cell-put-value *xlapp* "C12" xx) 提示返回 错误: SAFEARRAYBOUND 中的上界小于下界。
如果把XX改成数字 改成 (vlxls-cell-put-value *xlapp* "C12" 1) 提示返回 错误: 参数类型错误: consp 1
那么这个"XX"是要输入什么类型的参数 希望大神能帮我解答
|