1

Тема: AHK: Поиск содержимого переменной в активном окне

В принципе, в названии уже отражена суть проблемы.
Нужно, не пользуясь обычным поиском Ctrl+F , найти некоторую строку(внутри переменной) в массиве текста или таблицы.
Это при условии, что окно, в котором будет проводиться поиск,уже активно.
Если такой строки не существует, перейти к к выполнению следующего блока команд.
Что то наподобие  IfExist / IfNotExist , только с содержимым переменной.
Подскажите пожалуйста, как это реализовать?

2

Re: AHK: Поиск содержимого переменной в активном окне

DetectHiddenWindows, On
ControlGetText, thisText, Control, A
IfInString

3 (изменено: Deluxe, 2014-12-02 18:48:57)

Re: AHK: Поиск содержимого переменной в активном окне

Drugoy пишет:
DetectHiddenWindows, On
ControlGetText, thisText, Control, A
IfInString

В принципе, наверное, скрытые окна не понадобятся, я ведь только с вордом и экселем буду работать.
А вот насчет контрола. Как я узнаю ,который мне нужен, если мне нужно искать в содержимом всего документа? Просто взять ClassNN любого пустого места вокруг текста\таблички?
И насчет IfInString .
Эта команда проводит поиск внутри другой переменной,так? Мне что, все содержание документа в переменную впихнуть?

Deluxe пишет:

Нужно, не пользуясь обычным поиском Ctrl+F , найти некоторую строку(внутри переменной) в массиве текста или таблицы.

Возможно, это место вводит в заблуждение. Внутри переменной находится только та строка, которую нужно искать.
Остальное, т.е. то, где нужно искать находится в активном окне (в открытом листе экселя,либо страничке ворда).

4

Re: AHK: Поиск содержимого переменной в активном окне

Так ищет текст в активном окне Ворда. Непонятно, по какой причине выдает ошибку, если скрипт запустить раньше, чем Ворд. Если скрипт запустить поздней, ошибки нет.

FindText := "тест"
Return
F1::
   try
      word := ComObjActive("Word.Application")
   catch
   { 
      MsgBox Ошибка!
      ExitApp
   }
   if word.ActiveDocument.Content.Find.Execute(FindText)
      MsgBox Совпадение
   Else
      MsgBox Нет совпадения
Return

5

Re: AHK: Поиск содержимого переменной в активном окне

Deluxe пишет:

В принципе, наверное, скрытые окна не понадобятся, я ведь только с вордом и экселем буду работать.

Изначально задача звучала как "поиск содержимого переменной в активном окне", поэтому в общем случае эта команда нужна (т.к. всё зависит от интерфейса окна).

Deluxe пишет:

А вот насчет контрола. Как я узнаю ,который мне нужен, если мне нужно искать в содержимом всего документа? Просто взять ClassNN любого пустого места вокруг текста\таблички?

Используя WinSpy или аналоги. Если контролов с содержимым, которое надо обработать - несколько, то значит нужен поиск в каждом из них (т.е. перебирать их). Но обычно документ находится в 1 контроле. Вот в MS Office 2010 в Word у меня, я вижу, что весь документ внутри ahk_class _WwG1, а в Excel - в ahk_class XLDESK1 (причём со всех вкладок).

Deluxe пишет:

И насчет IfInString .
Эта команда проводит поиск внутри другой переменной,так? Мне что, все содержание документа в переменную впихнуть?

Да, да.

Deluxe пишет:

Возможно, это место вводит в заблуждение. Внутри переменной находится только та строка, которую нужно искать.
Остальное, т.е. то, где нужно искать находится в активном окне (в открытом листе экселя,либо страничке ворда).

Не вводит. Надо искать содержимое одной переменой в содержимом другой переменной.

6 (изменено: Deluxe, 2014-12-04 20:29:22)

Re: AHK: Поиск содержимого переменной в активном окне

Тут я и понял, что надо было рассказать чуть больше....

Распишу, как приходится делать в ручную, и как хочу это автоматизировать.
Вся соль в том, что я рассчитывал увидеть обычный заменитель поиска.
Возьмем,как пример, табличку из экселя (это важно, с ним больше всего работы).
Моя задача взять в первом экселевском листе,из таблички номер некоторого документа. Там же взять цифру, соответствующую общей массе товара,согласно  этому документу. Задача выполняется просто посылом перемещений курсора при помощи кнопок.
Затем нужно открыть вторую табличку (Winactivate, либо просто альтабнуться), и найти там номер этого документа.
Вторая таблица выглядит как строка с множеством столбцов, в которых различные данные по товару.
В одном столбце указывается номер документа. Еще один столбец в этой строке поделен на несколько строк, в каждой из которой указана масса каждого товара в этом документе.Общая масса не указывается.
Так вот. Через обычный поиск нахожу нужный номер. Выделение остается на ячейке с ним. Затем, приведенным выше способом (при помощи посылов {Right}, {Left}) перехожу к строке с массами товара. Суммирую их, и затем сравниваю получившееся с массой из первой таблички. Если все сходится - заливка строки зеленым, если нет - красным и комментарий напротив строки (столько то не равно тому то).
Сделано все, НО!
Поскольку поиск (все еще ) через Ctrl+F , то если документ из первой таблицы не найден во второй - начинается полный треш.
Оба ваших варианта рабочие, но можно их как то модернизировать, чтобы текст находился, и выделялся курсором. Конкретно, в экселе, выделялась ячейка с этим текстом, без активации контрола редакции её содержимого. ( как одиночный клик по этой ячейке )
И еще. Мне нужно записать запятую в команде, как символ, а не как оператор.
Например, нужно найти все запятые в переменной и заменить на точки.
StringReplace,clipboard,clipboard,%comma%,.,all
Пытался присвоить переменную, но и она её читает как оператор.

7

Re: AHK: Поиск содержимого переменной в активном окне

Deluxe пишет:

Возьмем,как пример, табличку из экселя (это важно, с ним больше всего работы).
Моя задача взять в первом экселевском листе,из таблички номер некоторого документа. Там же взять цифру, соответствующую общей массе товара,согласно  этому документу. Задача выполняется просто посылом перемещений курсора при помощи кнопок.

1. Не понятно что такое "посыл перемещений курсора при помощи кнопок".
2. Не описано по какому алгоритму должен перемещаться курсор.
3. Правильно задачу выполнять используя COM-объекты.

Deluxe пишет:

Вторая таблица выглядит как строка с множеством столбцов

Так выглядит любая таблица.

Deluxe пишет:

И еще. Мне нужно записать запятую в команде, как символ, а не как оператор.
Например, нужно найти все запятые в переменной и заменить на точки.
StringReplace,clipboard,clipboard,%comma%,.,all
Пытался присвоить переменную, но и она её читает как оператор.

Читать мануалы про #Delimiter и #EscapeChar.

8

Re: AHK: Поиск содержимого переменной в активном окне

1. Не понятно что такое "посыл перемещений курсора при помощи кнопок".

В текстовых редакторах курсор можно перемещать при помощи посылки {right} {left} {up} {down}. Имеется в виду текстовый курсор.

2. Не описано по какому алгоритму должен перемещаться курсор.


...Через обычный поиск нахожу нужный номер. Выделение остается на ячейке с ним. Затем, приведенным выше способом (при помощи посылов {Right}, {Left}) перехожу к строке с массами товара...

Имеется в виду так. Конкретный алгоритм (сколько раз вправо,влево,вверх и вниз я сам сделаю).

3. Правильно задачу выполнять используя COM-объекты.

Именно это и есть моя слабость. К сожалению знаний пока крайне недостаточно для того, чтобы понять этот способ, особенно при отсутствии туториалов на русском, и знаний англ. языка...
Тем не менее, я все еще не отказываюсь от идеи это сделать другими, мне понятными методами.

Так выглядит любая таблица.

Да, и не поспоришь Чуть дальше я дал более конкретное представление о  специфике этой таблицы.

Читать мануалы про #Delimiter и #EscapeChar.

Спасибо!А я  лазил во встроенных переменных... Никогда бы не догадался там искать)

9

Re: AHK: Поиск содержимого переменной в активном окне

Irbis пишет:

Так ищет текст в активном окне Ворда. Непонятно, по какой причине выдает ошибку, если скрипт запустить раньше, чем Ворд. Если скрипт запустить поздней, ошибки нет.

FindText := "тест"
Return
F1::
   try
      word := ComObjActive("Word.Application")
   catch
   { 
      MsgBox Ошибка!
      ExitApp
   }
   if word.ActiveDocument.Content.Find.Execute(FindText)
      MsgBox Совпадение
   Else
      MsgBox Нет совпадения
Return

Скажи пожалуйста, этот способ можно как то модифицировать, чтобы искомое выделялось курсором в документе?
И для того, чтобы приспособить к Экселю,достаточно будет поменять везде word на excel?
И последнее... Это можно будет потом вставить в мой код?)
Полностью,он выглядит вот так

+ открыть спойлер
F9::
Loop 1 
{
    summ :=
    ControlClick, EXCEL<1, A
    Send ^+{left}
    Send ^{vk43}
    Number :=Clipboard
    MsgBox, %Number%
    Send {esc}
    Sleep, 200
    Send {left}
    ControlClick, EXCEL<1, A
    Send ^+{left}
    Send ^{vk43}
    Mass :=clipboard + 0
    StringReplace,Mass,clipboard,`,,.,all
    MsgBox, %Mass%
    Send {esc}
    Sleep, 200
    Send {right}
    Send {down}
    Sleep, 200
    Send !{vk09}
    Sleep, 300
    Send ^{vk46}  ; Вот здесь я использую обычный поиск. В какой вид  нужно будет привести твой код, чтобы он заработал внутри моего?
    Sleep, 200 
    Send %Number%
    Sleep, 400
    Send {enter} ; здесь кончается кусок кода,ответственный за поиск.
    Sleep, 100
    Send {esc} 
    Sleep, 200
    Send {Right 9}
    Sleep, 200
    ControlClick, EXCEL<1, A
    Send ^+{left}
    send ^{vk43}
    kol :=clipboard
    Send {esc}
    Send {left 2}
        loop %kol%
        {
            ControlClick, EXCEL<1, A
            Send ^+{left}
            send ^{vk43}
            StringReplace,num,clipboard,`,,.,all
            MsgBox, %num%
            summ +=%num%
            Send {esc}
            Send {down}
        }
        If summ = %Mass%
        {
            MsgBox, %sum% равно %Mass%
            Send {up}
            Send {right 2}
            Send +{left 17}
            ControlClick, X363 Y104, A
            Send {up 3} ; зеленый
            Send {enter}
        }
        If summ != %Mass%
        {
            MsgBox, %summ% не равно %Mass%
            Send {up}
            Send {right 2}
            Send +{left 17}
            ControlClick, X363 Y104, A
            Send {up 3} ;
            Send {left 4} ; красный
            Send {enter}
            Send {right}
            Send %summ% не равно %Mass%
        }
        Send !{vk09}
Sleep, 300
}
Return

10 (изменено: Drugoy, 2014-12-05 21:43:37)

Re: AHK: Поиск содержимого переменной в активном окне

Deluxe пишет:

В текстовых редакторах курсор можно перемещать при помощи посылки {right} {left} {up} {down}. Имеется в виду текстовый курсор.

Каретка != курсор.
Курсор - то, что управляется мышью, а вот каретка - это то, что в текстовых полях мигает обозначая место, куда отправится ввод с клавиатуры.

Deluxe пишет:

...Через обычный поиск нахожу нужный номер. Выделение остается на ячейке с ним. Затем, приведенным выше способом (при помощи посылов {Right}, {Left}) перехожу к строке с массами товара...
Имеется в виду так. Конкретный алгоритм (сколько раз вправо,влево,вверх и вниз я сам сделаю).

3. Правильно задачу выполнять используя COM-объекты.

Именно это и есть моя слабость. К сожалению знаний пока крайне недостаточно для того, чтобы понять этот способ, особенно при отсутствии туториалов на русском, и знаний англ. языка...
Тем не менее, я все еще не отказываюсь от идеи это сделать другими, мне понятными методами.

Тогда не понятно в чём проблема: отправку {right}/{left} вы вроде уже освоили.
Дошли до ячейки - послали ctrl+c (копировать) - содержимое ячейки перешло в буфер обмена и стало доступно в скрипте через встроенные переменные clipboard и clipboardall.

Deluxe пишет:

Спасибо!А я  лазил во встроенных переменных... Никогда бы не догадался там искать)

На самом деле полезно хоть 1 раз посмотреть все команды + основные статьи help файла. Тем более, что они в .chm файле даже разбиты по группам.

11 (изменено: Deluxe, 2014-12-05 22:01:22)

Re: AHK: Поиск содержимого переменной в активном окне

Тогда не понятно в чём проблема: отправку {right}/{left} вы вроде уже освоили.
Дошли до ячейки - послали ctrl+c (копировать) - содержимое ячейки перешло в буфер обмена и стало доступно в скрипте через встроенные переменные clipboard и clipboardall.

Ну я ведь раньше уже писал, в чем запарка. Что делать,если искомого нет в таблице? В этом случае скрипт все равно продолжает работать по заданному алгоритму. И это приводит к очень неприятным последствиям.
Какая команда позволит сделать что либо(или не сделать), при условии,если поиск не дал результатов?

+  Спустя некоторое время.

Возникла идея. В конце скрипта во второй табличке перемещать выделение на любую пустую ячейку.
При повторном выполнении скрипта, если искомое не будет найдено, выделение так и останется на этой пустой ячейке. Присвоить её значение переменной, и создать условие, если эта переменная пуста - перейти к таким то действиям.
Попробую на практике...
Может,есть способ не столь дуболомный?

12

Re: AHK: Поиск содержимого переменной в активном окне

Deluxe пишет:

Что делать,если искомого нет в таблице? В этом случае скрипт все равно продолжает работать по заданному алгоритму. И это приводит к очень неприятным последствиям.

Без конкретного примера опять ничего не понятно.

Deluxe пишет:

Какая команда позволит сделать что либо(или не сделать), при условии,если поиск не дал результатов?

Else.