1

我正在尝试检查一个 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 行再次尝试的方式对脚本进行编码?

4

1 回答 1

1

迟到总比不到好。这对我有用:

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 进程。

于 2018-07-11T02:45:13.393 回答