我试图检查excel文件是否已打开,以及是否使用现有的打开文件。如果不是,我想打开文件。
此代码只提供一个空白的msgbox:
SetTitleMatchMode 2
xlWB := "MyExcelWorkbookTitle"
if(!WinExist(xlWB)) {
xl := ComObjCreate("Excel.Application")
FileSelectFile, Path
xl.Workbooks.Open(Path)
xl.Visible := True
WinActivate %xlWB%
} else {
xl := ComObjCreate("Excel.Application")
WinActivate %xlWB%
}
rowCount := xl.ActiveSheet.UsedRange.Rows.Count - 1
MsgBox %rowCount%
我在这里做错了什么?
编辑:为了澄清,当没有打开工作簿时,这个功能正常,但是当有一个工作簿已经打开时,它只是打开另一个工作簿。
简单来说,我希望它能够这样做:如果工作簿打开,文件名的前x个字符与预定义的字符串匹配,则使用该工作簿,否则打开一个新工作簿。
EDIT2:我认为值得一提的是我尝试编写代码的情况。当用户首次运行脚本时,它应该打开一个excel工作簿并更新网页中的值。在执行此操作的过程中,它可能会失败,并且脚本可能会退出。此时,用户将看到一个打开的工作簿,其中包含脚本在失败之前完成的行的未保存条目。
我希望能够重新运行脚本并将现有的打开工作簿附加到com对象,以便脚本可以继续正常运行。
有更好的方法吗?如果在更新网站时出现问题,我是否应该保存并关闭工作簿?
或者可能以不退出脚本的方式对脚本进行编码,但是迭代循环并再次尝试使用下一个excel行?
答案 0 :(得分:0)
迟到总比不到好。这对我有用:
SetTitleMatchMode, 2
xlWB := "xl"
if(!WinExist(xlWB)) {
XL := ComObjCreate("Excel.Application")
XL.Workbooks.Open( "C:\xl.xlsx" )
XL.Visible := True
} else {
XL := ComObjActive("Excel.Application")
WinActivate, %xlWB%
}
ComObjActive 将您连接到已经运行的Excel进程。
ComObjCreate 开始新的Excel流程。