注册 登录
编程论坛 VFP论坛

请教:如何捕捉到关闭EXCEL文件的动作

zhousr 发布于 2023-05-21 16:32, 1385 次点击
调用EXCEL打开一个XLSX文件后,我要使程序暂停,在暂停时浏览文件,浏览结束后,关闭这个文件,并删除其中一列,然后保存,并发送给人家。我现在用的是  wait "",wait需要我在关闭EXCEL文件后再点击任意键才能继续后续操作。有时会忘了点击而直接把文件发送出去,这样该删除的一列就没删除。
WAIT既然能够捕捉到鼠标单击动作,应该也能捕捉到关闭EXCEL文件的动作,然后执行一个点击动作。
那么,在WAIT状态下,如何捕捉到关闭EXCEL文件的动作呢?
谢谢!
13 回复
#2
吹水佬2023-05-21 17:10
调用EXCEL打开一个XLSX文件的代码?
#3
shizi02023-05-21 17:23
1、建一个Timer,检测你创建的Excel进程,或窗口句柄。
2、Timer开始工作时,弹出一个顶层无模式表单Form1(可以设为不可见,也可以提示“等待Excel操作...”,总之目的是本应用不可操作)。当然觉得可以的话也可以隐藏整个应用窗口
3、Timer发现创建的Excel进程不见了,则停止Timer工作,关闭Form1。或恢复应用窗口
#4
zhousr2023-05-21 17:27
EXCEL在之前已经启动,打开文件是用:
oExcel..WorkBooks.Open("&lj\zycxjg\&xk&wch..xlsx")
#5
shizi02023-05-21 17:31
回复 4楼 zhousr
那很好办,检测oExcel是否没了,或打开的books是否没了
#6
pvm20002023-05-22 01:58
以下是引用shizi0在2023-5-21 17:31:24的发言:

那很好办,检测oExcel是否没了,或打开的books是否没了

方案可行
#7
zhousr2023-05-22 07:40
网上看到的代码:
LOCAL lOldSetOpt,mChanNum
lOldSetOpt = DDESetOption("SAFETY")
= DDESetOption("SAFETY",.F.)
mChanNum = DDEInitiate('Excel','&lj\zycxjg\&xk&wch..xlsx')     &&lcFileName某XLS文件名,如:D:\123.XLS
IF mChanNum <> -1
WAIT ""
ELSE
Click
ENDIF

能WAIT,但关闭EXCEL文件后, Click没执行,是不是用错了还是放错地方了?
#8
吹水佬2023-05-22 09:54
以下是引用zhousr在2023-5-22 07:40:29的发言:

网上看到的代码:
LOCAL lOldSetOpt,mChanNum
lOldSetOpt = DDESetOption("SAFETY")
= DDESetOption("SAFETY",.F.)
mChanNum = DDEInitiate('Excel','&lj\zycxjg\&xk&wch..xlsx')     &&lcFileName某XLS文件名,如:D:\123.XLS
IF mChanNum <> -1
WAIT ""
ELSE
Click
ENDIF

能WAIT,但关闭EXCEL文件后, Click没执行,是不是用错了还是放错地方了?

既然已经交给用户去处理,有可能关闭WorkBook而没关闭EXCEL的情况,如:
只有本站会员才能查看附件,请 登录

或者试试检测窗口是否打开状态,看能否满足要求。
程序代码:
DECLARE long IsWindowVisible IN user32 long
excel = CREATEOBJECT("Excel.Application")
excel.Visible = 1
DO WHILE IsWindowVisible(excel.hWnd) != 0
    INKEY(1)
ENDDO
? "EXCEL关闭了"

#9
厨师王德榜2023-05-22 10:40
只监控后台有无excel进程,我觉得不可取.很多用户的习惯,是同时打开多个excel,
所以 ,先收集后台进程,找出要监控的进程的pid. 这个步骤不可少.
最后,用一个timer监控这个进程pid是否还在.
大致流程就是这样,代码没时间写.
#10
zhousr2023-05-22 11:04
谢谢吹版,我愚钝,还是没搞定
WAIT之后的代码,要按任意键以后才会继续执行。我想,可能要非常底层的层面才能捕捉到某些动作吧?(我瞎猜的
#11
zhousr2023-05-22 11:06
谢谢王大厨,我再消化一下!
#12
zhousr2023-05-22 13:19
看来实现起来对我来说有点困难,干脆放弃这个想法,采用另一种方法,效果我自己也很满意:在WAIT后,用getfile(),这样就保证不会忘点了,不然不会执行打开文件夹的操作。
谢谢各位!!
#13
吹水佬2023-05-22 13:41
以下是引用zhousr在2023-5-22 11:04:58的发言:

谢谢吹版,我愚钝,还是没搞定
WAIT之后的代码,要按任意键以后才会继续执行。我想,可能要非常底层的层面才能捕捉到某些动作吧?(我瞎猜的


DO WHILE IsWindowVisible(excel.hWnd) != 0
    INKEY(1)
ENDDO

这几句就相当于WAIT,到关闭EXCEL后就跳出循环继续......

[此贴子已经被作者于2023-5-22 14:42编辑过]

#14
zhousr2023-05-22 15:11
吹版英明!
因为EXCEL前面已经启动,creat 改为get 就成了。
非常感谢!
1