打开工作簿,除非它已经打开autohotkey COM对象

时间:2015-11-03 19:27:46

标签: autohotkey comobject excel.application

我试图检查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行?

1 个答案:

答案 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流程。