1

Тема: AHK в Эксель

Подскажите, есть простой скрипт копирования из экселя в другую программу построчно (так  надо):

For i, cellname In ["A1","A2"]  
{
	WinActivate, Программа
	Sleep, 333
	SendRaw, Команда
	Sleep, 300
	Send, {Enter}
	Sleep, 300
	clipboard =
	Path = %A_ScriptDir%\numbers.xlsx  
	Xl := ComObjCreate("Excel.Application")
	Xl.Workbooks.Open(Path)
	Xl.Range(cellname).Copy 
	Xl.Quit()
	Sleep, 300
	WinActivate, Программа
	Sleep, 333
	Send, ^v
	Send, {Enter}
}

Скрипт работает как надо, но не могу найти, как заменить кусок

cellname In ["A1","A2"]

если у меня ячеек больше (т.е не прописывая руками A3, A4 и т.д?

2 (изменено: teadrinker, 2020-12-04 04:36:01)

Re: AHK в Эксель

Не очень понятно, что вы имеете в виду под "построчно", и что именно вы хотите скопировать. Какой-то диапазон ячеек? Какой именно?
Каждый раз не нужно заново создавать объект Excel.Application, нужно создать один раз в начале до цикла, потом выйти в после цикла.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK в Эксель

Ну, в этом примере скрипт сделает следующее:
1. Сделает активным окно "программы"
2. Отправит "комманду"
3. Откроет файл экселя
4. Скопирует ячейку A1
5. Вернется в "программу"
6. Вставит и отправит данные

После этого повторить, но в пункте 4 будет уже А2.
Необходимо продолжить цикл до условно A8000 например. Если я ставлю A1:A8000, то он копирует весь столбец.
Извиняюсь за возможно нубский вопрос.

4

Re: AHK в Эксель

Так а вопрос в чём, как скопировать от А1 до определённого номера, или как скопировать до последней заполненной ячейки?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK в Эксель

Netriver


    Path = %A_ScriptDir%\numbers.xlsx  
	Xl := ComObjCreate("Excel.Application")
	book := Xl.Workbooks.Open(Path)
    Xl.Visible := false
    xl.screenUpdating := 0

	loop % book.workSheets(1).Cells.(book.workSheets(1).Rows.Count, "A").End(xlUp := -4162).Row
	{
	  book.workSheets(1).cells(A_index,1).Copy 

       WinActivate, Программа
       .....
       Send, ^v
       ......

      step++
	}
	
    xl.screenUpdating := 1
	MsgBox, 262144, , Скопировано %step% строк!
	book.close(false)
	xl.quit
	ExitApp

6

Re: AHK в Эксель

inseption86
А Visible и screenUpdating что дают?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: inseption86, 2020-12-04 12:26:25)

Re: AHK в Эксель

teadrinker
xl.Visible - скрытый режим
xl.screenUpdating - для ускорения кода  отключение обновления экрана

Или может необязательно сразу два использовать?

8

Re: AHK в Эксель

Visible — он по умолчанию false, так что здесь указывать не нужно. screenUpdating, как я понимаю, поможет, только если мы вводим какие-то данные в таблицу, мы здесь только читаем, так что тоже не нужно. book.close(false) — тоже лишнее, закроется автоматически, мы ведь ничего не меняли.
Send, ^v скорее всего не нужно, можно просто использовать SendInput. Или даже сначала собрать весь текст в переменную, и вставить всё за один раз. Поэтому я бы подождал сперва ответов ТС.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK в Эксель

teadrinker
ну скрипт разовый, думаю достаточно до определенной ячейки. Просто понять как это лучше сделать.

10 (изменено: teadrinker, 2020-12-05 01:20:32)

Re: AHK в Эксель

Попробуйте так:

filePath = %A_ScriptDir%\numbers.xlsx

Xl := ComObjCreate("Excel.Application")
Book := Xl.Workbooks.Open(filePath)

XlSht := Xl.ActiveSheet
Cells := XlSht.Cells

; это номер последней заполненной ячейки в колонке A
lastCellNum := Cells.(XlSht.Rows.Count, "A").End(xlUp := -4162).Row
; если нужен другой номер, можно написать
; lastCellNum := 50 ; где вместо 50 нужный номер

CellsArray := []
Loop % lastCellNum
   CellsArray.Push( XlSht.Range("A" . A_Index).text )
Xl.Quit()

WinActivate, Программа
for k, v in CellsArray
   SendInput, {Text}Команда`n%v%`n

Если так будет слишком быстро, разбавьте посыл слипами.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder