Откройте книгу, если она еще не открыта.
Я пытаюсь проверить, открыт ли файл Excel, и использует ли он существующий открытый файл. Если это не так, я хочу открыть файл.
Этот код просто дает пустое сообщение:
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 символов имени файла соответствуют предварительно определенной строке, используйте эту книгу, в противном случае откройте новую.
РЕДАКТИРОВАТЬ 2: Я думал, что также стоит упомянуть ситуацию, для которой я пытаюсь кодировать. Когда пользователь впервые запускает сценарий, он должен открыть книгу Excel и обновить значения на веб-странице. В процессе этого может произойти сбой, и сценарий может выйти. В этот момент у пользователя остается открытая рабочая книга с несохраненными записями для строк, через которые работал скрипт до его сбоя.
Я хочу иметь возможность повторно запустить скрипт и присоединить существующую открытую книгу к объекту com, чтобы скрипт мог продолжать работать в обычном режиме.
Есть лучший способ сделать это? Должен ли я просто сохранить скрипт и закрыть книгу, если возникла проблема с обновлением сайта?
Или, может быть, закодировать сценарий таким образом, чтобы он не выходил из сценария, а повторял цикл и повторял попытку со следующей строкой Excel?
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.