Скопировать цифры после определенного слова из буфера обмена и вставить их в exel таблицу.

Помощь в написании скриптов
Andrei48
Posts: 2
Joined: 14 May 2022, 18:17

Скопировать цифры после определенного слова из буфера обмена и вставить их в exel таблицу.

Post by Andrei48 » 14 May 2022, 18:39

Здравствуйте, имеется код который из браузера копирует в буфер обмена меняющиеся текст, а именно: "Всего: 5066; Сумма: 17559327.28; Выбрано: 0; Отфильтровано: 27; Сумма: 60486.51;" Из этого текста мне нужно скопировать цифру (она может быть однозначной, двухначной или трехзначной) после слова "Отфильтровано:" и вставить её в определенную ячейку таблицы в Exel, помогите пожалуйста с кодом.
Вот мой код:

Code: Select all

[#MaxThreadsPerHotkey 2
SetTitleMatchMode, 2
F3::
Toggle := !Toggle
    If not Toggle
    WinGetActiveTitle, Title	
	WinActivate, Журнал - Талоны - Iron ; (Активирует окно "ОМС")	
    MouseClick, left, 866, 174 ; (Нажали только свои)	
	Sleep, 200 
	MouseClick, left, 1130, 185 ; (Нажали поиск)	
	Sleep, 5000 	
	MouseClickDrag, left, 30, 1020, 440, 1020, speed = 30 ; (Прокрутка вправо)	
    Sleep, 200 
	MouseClick, left, 1600, 440, ; (Нажали поиск подразделения)	
	Sleep, 200 
	SendInput, Поликлиника, Невского 25 ; (Вели поликлиника Невского, 25)	
	Sleep, 200
	MouseClickDrag, left, 440, 1020, 290, 1020, speed = 30 ; (Прокрутка влево)	
	Sleep, 200 
	MouseClick, left, 190, 440, ; (Нажали цель талона)	
	Sleep, 200
	SendInput, ДВ4 ; (Вели Диспансеризация I этап)
	Sleep, 200
	MouseClick, left, 1500, 440 ; (Нажали ФИО Врача)	
	Sleep, 200
	SendInput, Чернышева Виктория Владимировна ; (Вели Чернышева Виктория Владимировна)	
	Sleep, 200 
	MouseClickDrag, left, 15, 1035, 630, 1035, speed = 30 ; (Выделение результатов)	
	Sleep, 200
	Send, ^{vk43} ; (Скопировали текст)	
	WinActivate, Отчет по талонам.xlsx - Excel ; Активирует окно "Ексель"

mcl
Posts: 355
Joined: 04 May 2018, 16:35

Re: Скопировать цифры после определенного слова из буфера обмена и вставить их в exel таблицу.

Post by mcl » 15 May 2022, 11:27

Если текст всегда в таком формате, то можно или разбить строку на части и выцепить необходимую:

Code: Select all

sourceStr := "Всего: 5066; Сумма: 17559327.28; Выбрано: 0; Отфильтровано: 27; Сумма: 60486.51;"

strParts := StrSplit(sourceStr, [": ", "; "])  ; Разбиваем строку на части по двоеточиям и точкам с запятым

For index, strPart In strParts {               ; Проходимся по всем частям строки
	If (strPart == "Отфильтровано") {          ; Если текущая часть - слово "Отфильтровано",
		resultStr := strParts[index+1]         ; то следующая за ней часть строки - искомое число.
		Break                                  ; Сохраняем это число в переменную и выходим из цикла
	}
}

MsgBox % resultStr
...или воспользоваться регулярными выражениями:

Code: Select all

sourceStr := "Всего: 5066; Сумма: 17559327.28; Выбрано: 0; Отфильтровано: 27; Сумма: 60486.51;"

; RegexMatch ищет часть строки, соответствующую шаблону, в данном случае:
; текст 'Отфильтровано: ', после которого идут цифры или точки.
; Элемент \K отбрасывает из результата найденное перед ним, т. е. текст 'Отфильтровано: '
RegexMatch(sourceStr, "Отфильтровано: \K([\d\.]+)", resultStr)

MsgBox % resultStr

Для работы с Excel, на мой взгляд, удобнее всего использовать COM:

Code: Select all

; Обратите внимание: если Excel не запущен или находится в режиме редактирования, скрипт выдаст ошибку.
; Чтобы этого не произошло, код работы с Excel обёрнут в блок Try.
Try {
	xlApp := ComObjActive("Excel.Application")
	xlApp.Range("G15") := "<ВАШ ТЕКСТ>"
	xlApp := ""
}
...но можно и просто имитировать ввод текста:

Code: Select all

WinActivate, ahk_exe Excel.exe

; Обратите внимание: если Excel находится в режиме редактирования, он не среагирует на горячую клавишу.
Send ^g  ; Ctrl+G - переход к ячейке по адресу

WinWaitActive, Переход,, 1
If (ErrorLevel == 1)  ; Окно перехода так и не появилось
	Return

Send G15{Enter}  ; адрес ячейки
Sleep 200
Send <ВАШ ТЕКСТ>{Enter}
github://oGDIp - GDI+ wrapper for AHK v1.1

Andrei48
Posts: 2
Joined: 14 May 2022, 18:17

Re: Скопировать цифры после определенного слова из буфера обмена и вставить их в exel таблицу.

Post by Andrei48 » 18 May 2022, 09:37

Мне к сожалению так и не понятно, как я могу связать буфер обмена (где скопированный текст Всего: 5066; Сумма: 17559327.28; Выбрано: 0; Отфильтровано: 27; Сумма: 60486.51;) с параметром sourceStr, что бы автохоткей через регулярные выражения выбрал из него что мне нужно и скопировал в эксель. Возможно как то нужно прописать буфер обмнена после знака равно в строке sourceStr := вместо текста? Вот эту строчку не могу правильно прописать sourceStr := %A_Clipboard%

Code: Select all

[
;Send, ^{vk43} ; (Скопировали текст)
sourceStr := %A_Clipboard% 
RegexMatch(sourceStr, "Отфильтровано: \K([\d\.]+)", resultStr)
WinActivate, Отчет по талонам.xlsx - Excel ; Активирует окно "Ексель"]

mcl
Posts: 355
Joined: 04 May 2018, 16:35

Re: Скопировать цифры после определенного слова из буфера обмена и вставить их в exel таблицу.

Post by mcl » 18 May 2022, 17:41

Andrei48 wrote: Возможно как-то нужно прописать буфер обмена после знака равно в строке sourceStr := вместо текста?
Вы совершенно правы, за исключением названия переменной буфера обмена. В Autohotkey v1 (похоже, вы пользуетесь именно им) она зовётся просто Clipboard:

Code: Select all

sourceStr = %Clipboard%  ; Для простого присвоения (через =) буфер обмена нужно %-разыменовать
sourceStr := Clipboard   ; Для присвоения выражения (через :=) %-разыменовывать буфер обмена не нужно
Ещё один момент: работа через буфер обмена хотя и проста, не всегда молниеносна и/или надёжна. Стоит или добавить небольшую задержку между копированием и присвоением sourceStr, или перед копированием очищать буфер обмена и дожидаться пока он снова заполнится с ClipWait:

Code: Select all

Clipboard := ""
Send ^{vk43} ; (Скопировали текст)
ClipWait, 1
; Здесь можно проверить, попало ли что-то в буфер обмена
; и если нет - заблаговременно выйти, не успев наломать дров.
sourceStr := Clipboard
github://oGDIp - GDI+ wrapper for AHK v1.1

Post Reply

Return to “Помощь”