找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 9942|回复: 18

[求助] lisp 如何操作EXCEL ????????????????

[复制链接]
发表于 2015-2-8 00:43:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
请问: 1. 在lisp中如何判断某个工作薄是否已经打过?
         2. 用lsip如何操作,将EXCEL某个工作表拷贝到当前的工作表?
        3. 如何获取某个工作表有内容的某一列最后一行行号?
请多多指教!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2015-2-9 21:06:01 | 显示全部楼层
大师,你给出的是一种方法,我只会lisp,VLISP还没学会,我看过一段代码:
(Defun vlxls-app-open(XLSFile UnHide / ExcelApp WorkSheet Sheets ActiveSheet Rtn)
  ;;;function: this program can open an excelfile
  (setq XLSFile (strcase XLSFile))
  (if (null (wcmatch XLSFile "*.XLS"))
  (setq XLSFile (strcat XLSFile ".XLS")))
  (if (and (findfile XLSFile)
       (setq Rtn (vlax-get-or-create-object "Excel.Application")))
    (progn (vlax-invoke-method (vlax-get-property Rtn 'WorkBooks)
        'Open XLSFile)
(if UnHide
    (vla-put-visible Rtn 1)
    (vla-put-visible Rtn 0))))
  Rtn)

;;;Examples:
;;;(setq *xlapp* (vlxls-app-open “C:/test.XLS” T)) e #<VLA-OBJECT _Application 001efd2c>
意思是打开一个EXCEL文件,现在我想要判断这个文件是否已经打开,这要怎么改?
第二个问题是,有一个表,我称之为模版,这个表中有内嵌对应的VBA程序,当新建一个表时,要将模版的所有内容拷入新表中.并实现模版中的所有功能(VBA程序作用).

点评

打开的文件在windows是锁定状态,使用vl-file-size返回nil 使用com方式复制Range会把公式一起复制的(相对引用)至于VBA控制没有遇到过,你可以发个文件上来测试下  详情 回复 发表于 2015-2-9 22:28
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

发表于 2015-2-8 09:51:44 | 显示全部楼层
1 a. (vlax-get-object "Excel.Application") -> workbooks -> foreach workbook name
   b. vl-file-size 不可读取返回 nil

2 查找前面每日一码

3 用 UsedRange 后获取 Column ,倒着往前第一个有内容的单元格
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-8 21:44:49 | 显示全部楼层
能具体点吗,有代码能一点点琢磨出来点,还有第二个问题将模版的嵌入的VBA也拷,行吗?

点评

没看懂你要表达什么意思,Excel 启动后用 workbooks 获取的是文档集合,每个文档中又可以获取 Sheets 集合,Excel 的 ActiveSheet 是当前 Sheet,遍历 WorkBooks 获取其它 WorkBook 中的 Sheets,再遍历 Sheets 中  详情 回复 发表于 2015-2-9 08:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-2-9 08:31:53 | 显示全部楼层
本帖最后由 Free-Lancer 于 2015-2-9 08:37 编辑
挚友01 发表于 2015-2-8 21:44
能具体点吗,有代码能一点点琢磨出来点,还有第二个问题将模版的嵌入的VBA也拷,行吗?

没看懂你要表达什么意思,Excel 启动后用 workbooks 获取的是文档集合,每个文档中又可以获取 Sheets 集合,Excel 的 ActiveSheet 是当前 Sheet,遍历 WorkBooks 获取其它 WorkBook 中的 Sheets,再遍历 Sheets  中的 Sheet ,获取 UsedRange ,复制到 ActiveSheet

Excel.Application -> WorkBooks
                             ->WorkBook -> Sheets
                                                     -> Sheet -> UsedRange


这种关系和 Autocad  一样,只不过 Autocad  没有第三级,Document 就一个

AutoCAD.Application -> Documents
                                   -> Document
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2015-2-9 22:28:05 来自手机 | 显示全部楼层
挚友01 发表于 2015-2-9 21:06
大师,你给出的是一种方法,我只会lisp,VLISP还没学会,我看过一段代码:
(Defun vlxls-app-open(XLSFile UnHi ...

打开的文件在windows是锁定状态,使用vl-file-size返回nil
使用com方式复制Range会把公式一起复制的(相对引用)至于VBA控制没有遇到过,你可以发个文件上来测试下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-9 22:36:10 | 显示全部楼层
MSXL-GET-ACTIVESHEET 这个函数在哪去找到和在哪去装载?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-9 22:41:59 | 显示全部楼层
随便加载一段看是不是能拷贝过来
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
'If Target.Row <= 4 Then
  '  Range("A5").Select
'End If
End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-9 22:57:21 | 显示全部楼层
还有就是在VLISP程序控制中能不能在EXCEL里执行个宏命令?

点评

为什么要这样做?  详情 回复 发表于 2015-2-10 00:17
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2015-2-10 00:17:05 来自手机 | 显示全部楼层
挚友01 发表于 2015-2-9 22:57
还有就是在VLISP程序控制中能不能在EXCEL里执行个宏命令?

为什么要这样做?

点评

看没不什么出息的人不少啊,lisp不是万能的,看看大师就能想办法解决,没什么想法的,边去...  发表于 2015-2-10 22:52
看没不什么出息的人不少啊,lisp不是万能的,看看大师就能想办法解决,没什么想法的,边去...  发表于 2015-2-10 22:50
以为LISP是万能的。  发表于 2015-2-10 07:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1669个

财富等级: 堆金积玉

发表于 2018-1-24 23:46:47 | 显示全部楼层

请教一下,为什么我用vl-file-size来判断一个打开的EXCEL文件,仍然能够获取文件大小,并不是返回 nil
我也想判断一个EXEL是否打开,如果打开了,就不再重复打开.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 55个

财富等级: 招财进宝

发表于 2018-9-26 14:45:22 | 显示全部楼层
能打开文件的前提条件是不是要保持Excel文件打开状态?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 55个

财富等级: 招财进宝

发表于 2018-9-26 14:49:29 | 显示全部楼层
(defun getfilerange(ExcelFile SheetName / xl wbs wb fn shs sh usr row yn column xn ret)
        (vl-load-com)
        (setq ExcelFile fn SheetName s_name)
        ;(STARTAPP "EXPLORER.EXE""C:\\Program Files (x86)\\Microsoft Office\\root\\Office16\\EXCEL.EXE")
        (setq xl (vlax-get-or-create-object "Excel.Application"))
        (setq wbs (vlax-get-property xl "WorkBooks"))
        (setq wb (vlax-invoke-method wbs "Open" ExcelFile))
        (setq shs (vlax-get-property wb "Sheets"))
        (setq sh (vlax-get-property shs "Item" SheetName))
        (setq usr (vlax-get-property sh 'usedRange))
        (setq row (vlax-get-property usr 'rows))
        (setq yn (vlax-get-property row 'count))
        (setq column (vlax-get-property usr 'columns))
        (setq xn (vlax-get-property column 'count))
        (vlax-invoke-method wb "Close")
        (vlax-invoke-method xl "Quit")
        (vlax-release-object xl)
        (setq yn(itoa yn))
        (setq ret(chr (+ xn 64)))
        (setq ret (strcat "A3:" ret yn))
);end fun
我用这个读,总是一会行,一会又说实参太少,打不开Excel文件,哪位给详细解释下?
我是刚入门,是不是一开始要运行下打开Excel。EXE?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 04:26 , Processed in 0.247361 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表