Откройте книгу, если она еще не открыта.

Я пытаюсь проверить, открыт ли файл 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.

Другие вопросы по тегам