Author Topic: Перенос данных из ексель в картотеку  (Read 6373 times)

0 Members and 2 Guests are viewing this topic.

ee33e

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Здравствуйте! Помогите, пожалуйста, как скопированные в буфер цифры распознать в определенной области? Шрифт Calibri, поделитесь кто-нибудь скриптом-распознавателем самым простым!))

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #1 on: December 14, 2016, 09:56:29 AM »
В вашей программе нельзя вставлять из буфера?
Там возможно занесение записей только по одной?


ee33e

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #2 on: December 14, 2016, 12:31:52 PM »
Получается первый столбик надо контролировать, чтобы вовремя переключиться между карточками в программе, вторую колонку надо копировать в буфер, чтобы найти такой же номер в программе, но в ней только распознавание поможет, так как там нельзя скопировать сразу в нужную ячейку или выделить текст для распознания, там сначала нужно нажать на выплывающее меню, затем в нем найти такой же номер, создать строку, путем нажатия на этот номер, и уже в появившейся строке в двух колонках рядом скопировать данные из ексель (двух колонок правых).
вот как я вижу данный процесс, во второй колонке копируем номер и находим этот номер в программе (пара кликов для создания карточки и открывания всплывающего меню, далее скрин, чтобы найти номер из буфера, если нет номера, то прокручиваем список, опять делаем скрин, находим номер, нажимаем на него, и появляется строка с тремя колонками в одной этот найденный номер в две остальные просто копируем данные из двух правых колонок в ексель) надеюсь сейчас понятен мой ход мысли) если тут можно без распознавания обойтись было бы отлично) но пока что-то не придумали как(( Спасибо!

ee33e

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #3 on: December 14, 2016, 12:56:18 PM »
В вашей программе нельзя вставлять из буфера?
Там возможно занесение записей только по одной?
можно вставлять, но только не номер, его нужно выбрать из всплывающего меню, в каждой карточке несколько номеров, в ексель это вторая колонка, первая это номер карточки, а третья и четвертая колонки в ексель эти данные как раз можно скопировать и просто вставить в соответствующие ячейки в программе, но только после того как мы выберем номер из вспывающего меню. Сейчас прикреплю скрин как это выглядит, правда часть потерта, личная информация сори))
С кликами и выбором меню, копированием и всякое такое это я разбераюсь уже, а вот как сюда прикрутить распознавание, чтобы выбрать в меню такое же число что и в буфере, вот в чем не могу разобраться, помогите!)
Ещё мне подсказали вместо ексель работать с txt, в котором табами разделены данные, но это мне тоже сложно освоить сразу, так что можете к моему неэффективному методу сначала подсказать команды, а затем к варианту с txt)))
« Last Edit: December 21, 2016, 12:30:40 PM by ee33e »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #4 on: December 14, 2016, 01:04:57 PM »
Сдесь самое сложное, искать в выподающем списке твое число.
Надо учитывать сглаживание шрифтов в системе. При каждом открытии окна тексты смазываются чуть иначе. Но сглаживание можно отключить.

Откуда мы возьмем картинку? В буфере будет текст. Если бы у нас была картинка то без проблем можно было бы крутить и искать в цикле.

Распознавать? Мы имеем дело не с статичным текстом а с подвижным списком. Это нужно применить скрипт распознавания цифр, медленно прокручивать список и сравнивать полученное с нашим числом.
Все это как то сложно.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #5 on: December 14, 2016, 01:24:30 PM »
Да, да, да.
Основная проблема даже не в сглаживании. Вот этот выпадающий список нужно точно позиционировать.
Распознавать получится только по одной строке, ну это не так страшно.
Учесть перелистывание страницами и то, как будет проходить это пролистывание. Вон там нижняя строка не полная. Если сделать PageDown она где окажется? Вверху полная или такая же обрезанная?

Вот давно написанное распознавание чисел
http://crapware.aidf.org/forum/index.php?topic=88.msg1571#msg1571

В цикле задаётся область с очередным числом. Распознаётся. Сравнивается с числом скопированным из 1 колонки.
Кстати просто копировать колонки 3, 4 тоже не выйдет. Там разделители запятые, нужно менять на точки.

Txt пока не нужно, основное замедление на распознавании. Пока можно копировать напрямую из экселя.

В той программе в которую заносим (слева) закрашены поля... Может в эти поля можно вставить номер? И что можно вписать вместо выпадения списка? Там вижу карандашик, значит вписать можно. Если туда вписывается наименование соответствующее номеру, которое мы и выбираем, может стоит задать массив номер-текстназвание и получив номер из экселя находить в массиве его название и вбивать (вставлять) в программу. Этим избавится совсем от выпадающего списка.


Луций

  • Активный участник
  • ***
  • Posts: 248
  • чат в телеге: https://t.me/klickermannchat
    • View Profile
    • Пишу скрипты на заказ:
Re: Перенос данных из ексель в картотеку
« Reply #6 on: December 14, 2016, 06:57:18 PM »
вот вы наркоманы человек хочет определять скопированные в буфер цифры
а вы все с тем старым скриптом на распознание, который к каждому отдельному случаю нужно сидеть и калибровать три часа

ee33e

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #7 on: December 14, 2016, 11:57:47 PM »
Ничего они не наркоманы, не наговаривай на хороших людей!) так и планировалось делать!(
В общем есть идея, как уйти от распознавания!!
Нужно определить номер, который копируется в буфер из экселя, далее под каждый номер написать свой порядок действий и всё!
Номера в программе всплывают по тем же координатам каждый раз, прокрутка с одной скоростью, так что дело тонкой настройки и не промахнуться! А далее как выше уже описывалось. Там всего 120 номеров( да все-равно быстрее, чем вручную тыкателем работать и интересней) остается подсказать какие команды использовать чтобы сделать
IF "такой-то номер в буфере, делать то"
IF "такой-то номер делать другое то"
Или вообще какие-то команды использовать другие, чтобы сразу понимать на какую строчку в скрипте переходить!! сделаю первый номер, остальные уже автоматом пойдут, координаты исправлять, да прокрутку мышью) так что 120 уже не кажется таким большим числом!
Кто поможет с такой упрощенной задачей!?) проще же?)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #8 on: December 15, 2016, 10:54:51 AM »
вот вы наркоманы человек хочет определять скопированные в буфер цифры
Во первых никто не собирается определять цифры в буфере, почитай сообщения. Определять нужно было в спец программе где есть только выпадающий список без возможности копирования.

а вы все с тем старым скриптом на распознание, который к каждому отдельному случаю нужно сидеть и калибровать три часа
старым, не старым... сделай новее.
Можно и скрипт из трёх строк "калибровать" три часа. И некоторые умудряются.
Если шрифт стабильный подготовка займёт 10-15 мин. На сложных случаях, да можно час провозится.
Но сложный на то и сложный. Тут некоторые одну картинку ищут неделями. Вот блин не приувеличиваю.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #9 on: December 15, 2016, 11:24:30 AM »
В общем есть идея, как уйти от распознавания!!
Нужно определить номер, который копируется в буфер из экселя, далее под каждый номер написать свой порядок действий и всё!
Номера в программе всплывают по тем же координатам каждый раз, прокрутка с одной скоростью, так что дело тонкой настройки и не промахнуться! А далее как выше уже описывалось. Там всего 120 номеров( да все-равно быстрее, чем вручную тыкателем работать и интересней) остается подсказать какие команды использовать чтобы сделать
IF "такой-то номер в буфере, делать то"
IF "такой-то номер делать другое то"

Соответствие строкам задать не сложно
Code: (clickermann) [Select]
// высота строки 20
// строк на экране 12

// координаты первой строки выпадающего списка
$stx = 100
$sty = 10

// заносим номера подряд как они расположены в выпадающем списке
STRSEPARATE("184,203,206,207,230,231,301,302,303,304,308,316", ",", $data)

SUB(get_index, $nn)
    $index = -1
    FOR($j=0, $j < ARRSIZE($data))
        IF($nn = $data[$j])
            $index = $j
            $j = ARRSIZE($data) + 100
        END_IF
    END_CYC 
END_SUB

FOR($stroke=0, $stroke < nnn)   // перебираем строки
    // ...
    // копируем число
   
    $num = INT(FROMCLIP())   // число из буфера
    get_index($num)
    IF($index ! -1)
        LCLICK(x,y)// открываем выпадающий список
        WAITMS(500)
       
        $page = INT($index / 12)
        FOR($p=0, $p < $page)
            KEYPRESS(#PAGEDOWN) // перелистываем страницу $page раз
            WAITMS(300)
        END_CYC
       
        $loc_index = $index - ($page * 12)
        // клик по строке
        LCLICK($stx, $sty + ($loc_index*20))
        WAITMS(300)
       
        // дальше делаем что нужно
    ELSE
        LOGWRITE("Такое число не задано ", $num)
    END_IF
END_CYC

HALT
« Last Edit: December 16, 2016, 10:44:37 AM by Vint »


ee33e

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #10 on: December 17, 2016, 12:59:01 AM »
Вот спасибо, добрый человек! Половину команд не понимаю, но начну с практики и справки, надеюсь сразу же соображу что к чему! Завтра начну так как в поездке(
kiril, переводить данные из одного формата в другой, как раз работа машин, а человек должен мыслить творчески)))))

Ну вот, в общем, ничегошеньки не понятно((
Можно каждую команду кратко пояснить, пожалуйста! get_index - что значит?
Может какие-то более простые команды есть для таких как я, чайников?))

Вот так не получилось, где-то что-то упустили, даже не выпадает меню в программе(((((:
Code: (clickermann) [Select]
// высота строки 20
// строк на экране 37 
 
// координаты первой строки выпадающего списка
$stx = 164
$sty = 292
 
// заносим номера подряд как они расположены в выпадающем списке
STRSEPARATE("101,118,123,125,126,132,138,140,143,146,150,152,155,156,158,159,164,166,168,170,175,184,203,206,207,230,231,301,302,303,304,308,316,317,322,328,330,333,337,342,344,348,405,410,415,416,501,503,514,516,602,616,620,621,627,703,827,869,893,931,1023,1042,1052,1061,1071,1078,1119,1206,1210,1211,1215,1240,1310,1325,1332,1401,1512,1534,1555,1716,1728,1838,1863,1886,2001,2026,2731,2732,2735,2744,2750,2752,2754,2781,2902,2904,2907,2908,2909,2917,2922,2930,2934,2936,2969,2970,2978,2980,2989,2990,2994,3130,3132,3239,3714,3722,3926,100042,100133,$data)
 
SUB(get_index, $nn)
    $index = -1
    FOR($j=0, $j < ARRSIZE($data))
        IF($nn = $data[$j])
            $index = $j
            $j = ARRSIZE($data) + 100
        END_IF
    END_CYC 
END_SUB
 
FOR($stroke=0, $stroke < 100133)   // перебираем строки, тут нужно что-то менять?
   
LDOWN(1413,14)  // ... выделяем ексель с уже выбранной ячейкой с номером
 waitms(200)   
LUP(1413,14)
 waitms(200)

KEYDOWN(17)     // копирование номера,
WAITMS(15)
KEYDOWN(67)
WAITMS(15)
KEYUP(17)
WAITMS(15)
KEYUP(67) 
WAITMS(15)
KEYDOWN(39)    // заранее переходим на след ячейку в строке
WAITMS(15)
KEYUP(39)
WAITMS(15)


    $num = INT(FROMCLIP())   // число из буфера
    get_index($num)
    IF($index ! -1)
        LCLICK(388,233)   // открываем выпадающий список - поставлены координаты
        WAITMS(500)
 
        $page = INT($index / 37)     // тут 12 было по числу строк, если строк теперь 37, правильно?
        FOR($p=0, $p < $page)
            KEYPRESS(#PAGEDOWN)  // перелистываем страницу $page раз
            WAITMS(300)
        END_CYC
 
        $loc_index = $index - ($page * 37)
        // клик по строке
        LCLICK($stx, $sty + ($loc_index*20))
        WAITMS(300)
 
LDOWN(1413,14)  // ... выделяем ексель с уже выбранной ячейкой с номером
 waitms(200)   
LUP(1413,14)
 waitms(200)

KEYDOWN(17)     // копирование 
WAITMS(15)
KEYDOWN(67)
WAITMS(15)
KEYUP(17)
WAITMS(15)
KEYUP(67) 
WAITMS(15)
KEYDOWN(39)    // заранее переходим на след ячейку в строке
WAITMS(15)
KEYUP(39)
WAITMS(15)

LDOWN(500,233)  // выбираем куда вставлять данные
 WAITMS(100)   
LUP(500,233)
WAITMS(100)

KEYDOWN(17)    //  вставляем данные
WAITMS(15)
KEYDOWN(86)
WAITMS(15)
KEYUP(17) 
WAITMS(15)
KEYUP(86)
WAITMS(15)

LDOWN(1413,14)  // ... выделяем ексель с уже выбранной ячейкой с номером
 waitms(200)   
LUP(1413,14)
 waitms(200)

KEYDOWN(17)     // копирование 
WAITMS(15)
KEYDOWN(67)
WAITMS(15)
KEYUP(17)
WAITMS(15)
KEYUP(67) 
WAITMS(15)
KEYDOWN(40)     // переходим на след номер
WAITMS(15)
KEYUP(40)
WAITMS(15)
KEYDOWN(37)               
WAITMS(15)
KEYUP(37)
WAITMS(15)
KEYDOWN(37)               
WAITMS(15)
KEYUP(37)
WAITMS(15)

LDOWN(500,233)  // выбираем куда вставлять данные
 WAITMS(100)   
LUP(500,233)
WAITMS(100)

KEYDOWN(17)    //  вставляем данные
WAITMS(15)
KEYDOWN(86)
WAITMS(15)
KEYUP(17) 
WAITMS(15)
KEYUP(86)
WAITMS(15)

KEYDOWN(13)    //  сохраняем строчку с введеными данными
WAITMS(15)
KEYDOWN(13)
WAITMS(15)

// проверка необходимости перейти к следующей карточке
GETSCREEN(1052,925, 255)
IF_PIXEL_IN(1052,925, 255)

LDOWN(13,962) // переходим на след карточку
 WAITMS(300)
LUP(13,962)
 WAITMS(800)
KEYDOWN(40)     
WAITMS(15)
KEYUP(40)
WAITMS(15)

 END_IF    // нужно ещё раз чтобы закрыть IF_PIXE?

 END_IF
     ELSE
        LOGWRITE("Такое число не задано ", $num)
    END_IF
END_CYC
 
HALT
« Last Edit: December 17, 2016, 01:01:28 AM by ee33e »

ee33e

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #11 on: December 17, 2016, 10:48:06 AM »
Хахаха, прям мастер стеба, тебя тут для этого и держат? Лучше помог бы, или не знаешь как?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #12 on: December 18, 2016, 08:23:06 AM »
Не верный синтаксис:
STRSEPARATE - в начале должна идти строка с разделителями, потом сам символ разделитель и в конце имя массива.
GETSCREEN(1052,925, 255) - ограничить область снимка можно но там должны быть 4 числа координат
IF_PIXEL_IN(1052,925, 255) - эта функция ищет пиксел в области, должно быть 4 числа координат, потом цвета через запятую.

Лишние строки
Code: [Select]
ELSE
   LOGWRITE("Такое число не задано ", $num)
END_IF

Верный код
Code: (clickermann) [Select]
// высота строки 20
// строк на экране 37

// координаты первой строки выпадающего списка
$stx = 164
$sty = 292

// заносим номера подряд как они расположены в выпадающем списке
STRSEPARATE("101,118,123,125,126,132,138,140,143,146,150,152,155,156,158,159,164,166,168,170,175,184,203,206,207,230,231,301,302,303,304,308,316,317,322,328,330,333,337,342,344,348,405,410,415,416,501,503,514,516,602,616,620,621,627,703,827,869,893,931,1023,1042,1052,1061,1071,1078,1119,1206,1210,1211,1215,1240,1310,1325,1332,1401,1512,1534,1555,1716,1728,1838,1863,1886,2001,2026,2731,2732,2735,2744,2750,2752,2754,2781,2902,2904,2907,2908,2909,2917,2922,2930,2934,2936,2969,2970,2978,2980,2989,2990,2994,3130,3132,3239,3714,3722,3926,100042,100133", ",", $data)

SUB(get_index, $nn)
   $index = -1
   FOR($j=0, $j < ARRSIZE($data))
      IF($nn = $data[$j])
         $index = $j
         $j = ARRSIZE($data) + 100
      END_IF
   END_CYC
END_SUB

FOR($stroke=0, $stroke < 100133)   // перебираем строки, тут нужно что-то менять?
   
   LDOWN(1413,14)  // ... выделяем ексель с уже выбранной ячейкой с номером
   waitms(200)
   LUP(1413,14)
   waitms(200)
   
   KEYDOWN(17)     // копирование номера,
   WAITMS(15)
   KEYDOWN(67)
   WAITMS(15)
   KEYUP(17)
   WAITMS(15)
   KEYUP(67)
   WAITMS(15)
   KEYDOWN(39)    // заранее переходим на след ячейку в строке
   WAITMS(15)
   KEYUP(39)
   WAITMS(15)
   
   
   $num = INT(FROMCLIP())   // число из буфера
   get_index($num)
   IF($index ! -1)
      LCLICK(388,233)   // открываем выпадающий список - поставлены координаты
      WAITMS(500)
     
      $page = INT($index / 37)     // тут 12 было по числу строк, если строк теперь 37, правильно?
      FOR($p=0, $p < $page)
         KEYPRESS(#PAGEDOWN)  // перелистываем страницу $page раз
         WAITMS(300)
      END_CYC
     
      $loc_index = $index - ($page * 37)
      // клик по строке
      LCLICK($stx, $sty + ($loc_index*20))
      WAITMS(300)
     
      LDOWN(1413,14)  // ... выделяем ексель с уже выбранной ячейкой с номером
      waitms(200)
      LUP(1413,14)
      waitms(200)
     
      KEYDOWN(17)     // копирование
      WAITMS(15)
      KEYDOWN(67)
      WAITMS(15)
      KEYUP(17)
      WAITMS(15)
      KEYUP(67)
      WAITMS(15)
      KEYDOWN(39)    // заранее переходим на след ячейку в строке
      WAITMS(15)
      KEYUP(39)
      WAITMS(15)
     
      LDOWN(500,233)  // выбираем куда вставлять данные
      WAITMS(100)
      LUP(500,233)
      WAITMS(100)
     
      KEYDOWN(17)    //  вставляем данные
      WAITMS(15)
      KEYDOWN(86)
      WAITMS(15)
      KEYUP(17)
      WAITMS(15)
      KEYUP(86)
      WAITMS(15)
     
      LDOWN(1413,14)  // ... выделяем ексель с уже выбранной ячейкой с номером
      waitms(200)
      LUP(1413,14)
      waitms(200)
     
      KEYDOWN(17)     // копирование
      WAITMS(15)
      KEYDOWN(67)
      WAITMS(15)
      KEYUP(17)
      WAITMS(15)
      KEYUP(67)
      WAITMS(15)
      KEYDOWN(40)     // переходим на след номер
      WAITMS(15)
      KEYUP(40)
      WAITMS(15)
      KEYDOWN(37)
      WAITMS(15)
      KEYUP(37)
      WAITMS(15)
      KEYDOWN(37)
      WAITMS(15)
      KEYUP(37)
      WAITMS(15)
     
      LDOWN(500,233)  // выбираем куда вставлять данные
      WAITMS(100)
      LUP(500,233)
      WAITMS(100)
     
      KEYDOWN(17)    //  вставляем данные
      WAITMS(15)
      KEYDOWN(86)
      WAITMS(15)
      KEYUP(17)
      WAITMS(15)
      KEYUP(86)
      WAITMS(15)
     
      KEYDOWN(13)    //  сохраняем строчку с введеными данными
      WAITMS(15)
      KEYDOWN(13)
      WAITMS(15)
     
      // проверка необходимости перейти к следующей карточке
      GETSCREEN
      IF_PIXEL_IN(1052,925,1052,925, 255)
         
         LDOWN(13,962) // переходим на след карточку
         WAITMS(300)
         LUP(13,962)
         WAITMS(800)
         KEYDOWN(40)
         WAITMS(15)
         KEYUP(40)
         WAITMS(15)
         
      END_IF    // нужно ещё раз чтобы закрыть IF_PIXE?
     
   END_IF
   
END_CYC

HALT

ee33e

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #13 on: December 18, 2016, 01:32:40 PM »
Разобрались с проблемой внесения информации в буфер, если копировать саму ячейку кликер не понимает, дописали редактирование ячейки, потом выделение в ней цифр и уже потом копирование!

Пошла работа с открывающимся меню!
Получается сейчас, если листать не надо, то все верно вбивается! А если начинает перелистывать, то другой номер нажимает(((
Может при необходимости листать вниз можно добавить сначала двойное нажатие pagedown?

Хочу показать как работает открывающееся меню, нажимаю мышкой для открытия, затем клавишу pagedown, и выделение переходит с первой строки на последнюю, и только после второго нажатия pagedown, в меню происходит перелистывание. Получается чтобы полностью дойти до конца списка нужно нажать 5 раз pagedown. Вот как это выглядит:


И не получается перейти на другую карточку если в заданной точке подходящий цвет(((
Как проверить через лог какой он все же цвет определяет и делает ли это?

Вот новый сценарий, немного изменен:
Code: (clickermann) [Select]
// высота строки 20
// строк на экране 37
 
// координаты первой строки выпадающего списка
$stx = 343
$sty = 292
 
// заносим номера подряд как они расположены в выпадающем списке
STRSEPARATE("101,118,123,125,126,132,138,140,143,146,150,152,155,156,158,159,164,166,168,170,175,184,203,206,207,230,231,301,302,303,304,308,316,317,322,328,330,333,337,342,344,348,405,410,415,416,501,503,514,516,602,616,620,621,627,703,827,869,893,931,1023,1042,1052,1061,1071,1078,1119,1206,1210,1211,1215,1240,1310,1325,1332,1401,1512,1534,1555,1716,1728,1838,1863,1886,2001,2026,2731,2732,2735,2744,2750,2752,2754,2781,2902,2904,2907,2908,2909,2917,2922,2930,2934,2936,2969,2970,2978,2980,2989,2990,2994,3130,3132,3239,3714,3722,3926,100042,100133", ",", $data)
 
SUB(get_index, $nn)
   $index = -1
   FOR($j=0, $j < ARRSIZE($data))
      IF($nn = $data[$j])
         $index = $j
         $j = ARRSIZE($data) + 100
      END_IF
   END_CYC
END_SUB
 
FOR($stroke=0, $stroke < 100134)   // перебираем строки
 
   LDOWN(1413,14)  // ... выделяем ексель с уже выбранной ячейкой с номером
   waitms(500)
   LUP(1413,14)
   waitms(500)
   
   KEYDOWN(#F2)    // редактирование ячейки
   WAITMS(15)
   KEYUP(#F2)
   WAITMS(15)

   LDOWN(1115,892)  //  выделение номера
   waitms(100)
   LUP(1171,889) 
   waitms(100)

   KEYDOWN(17)     // копирование номера
   WAITMS(15)
   KEYDOWN(67)
   WAITMS(15)
   KEYUP(17)
   WAITMS(15)
   KEYUP(67)
   WAITMS(15)
   KEYDOWN(#TAB)    // заранее переходим на след ячейку в строке
   WAITMS(15)
   KEYUP(#TAB)
   WAITMS(15)
   KEYDOWN(#TAB)   
   WAITMS(15)
   KEYUP(#TAB)
   WAITMS(15)
 
   $num = INT(FROMCLIP())   // число из буфера
   get_index($num)
   IF($index ! -1)
   LCLICK(321,233)   // открываем выпадающий список - поставлены координаты
   WAITMS(800)
   KEYPRESS(#PAGEUP) 
   WAITMS(100)
   KEYPRESS(#PAGEUP) 
   WAITMS(100)
   KEYPRESS(#PAGEUP)
   WAITMS(100)
   KEYPRESS(#PAGEUP) 
   WAITMS(100)   
   
      $page = INT($index / 37)     // тут 12 было по числу строк, если строк теперь 37, правильно?
      FOR($p=0, $p < $page)
         KEYPRESS(#PAGEDOWN)  // перелистываем страницу $page раз
         WAITMS(300)
      END_CYC
 
      $loc_index = $index - ($page * 37)
      // клик по строке
      LCLICK($stx, $sty + ($loc_index*20))
      WAITMS(300)
 
      LDOWN(1413,14)  // ... выделяем ексель с уже выбранной ячейкой с номером
      waitms(500)
      LUP(1413,14)
      waitms(500)
 
      KEYDOWN(17)     // копирование
      WAITMS(15)
      KEYDOWN(67)
      WAITMS(15)
      KEYUP(17)
      WAITMS(15)
      KEYUP(67)
      WAITMS(15)
      KEYDOWN(39)    // заранее переходим на след ячейку в строке
      WAITMS(15)
      KEYUP(39)
      WAITMS(15)
 
      LDOWN(521,234)  // выбираем куда вставлять данные
      WAITMS(100)
      LUP(660,233)
      WAITMS(100)
 
      KEYDOWN(17)    //  вставляем данные
      WAITMS(15)
      KEYDOWN(86)
      WAITMS(15)
      KEYUP(17)
      WAITMS(15)
      KEYUP(86)
      WAITMS(15)
 
      LDOWN(1413,14)  // ... выделяем ексель с уже выбранной ячейкой с номером
      waitms(500)
      LUP(1413,14)
      waitms(500)
 
      KEYDOWN(17)     // копирование
      WAITMS(15)
      KEYDOWN(67)
      WAITMS(15)
      KEYUP(17)
      WAITMS(15)
      KEYUP(67)
      WAITMS(15)
      KEYDOWN(40)     // переходим на след номер
      WAITMS(15)
      KEYUP(40)
      WAITMS(15)
      KEYDOWN(37)
      WAITMS(15)
      KEYUP(37)
      WAITMS(15)
      KEYDOWN(37)
      WAITMS(15)
      KEYUP(37)
      WAITMS(15)
      KEYDOWN(37)
      WAITMS(15)
      KEYUP(37)
      WAITMS(15)
     
      LDOWN(671,233)  // выбираем куда вставлять данные
      WAITMS(100)
      LUP(861,234)
      WAITMS(100)
 
      KEYDOWN(17)    //  вставляем данные
      WAITMS(15)
      KEYDOWN(86)
      WAITMS(15)
      KEYUP(17)
      WAITMS(15)
      KEYUP(86)
      WAITMS(15)
 
      KEYDOWN(13)    //  сохраняем строчку с введеными данными
      WAITMS(15)
      KEYDOWN(13)
      WAITMS(3000)

      // проверка необходимости перейти к следующей карточке
      GETSCREEN
      IF_PIXEL_IN(1059,892,1052,892, 255)

         LDOWN(97,144) // переходим на след карточку
         WAITMS(100)
         LUP(97,144)
         WAITMS(100)
         KEYDOWN(#TAB)
         WAITMS(150)
         KEYUP(#TAB)
         WAITMS(150)
         KEYDOWN(#DOWN)
         WAITMS(150)
         KEYUP(#DOWN)
         WAITMS(2000)
         
      END_IF    // нужно ещё раз чтобы закрыть IF_PIXE?
 
   END_IF
 
END_CYC
 
HALT

Сейчас получается программа вводит все данные в одну карточку, т.е. проблема со сменой карточек, и ещё проблема с выбором строки в выпадающем меню, не выбирает нужную строку, прикрепил в сообщении в теме гифку как выпадает и прокручивается меню, может там можно в ручном режиме проставлять сколько раз нужно нажать pagedown, вместо определения путем деления количества ячеек на количество строк? Например от такого то числа до такого pagedown не нужен, а от таког числа до такого нажать два раза pagedown.
« Last Edit: December 21, 2016, 12:31:15 PM by ee33e »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Перенос данных из ексель в картотеку
« Reply #14 on: December 19, 2016, 01:13:19 PM »
Самому стало интересно и вот написал скрипт для поиска заданного числа на экране как картинку. Код долеко не идеален. Поддерживает от двух чисел.

Рабочий пример в архиве.
Распознавание и поиск заданного числа на экране.
Code: (clickermann) [Select]
SUB(scan, $num)
   $len = STRLEN($num)
   FOR($a=1,$a<$len+1)
      ARRPUSH($aNum, STRCUT($num, $a, 1))
   END_CYC
   
   GETSCREEN
   SCANPICTURE($ARR_SCAN, 0,0, $_xmax,$_ymax, STRCONCAT("Num\", $aNum[0], ".bmp"), -1, 100)
   $n = 1
   $check = 0
   FOR($a=0,($a<ARRSIZE($ARR_SCAN))&($check < 2),2)
      $cx = $ARR_SCAN[$a]+5
      $cy = $ARR_SCAN[$a+1]
     
      $check = 0
      $n2 = 0
      WHILE($check = 0)
         IF_PICTURE_IN($cx,$cy, $cx+20+$n2,$cy+11, STRCONCAT("Num\", $aNum[$n],".bmp"), -1, 100)
            INC($n,1)
            $cx = $_return1+5
           
            IF($len = $n)
               $check = 2
               $x = $ARR_SCAN[$a]
               $y = $ARR_SCAN[$a+1]
            END_IF
         ELSE
            $n = 1
            $check = 1
         END_IF
      END_CYC
     
   END_CYC
   
   UNDEFINE($aNum)
   UNDEFINE($ARR_SCAN)
END_SUB

scan(67) // вызов подпрограммы с передачей заданного числа
IF($check = 2) // если check равна 2 значит найдено
   MOVE($x,$y) // выполняем код
END_IF

WAITMS(500)

scan(1234) // еще поиски
IF($check = 2)
   MOVE($x,$y)
END_IF

WAITMS(500)

scan(233434)
IF($check = 2)
   MOVE($x,$y)
END_IF


HALT
« Last Edit: December 19, 2016, 06:34:52 PM by Oraven »