Что нового

Вставка данных в неактивное окно.

PACHOM

Новичок
Сообщения
99
Репутация
0
Доброго вечера всем!

Есть скрипт, который вставляет данные из 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, 'Сообщение', 'Обработка завершена')


Спасибо.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Посмотри эту тему
http://autoit-script.ru/index.php/topic,3416.0.html
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
PACHOM,
А не проще записывать нужные данные в текстовый файл, например, по горячей клавише?
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
А не проще записывать нужные данные в текстовый файл, например, по горячей клавише?
Здравствуйте!

Речь идёт о Send? Я не совсем понял.
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
Блокнот я взял для примера. При записи использую имитацию клавиш - первая цифра (-ы) и вторая стрелка вниз или TAB. FileWrite добавляет строку текста в конец открытого ранее текстового файла. Я прошу прощения, но это наверное моя ошибка, поскольку добавлять данные нужно будет в поле программы, имеющего вид столбика Excel.


Добавлено:
Сообщение автоматически объединено:

Посмотри эту тему
Excel, перевод раздела UDFs3.chm "Excel Managment"(тест примеров/рецензирование)
Прошу прощения, а что там по моей теме? Если справка, то она у меня есть ... я в ней копаюсь но пока без результата :smile:
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
Да, я вчера поспешил с Блокнотом ...
Прикрепляю файлы новые.
Данные необходимо вносит в программу, открывающуюся в Internet Explorer: там есть столбик как в Excel, вот туда и вносим данные. Для имитации примера прилагаю файл под названием "Вставка.html" (открываем его только Internet Explorer).
В Excel есть два листа - на первом данные, которые нужно внести (это первый столбик), на втором настройка - уже сделанная (указываем Title и Class открываемого окна).

Сама задача по вносу данных в файл "Вставка.html" открытого в Internet Explorer в независимости от его активности (окно браузера) остаётся актуальной.

Спасибо.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
PACHOM,
Без проверок на ошибки пример.
Код:
#include <Excel.au3>
#include <IE.au3>

Global $sExcel = @ScriptDir & '\test.xls', $sIE = @ScriptDir & '\test.html', $iCount, $iEnd, $iStart

$oExcel = _ExcelBookOpen($sExcel);, 0)
If @error Then Exit 1
$oIE = _IECreate($sIE)
If @error Then Exit 2
$oInputs = _IETagNameGetCollection($oIE, 'input')
If @error Or Not @extended Then Exit 3
$iEnd = @extended - 1
For $i = 1 To 5
	$iStart = $oExcel.WorkSheets('Setting' ).Cells($i, 1).Value
	MsgBox(64, 'Info', 'Start Cell = ' & $iStart & @LF & 'Start Value = ' & $oExcel.WorkSheets('Base' ).Cells($iStart, 1).Value)
	$iCount = 0
	For $oInput In $oInputs
		_IEFormElementSetValue($oInput, $oExcel.WorkSheets('Base' ).Cells($iStart + $iCount, 1).Value)
		;ConsoleWrite($iStart & '->' & $oExcel.WorkSheets('Base' ).Cells($iStart + $iCount, 1).Value & @LF)
		$iCount += 1
		If $iCount > $iEnd Then ExitLoop
	Next
Next
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
Благодарю за науку - интересное решение.
Правда есть ошибка ... (см. прикреплённый файл).

Спасибо.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
PACHOM [?]
Правда есть ошибка ... (см. прикреплённый файл).
Оба файла из прикрепленного архива в папке со скриптом лежат?
вставить данные в форму, если там будет не один столбец, а 2, 3 и более? Как тогда выбрать нужный?
И если из всех столбцов можно вводить данные только в один, то он будет определён автоматически?
ИМХО, можно, но
Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.



Если вводить данные в IE, то не в этом разделе.
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
Вас понял. Убрал допвопрос.


Добавлено:
Сообщение автоматически объединено:

Оба файла из прикрепленного архива в папке со скриптом лежат?
Да. Оба файл открываются ... после чего и формируется ошибка.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
PACHOM
Код:
#include <IE.au3>

$oIE = _IECreate(@ScriptDir & '\test.html')
; test.html в папке со скриптом лежит
Это работает?
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
Оба файла открываются. Значит этот код работает. Верно?
Код:
#include <IE.au3>
$oIE = _IECreate(@ScriptDir & '\test.html')




Добавлено:
Сообщение автоматически объединено:

Работает на Win7 только с правами администратора при запуске скрипта.
 
Верх