Что нового

[Автоматизация] Потоковое получение данных из Excel и работа с буфером обмена.

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
valdur2000 [?]
описал три координаты, а он кликает только на первые две
Это исправил.
Я думал, что у Вас таблица, тогда можно было бы так:
Код:
$iCoord_X = 50 ;начальная координата X
$iCoord_Y = 60 ;начальная координата Y
$iStep_X = 55 ;шаг по оси X
$iStep_Y = 25;шаг по оси Y
$iX = $iCoord_X - $iStep_X
$iY = $iCoord_Y - $iStep_Y

Dim $a_ReturnArray[44][11] = [[43, 10]]
For $i = 1 To $a_ReturnArray[0][0]
	For $j = 1 To $a_ReturnArray[0][1]
		$a_ReturnArray[$i][$j] = $i * $j
	Next
Next
; например, на странице 20 строк и 10 колонок
For $i = 1 To $a_ReturnArray[0][0]
	$iY += $iStep_Y
	$iX = $iCoord_X - $iStep_X
	For $j = 1 To $a_ReturnArray[0][1]
		$iX += $iStep_X
		ConsoleWrite('Table ' & $i & 'x' & $j & ' --- ' & $iX & 'x' & $iY & ' -- ' & $a_ReturnArray[$i][$j] & @CR)
		MouseMove($iX, $iY, 5)
		;MouseClick("left", $iX, $iY, 1, 0)
		;Sleep(500)
		;Send($a_ReturnArray[$i][$j])
		;Sleep(1000)
	Next
	If Not Mod($i, 20) Then ;каждая 20-ая строка
		$iY = $iCoord_Y - $iStep_Y
		;здесь, например, нажимаете на кнопку перехода на следующую страницу
		ConsoleWrite('Страница готова' & @CR)
	EndIf
Next

Может, как-то так?
Код:
Dim $aCoord[4][2] = [[3],[222, 333],[111, 212],[444, 222]]; и т.д.
$q = 0
For $i = 1 To $a_ReturnArray[0][0]
	For $j = 1 To $a_ReturnArray[0][1]
		If $q = $aCoord[0][0] Then $q = 0
		$q += 1
		If $j = 5 Then ;пример
			MsgBox(64, 'Info', 'Pause')
			;делаете здесь что Вам надо
		EndIf
		MouseClick("left", $aCoord[$q][0], $aCoord[$q][1], 1, 0)
		Sleep(200)
		For $w = 1 To 10
			Send($a_ReturnArray[$i][$j])
			Sleep(500)
			$aTemp = PixelSearch(;Здесь Ваши данные)
			If Not @error Then ExitLoop
		Next
		If @error Then
			MsgBox(16, 'Error', 'Error')
			Exit
		EndIf
	Next
	MsgBox(64, 'Info', 'Pause')
	;делаете здесь что Вам надо
Next
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
Код с тремя данными, одним mouseclick и одним Pixelsearch работает без ошибок.Спасибо. Теперь надо его применить ко всем движениям.. Извините,но я не совсем разобрался, что для чего... Я напишу, что понял, а вы поправьте пожалуйста:
Код:
Dim $aCoord[4][2] = [[3],[222, 333],[111, 212],[444, 222]]
тут создается $aCoord которая хранит набор координат и их очередность. цифра 3 после равно, насколько я понял это кол-во координат или $q, если я опишу их 10, то там будет стоять цифра 10. А как обратиться например к координате 6 ($q=6)? А что такое [4][2]?
$i это наверное х в aCoord, a $j это y?

Код:
 If $j = 5
Непонятно исключение. Это движение номер пять или координата номер 5?

Код:
MouseClick("left", $aCoord[$q][0], $aCoord[$q][1], 1, 0)
тут как я понял привязка mouseclick к очередному движению, а как же все же описать, что по клику 5 будет не вставка данных, а просто клик с ожиданием pixelsearch?

Код:
For $w = 1 To 10
И что такое $w я тоже к сож не понял... не адаптировать под конкретные нужды, не разобравшись..

В двух местах вы пишете, ;здесь делаете то, что вам надо. Но почему этих мест два и что делается вверху, а что внизу тоже не понятно. Извините за столько вопросов..
 

madmasles

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

;Создаем 2-х мерный массив, в котором 44 строки и 11 колонок (по образцу того массива,
;который возвращает функция _ExcelReadSheetToArray()
Dim $a_ReturnArray[44][11] = [[43, 10]]
;В ячейке $a_ReturnArray[0][0] - кол-во используемых строк (43)
;В ячейке $a_ReturnArray[0][1] - кол-во используемых колонок (10)
;Заполняем массив (произвольными данными)
;($i - номера строк, $j - колонок массива $a_ReturnArray)
For $i = 1 To $a_ReturnArray[0][0]
	For $j = 1 To $a_ReturnArray[0][1]
		$a_ReturnArray[$i][$j] = $i * $j
	Next
Next
;Смотрим, что получили
_ArrayDisplay($a_ReturnArray)
;Или так смотрим (долго):
;($i - номера строк, $j - колонок массива $a_ReturnArray)
For $i = 1 To $a_ReturnArray[0][0]
	;по очереди перебираем строки
	For $j = 1 To $a_ReturnArray[0][1]
		;перебираем колонки для выбранной строки
		MsgBox(64, 'Info', 'Строка: ' & $i & ', колонка: ' & $j & @LF & 'Значение: ' & $a_ReturnArray[$i][$j])
	Next
Next
;теперь создаем массив с координатами для кликов
Dim $aCoord[4][2] = [[3],[222, 333],[111, 212],[444, 222]]
;В ячейке $aCoord[0][0] - кол-во используемых строк (3) у Вас их должно быть больше
;$aCoord[1-n][0] - координата Y
;$aCoord[1-n][1] - координата Y
;в этом массиве должны быть координаты для всех кликов и в нужной Вам последовательности
;Смотрим
_ArrayDisplay($aCoord)

$q = 0 ;задаем счетчик для массива $aCoord
;Перебираем все вышеизложенное ($i - номера строк, $j - колонок массива $a_ReturnArray)
For $i = 1 To $a_ReturnArray[0][0]
	For $j = 1 To $a_ReturnArray[0][1]
		;с каждым шагом счетчик $q увеличивается на 1 ($q += 1)
		;Если он дошел до конца массива $aCoord, то обнуляем его
		If $q = $aCoord[0][0] Then $q = 0
		$q += 1
		If $j = 5 Then ;для примера. Если дошли до 5-ой колонки в каждой строке
			MsgBox(64, 'Info', 'Pause')
			;делаете здесь что Вам надо
			;куда-нибудь кликаете, что-нибудь проверяете...
		EndIf
		;кликаем по координатам
		MouseClick("left", $aCoord[$q][0], $aCoord[$q][1], 1, 0)
		Sleep(200)
		For $w = 1 To 10
			;в цикле 10 раз отправляем значение ячейки массива ($w - это просто счетчик циклов)
			;может быть Send() надо использовать не в цикле, а до него, не знаю. 
			Send($a_ReturnArray[$i][$j])
			;ищем черный (или другой) цвет
			;Здесь придется делать еще один массив с данными прямоугольников где искать
			$aTemp = PixelSearch(;Здесь Ваши данные)
			;если нашли нужный цвет выходим из этого цикла
			If Not @error Then ExitLoop
			Sleep(500)
		Next
		;если за десять раз не нашли нужный цвет, значит не судьба, выходим.
		If @error Then
			MsgBox(16, 'Error', 'Error')
			Exit
		EndIf
	Next
	MsgBox(64, 'Info', 'Pause')
	;для примера. Здесь прошли полностью очередную строку
	;можно что-нибудь сделать (если надо)
Next
 
Верх