Доброго вечера всем!
Есть скрипт, который вставляет данные из Excel в документ (в моём примере это Блокнот). Во время вставки окно должно быть активным, иначе пропускаются вставляемые данные. Очень часть нужно что-то ещё сделать, но выделить другое окно нельзя.
Вопрос.
Как сделать вставку в окно без привязки к его активности? Может можно как-то управлять модальностью выбранного окна?
Скрипт.
Спасибо.
Есть скрипт, который вставляет данные из Excel в документ (в моём примере это Блокнот). Во время вставки окно должно быть активным, иначе пропускаются вставляемые данные. Очень часть нужно что-то ещё сделать, но выделить другое окно нельзя.
Вопрос.
Как сделать вставку в окно без привязки к его активности? Может можно как-то управлять модальностью выбранного окна?
Скрипт.
Код:
#include <Date.au3>
#include <GUIConstants.au3>
#include <ExcelCOM_UDF.au3>
#include <Array.au3>
Opt("WinTitleMatchMode", 4)
Global $Paused
HotKeySet("{ESC}", "Terminate")
Func Terminate()
Exit 0
EndFunc
$sFilePath = @ScriptDir & "\База.xls" ;Существующая рабочая книга Excel
$oExcel = _ExcelBookOpen($sFilePath)
If @error = 1 Then
MsgBox(16+4096, "Ошибка!", "Ошибка OLE\COM")
Exit
ElseIf @error = 2 Then
MsgBox(16+4096, "Ошибка!", "Файл Excel не существует или имеет неправильный формат!")
Exit
EndIf
$sCellMin = $oExcel.WorkSheets("Настройка").Cells(1, 2).Value ;с какой ячейки начинаем цикл ; лист не обязательно активный, координаты ячеек
$sCellMax = $oExcel.WorkSheets("Настройка").Cells(2, 2).Value ;максимальное кол-во данных, которое нужно обработать ; лист не обязательно активный, координаты ячеек
$sCellSleep = $oExcel.WorkSheets("Настройка").Cells(3, 2).Value ;время приостановки скрипта при вводе данных ; лист не обязательно активный, координаты ячеек
$sCellStep = $oExcel.WorkSheets("Настройка").Cells(4, 2).Value ;способ перехода к следующей ячейке ; лист не обязательно активный, координаты ячеек
;даные для функции ControlSend
$sCellTitle = $oExcel.WorkSheets("Настройка").Cells(2, 7).Value ;Заголовок окна
$sCellText = $oExcel.WorkSheets("Настройка").Cells(3, 7).Value ;Текс в окне
$sCellClass = $oExcel.WorkSheets("Настройка").Cells(4, 7).Value ;Класс окна
$sCellControlID_Class = $oExcel.WorkSheets("Настройка").Cells(2, 10).Value ;Класс элемента в окне
_ExcelSheetActivate($oExcel, "Данные") ;активируем лист содержащий данные
$aArray1 = _ExcelReadArray($oExcel, $sCellMin, 1, $sCellMax-1, 1) ;Этот метод при указанных параметрах, получает значения 5 ячеек в массив смещаясь вертикально(вниз) относительно целевых координат: строка=1,столбец=1
If @error Then
_ExcelBookClose($o_Excel)
MsgBox(16, 'Error', @error)
Exit
EndIf
;~ _ArrayDisplay($aArray1, "$aArray1...") ; Отображаем значения массива в окне сообщений
;Ожидание 2 секунд до появление окна
$hWnd = WinWait("[TITLE:" & $sCellTitle & "; CLASS:" & $sCellClass & "]", "", 2)
If Not $hWnd Then
MsgBox(16+4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта.')
_ExcelBookClose($oExcel, 0, 1) ;Этот метод при указанных параметрах закрывает рабочую книгу, если в ней были сделаны изменения - вызывается стандартный запрос Excel на сохранение изменений
Exit
EndIf
WinActivate($hWnd) ;заход в окно програмы
For $i In $aArray1 ;пробег по солбцу
ControlSend($hWnd, $sCellText, $sCellControlID_Class, $i) ;вставить прочтенное из эксель
Sleep($sCellSleep) ;Приостановка скрипта на 1 секунду (если ставим 1000)
ControlSend($hWnd, $sCellText, $sCellControlID_Class, "{" & $sCellStep & "}") ;переходим к следующему полю в форме
Sleep($sCellSleep) ;Приостановка скрипта на 1 секунду (если ставим 1000)
next
_ExcelBookSave($oExcel) ;это метод при текущих параметрах сохраняет рабочую книгу без каких либо запросов Excel
_ExcelBookClose($oExcel, 1, 0) ;Этот метод при указанных параметрах закрывает рабочую книгу, сохраняет изменения без каких либо запросов Excel
MsgBox(64+4096, 'Сообщение', 'Обработка завершена')
Спасибо.