Что нового

Записать значение из буфера обмена в ячейку Excel

Ed_Vard

Новичок
Сообщения
19
Репутация
0
Доброго времени суток уважаемые форумчане! Возник вопрос по написанию скрипта!
Сразу прошу не "пинать" ибо с написанием скриптов столкнулся только сейчас!
Суть пролемы: Есть таблица Excel в которую заношу значения в определенные ячейки по строкам вида A2-1111 | B2-2222 | C2-3333 D2-4444 | E2-нужно вставить данные. И есть специализированная программа - в окне которой вводяться значения в определенные поля и нажимаються кнопочки - предусмотрен тока ручной ввод :(. Надоело вводить все в ручную - вот и решил написать скрипт для чего и подготовил файл Excel.
вот текст скрипта:
Код:
#include <Excel.au3>


$oExcel = ObjGet("c:\Skripti\PriemSopr.xls", "Excel.Application")
$sReadCell = _ExcelReadCell($oExcel, "A2" )
_WinWaitActivate("Прием ########ти","")
ControlClick ("", "", "[CLASSNN:TEXTEDIT31]", "left", 1, 1, 1)
Send("{Delete 8}")
Send($sReadCell,1)
$sReadCell = _ExcelReadCell($oExcel, "C2" )
ControlClick ("", "", "[CLASSNN:TEXTEDIT32]", "left", 1, 1, 1)
Send("{Delete 8}")
Send($sReadCell,1)
ControlClick ("Прием ########ти", "Поиск", "[CLASSNN:OSBUTTON5]", "left", 2, 1, 1)
sleep(10000)
$sReadCell = _ExcelReadCell($oExcel, "D2" )
ControlClick ("", "", "[CLASSNN:TEXTEDIT34]", "left", 1, 1, 1)
Send($sReadCell,1)
ControlClick ("Прием ########ти", "Прием вед####", "[CLASSNN:OSBUTTON5]", "left", 2, 1, 1)
sleep(10000)
ControlClick ("", "", "[CLASSNN:TEXTEDIT4]", "left", 2, 1, 1)
Send("^{Ins}")
_ExcelWriteCell($oExcel, "E2")

Скрипт отрабатвает нормально до предполседнего действия .
Вопрос - как записать в закрытый файл Excel значение - скопированное в буфер обмена. Через буфер по тому - что по другому значение получить не получаеться.
И сразу второй вопрос - как сделать цикл.
Заранее спасибо за ответы!
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Где нужен цикл то? :smile:
Так запишет в цикле в столбец E с 1 по 10 строку значение из буфера
Код:
For $i = 1 To 10
	_ExcelWriteCell($oExcel, ClipGet(), 'E' & $i)
Next

Или можно сразу в диапазон писать:
Код:
_ExcelWriteCell($oExcel, ClipGet(), '(E1:E20)')
 
Автор
E

Ed_Vard

Новичок
Сообщения
19
Репутация
0
Огромное спасибо! Второе - именно то - что нужно!
Сейчас попробовал - немного не получилось
_ExcelWriteCell($oExcel, ClipGet(), 'E1')
Эта строка вставляет в ячейку при открытой книге Excel :( ! А есть возможноть записать в закрытый файл Excel? или такое в принципе не возможно?
А вот насчет цикла - цикл нужен - чтобы прошел опять весь код, но теперь чтоб данные брались из A3,B3,C3,D3 и вставлялись E3, затем из A4,B4,C4,D4 и вставлялись E4 и т.д. пока есть значения в столбце допустип A или указать в ручную - от A1 до до A20 например!
Иначе мне придеться делать вот так
Код:
#include <Excel.au3>


$oExcel = ObjGet("c:\Skripti\PriemSopr.xls", "Excel.Application")
$sReadCell = _ExcelReadCell($oExcel, "A2" )
_WinWaitActivate("Прием ##########","")
ControlClick ("", "", "[CLASSNN:TEXTEDIT31]", "left", 1, 1, 1)
Send("{Delete 8}")
Send($sReadCell,1)
$sReadCell = _ExcelReadCell($oExcel, "C2" )
ControlClick ("", "", "[CLASSNN:TEXTEDIT32]", "left", 1, 1, 1)
Send("{Delete 8}")
Send($sReadCell,1)
ControlClick ("Прием ##########", "Поиск", "[CLASSNN:OSBUTTON5]", "left", 2, 1, 1)
sleep(10000)
$sReadCell = _ExcelReadCell($oExcel, "D2" )
ControlClick ("", "", "[CLASSNN:TEXTEDIT34]", "left", 1, 1, 1)
Send($sReadCell,1)
ControlClick ("", "Прием", "[CLASSNN:OSBUTTON5]", "left", 1, 1, 1)
sleep(10000)
ControlClick ("", "", "[CLASSNN:TEXTEDIT4]", "left", 2, 1, 1)
Send("^{Ins}")
_ExcelWriteCell($oExcel, ClipGet(), 'E2')
sleep(5000)
ControlClick ("", "", "[CLASSNN:OSBUTTON6]", "left", 1, 1, 1)


$oExcel = ObjGet("c:\Skripti\PriemSopr.xls", "Excel.Application")
$sReadCell = _ExcelReadCell($oExcel, "A3" )
_WinWaitActivate("Прием ##########","")
ControlClick ("", "", "[CLASSNN:TEXTEDIT31]", "left", 1, 1, 1)
Send("{Delete 8}")
Send($sReadCell,1)
$sReadCell = _ExcelReadCell($oExcel, "C3" )
ControlClick ("", "", "[CLASSNN:TEXTEDIT32]", "left", 1, 1, 1)
Send("{Delete 8}")
Send($sReadCell,1)
ControlClick ("Прием ##########", "Поиск", "[CLASSNN:OSBUTTON5]", "left", 2, 1, 1)
sleep(10000)
$sReadCell = _ExcelReadCell($oExcel, "D3" )
ControlClick ("", "", "[CLASSNN:TEXTEDIT34]", "left", 1, 1, 1)
Send($sReadCell,1)
ControlClick ("", "Прием", "[CLASSNN:OSBUTTON5]", "left", 1, 1, 1)
sleep(10000)
ControlClick ("", "", "[CLASSNN:TEXTEDIT4]", "left", 2, 1, 1)
Send("^{Ins}")
_ExcelWriteCell($oExcel, ClipGet(), 'E3')
sleep(5000)
ControlClick ("", "", "[CLASSNN:OSBUTTON6]", "left", 1, 1, 1)

; ну и так далее, а хотелось бы этого избежать по возможности
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Эта строка вставляет в ячейку при открытой книге Excel
Можно так попробовать:
Код:
#include <Excel.au3>
$sFilePath1 = @ScriptDir & "\Test.xls" ;файл Test.xls должен находится в одной папке со скриптом
$oExcel = _ExcelBookOpen($sFilePath1, 0) ; второй параметр 0 - не показывать
If @error = 1 Then
    MsgBox(0, "Error!", "Unable to Create the Excel Object")
    Exit
ElseIf @error = 2 Then
    MsgBox(0, "Error!", "File does not exist - Shame on you!")
    Exit
EndIf
_ExcelWriteCell($oExcel, "test", '(E1:E20)')
_ExcelBookSave($oExcel)
_ExcelBookClose($oExcel)
MsgBox(64, "Запись", "Готово")
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Это просто пример. Демонстрирует цикл чтения из ячеек, запись.
Демонстрация на Блокноте.
Для наглядности надо в Test.xls заполнить ячейки A1:A5, B1:B5, C1:C5, D1:D5
значениями.
Код:
#include <Excel.au3>
Run("notepad.exe")
WinWaitActive("[Class:Notepad]")

Dim $avArray[6] ;объявляем массив из 6 индексов (от 0 по 5)
$avArray[1] = "A"
$avArray[2] = "B"
$avArray[3] = "C"
$avArray[4] = "D"
$avArray[5] = "E"

$max = UBound( $avArray) ;узнаем количество элементов массива
$NummberStr = 5 ; сколько строк будем обрабатывать (т.е. 5 - это А1 - А5). Можно другое целое число прописать.

$sFilePath1 = @ScriptDir & "\Test.xls" ;файл Test.xls должен находится в одной папке со скриптом
$oExcel = _ExcelBookOpen($sFilePath1, 0) ; второй параметр 0 - не показывать

If @error = 1 Then
    MsgBox(0, "Error!", "Unable to Create the Excel Object")
    Exit
ElseIf @error = 2 Then
    MsgBox(0, "Error!", "File does not exist - Shame on you!")
    Exit
EndIf

$ReadCell = ""
For $x = 1 To $NummberStr ;от 1-ой по 5-ую строку ($NummberStr = 5)	
	For $y = 1 To $max-2 ; от А по D читаем ячейки (А1, B1, C1, D1, A2, B2 ... D5 (всего 6 индексов массива - от 0 по 5. Отнимаем нулевой и последний "D" индекс, т.е. 2 шт. отнимаем)
		$ReadCell = _ExcelReadCell($oExcel, $avArray[$y]&$x)		
		GuiSend($ReadCell, $x, $y) ;вызов функции GuiSend с передачей значений переменных		
	Next
ControlSend("[Class:Notepad]", "", "Edit1", " ИТОГ В БУФЕР ДЛЯ ЯЧЕЙКИ "& $avArray[$max-1]&$x&" |"&@CRLF)
_ExcelWriteCell($oExcel, "значение из буфера по строке "&$x, $avArray[5]&$x)
Next

Func GuiSend($ReadCell, $x, $y)	
ControlSend("[Class:Notepad]", "", "Edit1", $ReadCell&" >> ")
ControlSend("[Class:Notepad]", "", "Edit1", "Send " & $avArray[$y]&$x & " | "&@CRLF)
EndFunc

_ExcelBookSave($oExcel); сохранить xls
Sleep(500)
_ExcelBookClose($oExcel) ; закрыть xls
Sleep(500)
MsgBox(64, "Запись", "Готово")
 
Автор
E

Ed_Vard

Новичок
Сообщения
19
Репутация
0
HelpMe сказал(а):
дата клерк чтоли?
Что это есть?
Yuriy сказал(а):
Демонстрация на Блокноте.
Спасибо! Т.е. вместо блокнота я могу использовать книгу Excel для чтения значений и запись в неё? А как массив вставляеться в в поле ввода? я имею ввиду - как береться - какое то сначение - или все целиком?
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Блокнот в этом примере вместо той спец. программы, которой у меня нет и проверить правильность работы нет.
И есть специализированная программа - в окне которой вводятся значения в определенные поля
В примере читаются/записываются значения ячеек в таком порядке:
Читаем - A1, B1, C1, D1. Пишем - в E1
Читаем - A2, B2, C2, D2. Пишем - в E2
.................................................
Читаем - A20, B20, C20, D20. Пишем - в E20
Возможно сыроват пример.
 
Автор
E

Ed_Vard

Новичок
Сообщения
19
Репутация
0
Yuriy сказал(а):
Возможно сыроват пример.
Большое спасибо за помощь - но наверно я силь туп :( - никак не могу вехать! можно взять немного попроще для меня?
вот код - который мне нужен в данный момент:
Код:
Opt("WinWaitDelay",100)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
Opt("SendKeyDelay", 100)
#include <Excel.au3>

; 1. указываю откуда беру данные
$oExcel = ObjGet("c:\Skripti\FormirAkt.XLS", "Excel.Application")
$sReadCell = _ExcelReadCell($oExcel, "B3" )
; 2. окно программы - куда нужно внести прочтенное значение из ОДНОЙ ячейки. Начиная отсюда нужно воспроизвести цикл - подставляя значения из столбца "В"
_WinWaitActivate("Установка параметров формирования","")
ControlClick ("Установка параметров формирования", "Выбрать", "[CLASSNN:OSBUTTON1]", "left", 1, 1, 1)
_WinWaitActivate("Выбор: один или список","")
ControlClick ("Выбор: один или список", "", "[CLASSNN:TEXTEDIT2]", "left", 1, 1, 1)
sleep(1000)
; 3. значение - которое прочитал - вставляю. 
Send($sReadCell,1)
sleep(500)
Send("{TAB}")
sleep(1000)
ControlClick ("Выбор: один или список", "Обработка", "[CLASSNN:OSBUTTON4]", "left", 1, 1, 1)
sleep(5000)
ControlClick ("Установка параметров формирования", "Создать", "[CLASSNN:OSBUTTON4]", "left", 1, 1, 1)
sleep(5000)
ControlClick ("", "", "[CLASSNN:COMPOSITE4]", "left", 1, 274, 164)
sleep(5000)
ControlClick ("", "", "[CLASSNN:OSBUTTON2]", "left", 1, 1, 1)
sleep(5000)
ControlClick ("Просмотр базы", "Принять", "[CLASSNN:OSBUTTON3]", "left", 1, 1, 1)
sleep(4000)
If WinExists ("Информация!", "") Then
	WinActivate ("Информация!", "")
	sleep(1000)
	Send("{ENTER}")
EndIf
if WinExists ("Ошибка!","") Then
	WinActivate ("Ошибка!","")
	sleep(1000)
	Send("{ENTER}")
ControlClick ("Просмотр базы", "Принять", "[CLASSNN:OSBUTTON3]", "left", 1, 1, 1)
EndIf
sleep(2000)
if WinExists ("Ошибка!","") Then
	WinActivate ("Ошибка!","")
	sleep(1000)
	Send("{ENTER}")
EndIf
sleep(3000)
ControlClick ("Просмотр базы", "Выход", "[CLASSNN:OSBUTTON6]", "left", 1, 1, 1)
sleep(3000)
ControlClick ("", "", "[CLASSNN:OSBUTTON4]", "left", 1, 1, 1)

В этом скрипте нужно брать значения только из столбца "В" листа Excel. Этих значений допустим 50. В 1 позиции я указываю конкретную ячейку. А мне нужно - считать-вставить ячейку В1 - отработать скрипт, затем считать-вставить ячейку В2 - отработать скрипт и т.д. до В52
И как можно организовать цикл для выполнения скрипта от 2 позиции до конца с последовательной подстановкой значений?
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Пусть спец. программа будет:
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Спец. программа", 391, 162, 192, 114)
$Input1 = GUICtrlCreateInput("Test", 16, 32, 361, 21)
$Button1 = GUICtrlCreateButton("Выполнить", 104, 120, 169, 25)
$Input2 = GUICtrlCreateInput("", 16, 88, 361, 21)
$Label1 = GUICtrlCreateLabel("Считанные данные из ячейки B:", 16, 8, 170, 17)
$Label2 = GUICtrlCreateLabel("Итог для записи в ячейку C:", 16, 64, 170, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit		
		Case $Button1
			$var = GUICtrlRead($Input1)			
			GUICtrlSetData($Input2, $var & " плюс какое-то значение")
	EndSwitch
WEnd

Скомпилируй ее в Proga.exe
Пусть файл xls будет Test.xls
Пример скрипта:
Код:
#include <Excel.au3>
Run(@ScriptDir & "\Proga.exe")
WinWaitActive("Спец. программа")

Dim $avArray[2] ;объявляем массив из 2 индексов (от 0 по 1)
$avArray[0] = "B"
$avArray[1] = "C"

$NummberStr = 50 ; сколько строк будем обрабатывать (т.е. 50 - это B1 - B50). Можно другое целое число прописать.

$sFilePath1 = @ScriptDir & "\Test.xls" ;файл Test.xls должен находиться в одной папке со скриптом
$oExcel = _ExcelBookOpen($sFilePath1, 0) ; второй параметр 0 - не показывать

If @error = 1 Then
    MsgBox(0, "Error!", "Unable to Create the Excel Object")
    Exit
ElseIf @error = 2 Then
    MsgBox(0, "Error!", "File does not exist - Shame on you!")
    Exit
EndIf

$ReadCell = ""
For $x = 1 To $NummberStr ;от 1-ой по 50-ую строку читаем значения ячейки В ($NummberStr = 50)
	$ReadCell = _ExcelReadCell($oExcel, $avArray[0]&$x) ; прочитать значение ячейки В
	SendWrite($ReadCell, $x) ;вызвать функцию SendWrite
Next

Func SendWrite($ReadCell, $x)	
	ControlSetText("Спец. программа", "", "Edit1", $ReadCell) ;записать значение ячейки в верхнее поле ввода Спец. программы
	Sleep(100)
	ControlClick("Спец. программа", "", "Button1") ; нажать на кнопку "Выполнить" Спец. программы
	Sleep(100)
	$GuiRead = ControlGetText("Спец. программа", "", "Edit2") ;взять значение из нижнего поля ввода Спец. программы
	Sleep(100)	
	_ExcelWriteCell($oExcel, $GuiRead, $avArray[1]&$x) ; записать в ячейку С значение из нижнего поля ввода Спец. программы
	ControlSetText("Спец. программа", "", "Edit1", "" ) ; очистить содержимое верхнего поля ввода Спец. программы
	Sleep(100)
EndFunc

WinClose("Спец. программа", "")
_ExcelBookSave($oExcel); сохранить xls
Sleep(500)
_ExcelBookClose($oExcel) ; закрыть xls
Sleep(500)
MsgBox(64, "Запись", "Готово")

Теперь сложи все в одну папку (скрипт, Proga.exe, Test.xls)
В файле Test.xls заполни ячейки B1:B50 значениями для наглядности
Запусти скрипт теперь.
 
Автор
E

Ed_Vard

Новичок
Сообщения
19
Репутация
0
Yuriy сказал(а):
Запусти скрипт теперь.
Большое, просто оромное спасибо за помощь! Немного разобрался! Взял пока что только часть кода для обработки и переделал под себя! Часть - которая за запись отвечает - пока не трогал - ибо в примере идет копирование - число из верхнего поля+какое-то значение :smile: - надо осмвслить мне! А если записывать в открытую книгу Excel - код будет не проще?
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Что-то я в тупик зашел.
Если надо просто из ячейки B1 скопировать (пусть даже с преобразованием значения) в ячейку С1,
из B2 - в C2, из B3 в С3 и т.д., то это гораздо проще, чем через "Спец. программу".
ибо в примере идет копирование - число из верхнего поля+какое-то значение
Копирование в ячейку C идет из нижнего поля ввода.
Просто запусти и протестируй "Proga.exe", введи в верхнее поле любое значение и нажми "Выполнить". Я просто для примера сделал.
 
Автор
E

Ed_Vard

Новичок
Сообщения
19
Репутация
0
Yuriy сказал(а):
Что-то я в тупик зашел.
Если надо просто из ячейки B1 скопировать (пусть даже с преобразованием значения) в ячейку С1,
из B2 - в C2, из B3 в С3 и т.д., то это гораздо проще, чем через "Спец. программу".
нет - прошу прощения - может я как то неправильно объяснил - извиняюсь за это!
Есть таблица Excel - в ней есть столбец В, в каждой ячейке этого столбца есть значение - вот это значение мне нужно передать окну программы в определенное поле для выполнения действий - причем программа понимает только ввод с клавиатуры, никакая вставка не проходит! А в этом окне есть другое поле - в котором после обработки появляться определенные цифры - оно не доступно для редактирования и ввода туда данных но цифры в нем можно выделить двойным щелчком - вот как раз эти цифры нужно скопировать из окна программы и вставить в ячейку Excel - напротив того значения - которое передовалось в окно - и так по строкам! Считать Excel-вставить окно программы-обработать-получить число-скопировать-вставить в Excel - вот как то так! Извиняюсь - если опять не понятно :-[
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Есть таблица Excel - в ней есть столбец В, в каждой ячейке этого столбца есть значение - вот это значение мне нужно передать окну программы в определенное поле для выполнения действий - причем программа понимает только ввод с клавиатуры, никакая вставка не проходит! А в этом окне есть другое поле - в котором после обработки появляться определенные цифры - оно не доступно для редактирования и ввода туда данных но цифры в нем можно выделить двойным щелчком - вот как раз эти цифры нужно скопировать из окна программы и вставить в ячейку Excel - напротив того значения - которое передовалось в окно - и так по строкам! Считать Excel-вставить окно программы-обработать-получить число-скопировать-вставить в Excel
Вот именно. Этот функционал мой пример демонстрирует.
программа понимает только ввод с клавиатуры, никакая вставка не проходит!
Для того он пример и был, что бы сориентировать тебя.
Или дай свою Спец. программу мне (хоть в ЛС) или ... Ну, сделай так (объясни подробно), что бы можно было эту
Спец. программу приблизительно написать и на ее основе создать более понятный скрипт.
в примере идет копирование - число из верхнего поля+какое-то значение
Это просто пример. Я мог, например, с этим числом из верхнего поля сделать другое, но просто взял и "приклеил"
к этому числу строку "какое-то значение".
 
Автор
E

Ed_Vard

Новичок
Сообщения
19
Репутация
0
Yuriy сказал(а):
Или дай свою Спец. программу мне (хоть в ЛС) или ... Ну, сделай так (объясни подробно), что бы можно было эту
Отправил сообщение в ЛС
 
Автор
E

Ed_Vard

Новичок
Сообщения
19
Репутация
0
огромное спасибо Yuriy за решение и помощь! Тема решена, репутация поднята!
 
Верх