Что нового

Отправка команды, в неактивное окно MS Excel

st_Tr

Новичок
Сообщения
4
Репутация
0
Версия AutoIt: 3.3.8.1

Описание:
Дано: открытый эксель файл, окно неактивно.
Необходим: хоткей, при нажатии по которому, число в заданной ячейке увеличивается на единицу.

Примечания:
Окно экселя должно оставаться неактивным.
Желательно в самом простом виде, а то в скриптах не разбираюсь, а мне еще предстоит расширить этот скрипт для разного кол-ва хоткеев и разных адресов ячеек.
 
Автор
S

st_Tr

Новичок
Сообщения
4
Репутация
0
Реально ли вообще обращаться к конкретной ячейке эксель таблицы?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
st_Tr [?]
в самом простом виде
Код:
#include <Excel.au3> ; подключаем UDF для работы с Excel

HotKeySet("^i", "IncCell") ; устанавливаем горячую клавишу Ctrl+I на выполнение функции IncCell

$Path = "D:\Книга1.xls" ; путь к открытому файлу

$Excel = _ExcelBookAttach($Path) ; присоединяемся к открытой книге
If $Excel = 0 Then
  MsgBox(0, "Ошибка", "Объект Excel не создан. Работа скрипта будет завершена.")
  Exit
EndIf

While 1
  Sleep(100) ; бесконечный цикл
WEnd

Func IncCell()
  $Cell = _ExcelReadCell($Excel, "B5") ; читаем значение ячейки в пятой строке второго столбца активного листа
  $Cell += 1                           ; увеличиваем на 1
  _ExcelWriteCell($Excel, $Cell, "B5") ; записываем новое значение в ячейку в пятой строке второго столбца активного листа
EndFunc
 
Автор
S

st_Tr

Новичок
Сообщения
4
Репутация
0
Спасибо, такой вариант вполне подходит.

Во время теста получается крашить autoit, но в реальных условиях вряд ли буду сталкиваться с такой ошибкой)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
st_Tr [?]
Во время теста получается крашить autoit
Конечно, если закрыть Excel и нажать Ctrl+I ;)
Код:
While 1
  Sleep(100) ; бесконечный цикл
  If ObjName($Excel) = "" Then Exit ; выход при закрытии Excel
WEnd
 
Автор
S

st_Tr

Новичок
Сообщения
4
Репутация
0
Ненене) Это происходит, например, при смене странички экселя и одновременном спаме хоткея.

Вот тут вот (кусок кода из файла Excel.au3)
Код:
Func _ExcelWriteCell($oExcel, $sValue, $sRangeOrRow, $iColumn = 1)
	If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
	If Not StringRegExp($sRangeOrRow, "[A-Z,a-z]", 0) Then
		If $sRangeOrRow < 1 Then Return SetError(2, 0, 0)
		If $iColumn < 1 Then Return SetError(2, 1, 0)
		$oExcel.Activesheet.Cells($sRangeOrRow, $iColumn).Value = $sValue
		Return 1
	Else
		$oExcel.Activesheet.Range($sRangeOrRow).Value = $sValue
		Return 1
	EndIf
EndFunc   ;==>_ExcelWriteCell


ругается на четвертую строку с конца.

Если же все делать спокойно и поочередно, то хоткеи нормально продолжают работать уже на новой странице.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
st_Tr [?]
при смене странички экселя и одновременном спаме хоткея
Во-первых, спамить нехорошо.
Во-вторых, в задании речь шла о неактивном окне.
В-третьих, ошибки можно отлавливать. Но это уже противоречит условию "в самом простом виде".
Код:
#include <Excel.au3> ; подключаем UDF для работы с Excel

HotKeySet("^i", "IncCell") ; устанавливаем горячую клавишу Ctrl+I на выполнение функции IncCell

$Err = ObjEvent("AutoIt.Error", "Error") ; обработчик ошибок
$ErrCount = 0 ; количество ошибок

$Path = "D:\Книга1.xls" ; путь к открытому файлу

$Excel = _ExcelBookAttach($Path) ; присоединяемся к открытой книге
If $Excel = 0 Then
  MsgBox(0, "Ошибка", "Объект Excel не создан. Работа скрипта будет завершена.")
  Exit
EndIf

While ObjName($Excel) <> "" ; ожидание закрытия Excel
  Sleep(100)
  Send("^i") ; <== спам :)
WEnd

Func IncCell()
  $Cell = _ExcelReadCell($Excel, "B5") ; читаем значение ячейки в пятой строке второго столбца активного листа
  $Cell += 1                           ; увеличиваем на 1
  _ExcelWriteCell($Excel, $Cell, "B5") ; записываем новое значение в ячейку в пятой строке второго столбца активного листа
EndFunc

Func Error()
  $ErrCount += 1 ; увеличиваем количество ошибок
  ConsoleWrite("обнаружено ошибок: " & $ErrCount & @CRLF) ; сообщаем об ошибке
EndFunc
 
Верх