О решении, позволившем моей девушке возвращаться домой вовремя, можно прочитать под катом.
При этом значительную часть того, что они делали можно автоматизировать: получение данных с фронта, заполнение excel документов, обновление данных во фронте и т.д.
Самое разумное, что можно было бы сделать в этой ситуации, – это написать ТЗ на разработку необходимого функционала и через начальство передать разработчикам. Однако сокращение коснулась всех, в том числе и разработчиков. В результате, у них не было достаточно ресурсов на реализацию этой автоматизации. А специализированные RPA системы компания покупать в обозримом будущем не планировала.
Кроме того, усилилась слежка за тем, что сотрудники делают на работе и в каких приложениях они трудятся.
По итогу всех этих неблагоприятных обстоятельств и моего отчаянного желания помочь, я решил написать функции для Excel на VBA, благодаря которым можно было бы автоматизировать рутинные операции моей девушки и её коллег.
Требования к продукту
В качестве точки старта я выбрал задачу, на которую девушка тратила по её ощущениям больше всего времени. В рамках этой задачи девушке было необходимо:
- Перенести из excel файла в строку поиска фронтофисной системы артикул товара;
- По данному артикулу из выдачи поиска получить цену закупки, продажи, ряд дополнительных значений;
- Обработать собранные данные в excel для создания финальной цены продукта;
- Загрузить цены обратно в систему.
- На выгрузку и последующую загрузку данных в день уходило около 3 часов.
Учитывая то, что моя девушка не обладала знаниями в области программирования, необходимо было сделать инструмент с простым и привычным интерфейсом в виде функций в excel. Последовательности действий должны задаваться просто как последовательность функций. Одним словом, KISS.
Основываясь на данном кейсе мной были сформированы следующие функциональные требования:
- Управлять мышкой (перемещение, нажатие клавиш) для выделения соответствующих элементов на экране;
- Симулировать нажатие кнопок на клавиатуре для ввода данных;
- Перенос данных из Excel в сторонние приложения;
- Получение данных из приложения в Excel;
- Выполнение однотипных операций при протягивании формулы в Excel.
Мышь и первые трудности
Прежде чем двигать курсор куда-либо, необходимо понять, куда именно его двигать. Наиболее адекватным в данной ситуации мне представляется просто запоминать положение курсора, когда он находится над определенным элементом. Для того, чтобы запомнить координаты, воспользовался функцией GetCursorPos из библиотеки user32.
Отлично, координаты мы получили, теперь было бы неплохо их запомнить. Ну тут ничего сложного, подумал я, просто отсчитаем от активной ячейки одну или две ячейки и запишем координаты X и Y. Однако, ActiveCell.Offset(0, 1).Value = x не сработало. Значение не поменялось. А в результате выполнения ошибка. После проверки различных предположений выяснилось, что изменение значение на листе приводит к пересчету всего листа, а значит и той формулы, которая вызывает этот пересчет. Для того, чтобы обойти это ограничение пришлось вместо прямого вызова из функции определенных действий заменить эти вызовы на Evaluate, что позволило добиться желаемого.
В результате получилась функция PrintCursorPosition(), которая записывала в две ячейки справа положения курсора в момент выполнения функции. Нужно было набрать PrintCursorPosition() в области для ввода формул, переместить курсор и нажать на клавиатуре enter.
Для перемещения мыши использовал SetCursorPos из той же библиотеки user32. Для того, чтобы использовать эту функцию, ей на вход нужно было передать значение координат x и y, которые были запомнены ранее. С помощью SetCursorPosition(x, y) я смог двигать курсор по ранее запомненным координатам. Первый видимый результат. Ура!
Для симуляции действий мыши я использовал mouse_event из той же библиотеки user32. Передавая на вход флаги клавиш я, смог симулировать нажатия соответствующих клавиш. Первоначально я планировал написать одну функцию MouseButtonPrees(flag), где flag — это обозначение нажатой клавиши, но после первой демонстрации девушке понял, что лучше заменить на группу функций LeftClick(), RightClick() и DoubleClick(). Такой подход позволяет легче читать итоговую функцию.
Клавиатура
В VBA существует оператор SendKeys, который выполняет все необходимые действия. Текст легко передается в функцию по ссылке на ячейку и отрабатывает без проблем. Однако нажатие специальных клавиш (Enter, Tab, Alt, Ctrl, стрелки на клавиатуре и т.д.) вызывали отторжение (для их нажатия необходимо было записать их в фигурных скобках {ENTER}). Поэтому для наиболее часто используемых я написал функции по типу PressEnter(). Для редко используемых я создал шпаргалку в том же документе.
Передача информации между системой и Excel осуществлялась через копирование в буфер и вставку из буфера. Копирование в буфер по сути осуществлялось симуляцией нажатия Control + C после чего в MSForms.DataObject забирались данные из буфера и переносились в конкретную ячейку.
Тестирование и проблемы исполнения
Проблемы начались сразу.
Процесс написание скрипта последовательности действий состоит из отработки небольших групп действий и объединение их в одну. Но при переключении на свободную ячейку вся последовательность тут же отрабатывалась, что чрезвычайно раздражало, особенно если время выполнение группы действий занимало более 10 секунд. Для решение этой проблемы внес проверку на наличие в тексте формулы активной ячейки названия функции. Это помогло.
Кроме того, во время тестирования добавил функцию ожидания WaitS(seconds) и WaitMS(miliseconds), для того, чтобы успевать следить, что отработало, а что нет. Она основана на Sleep из библиотеки kernel32. Разница между WaitS и WaitMS в том, что в WaitMS время в миллисекундах, а в WaitS в секундах.
Другой проблемой стало непоследовательное выполнение функций при протягивании в ячейки. Это было связано с асинхронным расчетом Excel. Он распределял расчет каждой ячейки на разные процессоры. В результате сначала выполняется последовательность в ячейке два, потом в пятой, потом в третьей и т.д. При этом сами последовательности выполнялись от начала и до конца без проблем. Для того, чтобы избавиться от этого поведения отключил в настройках Excel многопоточные вычисления (Параметры Excel -> Дополнительно -> Формулы).
Результаты
Объяснив, как с этим всем работать и научив пользоваться, отпустил свою девушку автоматизировать процессы в компании таким неблагодарным способом.
Благодаря такой автоматизации получилось сократить время с трех часов до 30 минут. При этом автоматизация позволила несколько изменить подход к процессу выгрузки и загрузки данных. Теперь Выгрузка происходит во время того, когда моя девушка уходит на обед, а загрузка ночью. Таким образом можно сказать, что нагрузка уменьшилась почти на половину рабочего дня, что позволило моей девушке возвращаться домой вовремя и мы можем заняться более интересными вещами, чем автоматизацией.
Комментарии (89)
trir
09.04.2019 10:55+1А ведь где то там есть БД — в которой можно настроить импорт/экспорт в .csv и это элементарная задача…
EminH
09.04.2019 11:04+5Благодаря такой автоматизации получилось сократить время с трех часов до 30 минут.
Что в свою очередь позволит сократить еще треть сотрудниковyukon39
09.04.2019 12:03Если нагрузка на оставшиеся 2/3 не вырастет то почему бы и нет? Автоматизация же.
Хотя судя по вводной «прошли сокращения и теперь надо работать до восхода луны» это не тот случай.Free_ze
09.04.2019 13:53Если нагрузка на оставшиеся 2/3 не вырастет то почему бы и нет?
Есть риск, что девушка ТС может оказаться не в той трети.
Hardcoin
09.04.2019 13:57По сравнению с ситуацией "до автоматизации" — не вырастет.
CHolfield
10.04.2019 10:40+1это не автоматизация, это Эксель — враг тру-автоматизации и сущность, порождающая корпоративных незаменимых дебилов во плоти.
hatari90
11.04.2019 14:17Подписываюсь. Был опыт, когда из не-IT отдела ушел человек, в числе прочего клепавший некоторые срочные отчеты, на основании которых происходили денежные расчеты с контрагентами. И оказалось, что его руководство не озаботилось вопросом передачи его знаний преемникам. Оказалось, что там был лютый треш в виде бесчисленных экселей с локальной базой Access (о существовании которой никто кроме него не знал, какие говорите бэкапы?). Тогда это первым делом попытались спихнуть на IT, но, к счастью, скинуть свое user-developer добро у них не прокатило.
mkovalevskyi
11.04.2019 19:32И оказалось, что его руководство не озаботилось вопросом передачи его знаний преемникам
и виноват в этом, Билл Гейтс, лично.
но, к счастью, скинуть свое user-developer добро у них не прокатило
а если б он это все наклепал не в екселе, а на джаве\питоне\пхп\голанге\баш скриптах на винде через cygwin + нечто типа FireBird\mongoDB? Это б радикально повысило желание айти отдела рабираться с неизвестно чем написанным неизвестно кем?hatari90
12.04.2019 10:03Это б радикально повысило желание айти отдела рабираться с неизвестно чем написанным неизвестно кем?
Нет, конечно. Хотя парировать отсутствием людей с нужной компетенцией было бы еще проще.
Но не везде в целом к IT-отделу относятся как к палочке-выручалочке, которой можно поручить любую задачу (хотя некоторые пытаются скинуть ответственность, куда же без этого).
Есть область ответственности. Конкретно данная задача была полностью на их отделе. А какими средствами и на каком стеке она выполняется — не имеет значения. Вас же не заставят зарплату считать, если вдруг в бухгалтерии сработал bus factor?Naves
12.04.2019 11:56Зарплату не заставят, а вот вбивать какие-нибудь табели-накладные запросто могут в отдельных фирмах.
saboteur_kiev
12.04.2019 00:20Виноват в этом не эксель, а менеджер, который вообще не интересуется как работают его люди.
Вдобавок человек уже ушел, а только потом руководство спохватилось о передаче знаний.Gibboustooth
12.04.2019 00:35Здесь согласен. Кроме того, нередко человек берется за VBA не от хорошей жизни, а после того, как его пару раз пошлют айтишники со словами «это не наше дело, у нас куча работы, вертись как хочешь».
CHolfield
12.04.2019 09:43Это ненормальная ситуация у вас описана. Похоже, появление Эксель-автоматизации есть косвенный признак неправильно работающей системы управления предприятием.
Gibboustooth
12.04.2019 10:10Не появление, а чрезмерное разрастание. Эту ситуацию не так сложно мониторить, на самом деле. По крайней мере, на самом поверхностном уровне. Можно написать скрипт, который будет собирать количество строк кода в экселевских файлах и размеры файлов Access.
Понятно, что код коду рознь — может быть простыня на тысячи строк, которая не делает ничего криминального, а может быть пара функций, представляющая собой нацеленный в ногу реактивный гранотомёт. У автора оригинального поста, например, второй вариант. Но у меня почему-то не получается донести до него эту мысль.CHolfield
12.04.2019 15:23Можно написать скрипт, который будет собирать количество строк кода в экселевских файлах и размеры файлов Access.
У меня ажно кремастерный мускул сократился. Понятно, что на дебилов нормальные средства могут не подействовать, но это перебор. Лучше нафиг Акцесс из пакета (-30% от стоимости про офиса), макросы VBA объявит вне закона, обосновать вирусной угрозой. Я не для того проводил себе Интернет, чтобы отвлекаться на такого рода автоматизацию.
Плюс еще постоянный риск, что самописные эксель-скрипты начнут глючить из-а одной неверной ссылки, и разбираться заставят именно администратора, как вам такое?Gibboustooth
12.04.2019 15:38Понятно, что на дебилов нормальные средства могут не подействовать, но это перебор.
А что такого? Найти каждый файл *.xlsm и посмотреть какого в нем размера файл VBProject (если не ошибаюсь, так называется файл, в котором эксель хранит макросы). Это позволит примерно оценить масштаб трагедии.
Запретить — конечно проще. С точки зрения IT департамента наверняка так и надо поступить. Но на мой взгляд это не продуктивный подход.
PavelBryz Автор
12.04.2019 16:26Я понимаю, что применение этого инструмента может стать причиной многих проблем, но я не вижу альтернативы. Вы правильно говорите, что это решение не от хорошей жизни.
Кроме того, нередко человек берется за VBA не от хорошей жизни, а после того, как его пару раз пошлют айтишники со словами «это не наше дело, у нас куча работы, вертись как хочешь».
Как я упоминал в статье:
Самое разумное, что можно было бы сделать в этой ситуации, – это написать ТЗ на разработку необходимого функционала и через начальство передать разработчикам. Однако сокращение коснулась всех, в том числе и разработчиков. В результате, у них не было достаточно ресурсов на реализацию этой автоматизации
Как результат либо так, либо сидеть до ночи. Даже учитывая возможные ошибки, мне кажется, что выбор из этих двух альтернатив очевиден.Gibboustooth
12.04.2019 16:49В результате, у них не было достаточно ресурсов на реализацию этой автоматизации
Это не очень понятно. Для квалифицированного разработчика настроить автоматический импорт/экспорт CSV файлов — это не задача, требующая невероятных ресурсов и усилий. Возможно, стоит еще раз сходить к руководству с предложением «а давайте мы все-таки настроим автоматические загрузки-выгрузки и не будем тут огород городить».PavelBryz Автор
12.04.2019 17:03Возможно, стоит еще раз сходить к руководству с предложением «а давайте мы все-таки настроим автоматические загрузки-выгрузки и не будем тут огород городить».
Ключевое тут это еще раз. По словам девушки это бесполезно. Может и есть какие-то варианты, но ни она, ни её начальница похоже продавить выделение ресурсов не могут.
hatari90
12.04.2019 10:28Потому что нужно ходить не к рядовым исполнителям, у которых есть определенный круг задач (и которые могут справедливо послать), а к своему начальнику. Чтобы тот вынес вопрос на обсуждение. Есть ли свободные ресурсы, есть ли люди со знанием нужного стека и компетенцией. Если нет, но функционал нужен — выделить бюджет.
Как раз от того, что вопросы решаются на уровне «Вась, а не поможешь мне тут табличку в экселе заполнить данными из 10000 отдельных документов?» и наступает управленческий хаос.pnetmon
12.04.2019 12:36Потому что нужно ходить не к рядовым исполнителям, у которых есть определенный круг задач (и которые могут справедливо послать), а к своему начальнику. Чтобы тот вынес вопрос на обсуждение.
Не затрагивая обращения к рядовым сотрудникам других отделов. А только решение своими силами используя Эксель и VBA.
Вот исполнителю в начале статьи поставил задачу именно тот начальник к которому вы посылаете чтобы он вынес вопрос на обсуждение. Как думает как быстро он увидит исполнение своего желания или чужого желания которое он ставит исполнителю?hatari90
12.04.2019 18:15Как думает как быстро он увидит исполнение своего желания или чужого желания которое он ставит исполнителю?
В случае с героиней статьи, пока двигается процесс по «белой» автоматизации, работа не встает. Сотрудники продолжают сидеть и заполнять таблички вручную. В моем же случае (деталей не знаю, я был сторонним наблюдателем) имела место ситуация, когда сотруднику была поставлена задача, но способ ее решения был неведом никому, кроме него самого, в результате получился незаменимый сотрудник, как оказалось.
Со сказанным выше целиком согласен, это косяк управления. А эксель тут выступил в виде инструмента, который есть из коробки и не требует админских привилегий для установки (чего потребовала бы большая часть «серьезных» инструментов, и что не прошло бы бесследно).pnetmon
12.04.2019 21:19это косяк управления. А эксель тут выступил в виде инструмента
Это реальная жизнь.
Я работал по ИТ и мне мое руководство в каждой организации очень часто ставило задачи которые решались только Excell файлами, разными костылями и прочими — в тоже время часто само сидело как в приведенном примере — тупо ручками затрачивало много часов на решение задач которые тупо автоматизировались с сокращением времени во много раз, были задачи повторяющиеся от ежедневно до ежемесячно.
И говорить руководителю когда он скидывает с себя задачу — это нужно автоматизировать, и пока не будет автоматизировано делать не буду — не прокатит.
Руководство ставит задачи и ему по барабану как она будет решена, ему нужно выполнение задачи здесь и лучше вчера, и ему не хочется затрачивать кучу своего времени на постановку задач автоматизации, обсуждения и прочего.
имела место ситуация, когда сотруднику была поставлена задача, но способ ее решения был неведом никому, кроме него самого
А это всегда. Никогда ни сталкивались что обычно способы известны только тому кому была поставлена задача? Когда в ИТ не пишутся инструкции, базы знаний, журналы изменений и т.д. и т.п...
Притом моя реализация была как в примере — шаг влево, вправо и у стороннего человека затык где надо разбираться в коде. А если расписывать и обрабатывать все возможные случаи — то будет затрачено очень много времени и у другого человека так же будет затык.
Ну и просто к выше
Для квалифицированного разработчика настроить автоматический импорт/экспорт CSV файлов — это не задача, требующая невероятных ресурсов и усилий. Возможно, стоит еще раз сходить к руководству с предложением «а давайте мы все-таки настроим автоматические загрузки-выгрузки и не будем тут огород городить».
Видел кучи программ которые внедрялись руководством ИТ, но где отсутствовал импорт/экспорт. Вот к кому идти, если сам руководитель ИТ внедряет… А программы разные справочники с большим количеством записей.
Naves
12.04.2019 23:20В 90% случаев ИТ не выбирает программу для внедрения, а если и выбирает, то все равно их никто не слушает. Или программа, которая умеет экспорт/импорт не имеет сертификата фстэк/фсб/роскомнадзора/тысячиих. Собственно другая программа потому и имеет сертификат, потому что через неё нельзя сделать «автоматизированный массовый экспорт данных»
Gibboustooth
11.04.2019 15:17Проблема экселя в низком пороге вхождения и растягивание пользователя области использования инструмента далеко за границы его применимости. Но это не проблема инструмента. То, что люди используют скотч там, где нужна сварка — это не проблема скотча.
Любая ли автоматизация требует инструментов промышленного качества? На мой взгляд — нет. Позиция «либо мы делаем автоматизацию на С#+MSSQL с 300 страничной документацией решения и 100% покрытием тестами, либо делаем руками» по мне так контпродуктивна.saboteur_kiev
12.04.2019 00:20Проблема экселя в низком пороге вхождения
Это его преимущество.Gibboustooth
12.04.2019 00:33Проблемы и преимущества часто неразрывно связаны. Низкий порог вхождения нередко означает низкую квалификацию пользователя в вопросах автоматизации, а значит, низкое качество кода и сомнительные архитектурные решения.
saboteur_kiev
12.04.2019 03:15Низкое качество кода и сомнительные архитектурные решения далеко не всегда влияет на бизнес.
Качество кода это к скорости и дешевизне разработки. Если же разработчик сам пользователь, то какие вообще претензии к качеству кода могут быть? Зачем оно там? Что качество кода там решает? Ничего.
Именно поэтому и взлетел MS офис, потому что в тот момент он решал не проблема качества кода, а проблему разного бизнеса, которым нужен был удобный продукт с низким порогом входа, который бы решал бизнес-задачи.
Очень многие ИТшники технические решения для бизнеса и сам бизнес.
RicoScrewdriver
09.04.2019 11:05При работе с внешними источниками данных можно попробовать использовать VBS. Можно переключаться между приложениями, например копировать данные с сайта и вставлять их в Excel. Нормально работают нажатия спец клавиш (Enter, Tab, Alt, Ctrl, стрелки на клавиатуре и т.д.). Рутину автоматизировать самое то. Альтернативным вариантом может быть AutoIT — позволяет создавать скрипты автоматизации, способные имитировать действия пользователя, такие как текстовый ввод и воздействия на элементы управления системы и программ, а также реагировать на события (например, выполнять определённые действия при открытии окна с определённым заголовком). Там куча всего.
berez
09.04.2019 12:31+1Недавно в компании прошло большое сокращение, поэтому количество работы на одного сотрудника резко выросло. Поэтому ей пришлось регулярно задерживаться на работе, иногда даже выходить по субботам. Такая же проблема возникла и у её коллег.
Вспомнилась история про мужика, который завел себе вторую семью в соседнем городе. И длилось это несколько лет, пока жена случайно не узнала, что никаких командировок и переработок у ее благоверного не бывает…funca
09.04.2019 23:48-2Благодаря решениям руководства у автора могла появиться куча вакантного времени для еще одной девушки, но он предпочел купаться с экселем.
qyix7z
09.04.2019 12:38Если честно, то я не очень понял трудностей с пересчетом листа.
Почему бы просто не отключить пересчет на время выполнения:
OldApplicationCalculation = Application.Calculation Application.Calculation = xlCalculationManual 'что-то делаем Application.Calculation = OldApplicationCalculation
И раз уж Вы используете MSForms.DataObject, то почему Control + C, а не .PutInClipboard? Это же сначала надо что-то выделить, чтобы скопировать.PavelBryz Автор
09.04.2019 15:16В случае отмены пересчета листа перестает работать протягивание финальной формулы для автоматизации одинаковых действий с разными данными.
qyix7z
09.04.2019 15:40+1Я наверное так и не понял, что и как у Вас работает.
Потому что, когда код VBA работает, пользователь не может ничего протягивать. И наоборот, когда пользователь что-то делает, то код запускается после его действия, а не во время.
Пользователь что-то сделал, запустился код (как кстати он запускается?), остановил пересчет, код что-то выполнил, восстановил пересчет, закончил выполнение, отдал управление юзеру.
И вообще столько мест где можно хранить позицию курсора, кроме самих ячеек. Например, почему бы не оставить просто в переменных vba? Есть еще имена, примечания к ячейке, реестр, да хоть в текстовый файл пиши.PavelBryz Автор
09.04.2019 16:19Подумал, что Ваш комментарий про пересчет относится к составлению формул.
Процесс написание скрипта последовательности действий состоит из отработки небольших групп действий и объединение их в одну. Но при переключении на свободную ячейку вся последовательность тут же отрабатывалась
Трудности с пересчетом листа связанны с тем, что по какой-то причине, как я предположил, автоматическим пересчетом листа, формулы, записывающие значения в ячейки запускали бесконечный цикл и выпадали с ошибкой.
Я попробовал Ваш вариант с отключением автоматического пересчета, но к сожалению проблему это не решило.
Касательно записи координат в ячейки. Это сделано для того, чтобы пользователь видел, что-то, что он делает находит отражение в системе. Кроме того, формулы, управляющие движение мышки опираются именно на ячейки.
Говоря в общем, финальный инструмент должен быть наглядным, чтобы человек мог быстро в нем освоится. Исходя из этого скрывать координаты в переменных, которые пользователь никогда не увидит не практично.qyix7z
10.04.2019 08:18Правильно я понимаю, что пользователь вводит в ячейку UDF функцию, которая и запускает код? Других способов запуска (нажатие на кнопку, обработка событий листа/книги) не предусмотрено?
формулы, записывающие значения в ячейки запускали бесконечный цикл и выпадали с ошибкой
Здесь можно попробовать использовать итеративные вычисления.
Это сделано для того, чтобы пользователь видел, что-то, что он делает находит отражение в системе.
То есть на выполнение скрипта требуется время, пользователю надо показать, что система работает, а не зависла? Я использую для этого прогресс бар для эксель, честно стыренный с planetaexcel.ru. Кастомизируется полностью и может дать пользователю понимание, сколько времени осталось до завершения.PavelBryz Автор
10.04.2019 15:31Правильно я понимаю, что пользователь вводит в ячейку UDF функцию, которая и запускает код? Других способов запуска (нажатие на кнопку, обработка событий листа/книги) не предусмотрено?
Да, Вы правильно поняли. И нет других способов не предусмотрено по причине того, что пользователь из описанных функций мог составить последовательность действий, которую он сейчас выполняет в ручную. Это не готовый макрос под одну конкретную задачу, а группа функций используя которые можно симулировать то, что пользователь делает в ручную.
То есть на выполнение скрипта требуется время, пользователю надо показать, что система работает, а не зависла?
Проблема не в том, что пользователь не видит работы во время выполнения макроса. Проблема скорее в наглядности работы. Пользователи в Excel привыкли к работе с ячейками и, грубо говоря, того, что нет в ячейке для них не существует. По этому координаты записываются в ячейки, на которые могут ссылаться другие функции. Кроме того, пользователь с самых первых моментов знакомства с программой должен видеть результаты, пусть и такие не значительные как 2 числа в ячейках. Это формирует ощущение у пользователя, что программа работает, что сказывается на доверии и желании продолжать разбираться.navferty
10.04.2019 16:22Если необходимо дать пользователю возможность самостоятельно указать последовательность действий, то как вариант, можно отдельно предусмотреть выбор этапов, и запуск всей цепочки действий по кнопке/сочетанию клавиш. На мой взгляд, детерминированный запуск алгоритма более надежен, и не потребует настройки пересчета ячеек в опциях MS Excel.
Сам выбор шагов можно сделать на основе, например, Data Validation — будет доступен удобный дроп-даун для выбора шага из заранее указанных вариантов
Пример выбора шагов
pnetmon
09.04.2019 12:41При большом количестве работы копи-пастой с данными очень удобно использовать мышь с дополнительными боковыми кнопками с их настройкой на копировать и вставить. И выработкой привычки для переключений между окнами использовать клавиатуру. Так же помогает перенести панель задач вверх чтобы меньше водить мышкой.
Некоторое время назад для автоматизации работы с данными — из одной программы с обработкой в другую программу которые не поддерживали экспорт-импорт, а только ручной ввод использовался xstarter с созданными задачами (полно других программ, просто в 2013 году она уже была знакома). Сложная обработка данных в эксель файле (многостраничный) в котором идет обработка формулами, или в самих задачах xstartera если без эксель файла. Программа работает с окнами, мышкой, клавиатурой, буфером памяти. В результате было нужно или нажать вставить из памяти или нажать кнопку Записать, сохранить введенное.
И мое ихмо — для пользователей таких поделок проще делать формулами экселя на листах чтобы пользователь мог при желании сам разобраться и изменить работу под новые хотелки когда руководством поставлена задача выполнить большую однотипную работу к вчерашнему дню.
Necessitudo
09.04.2019 12:43+1Лучше бы автор посоветовал девушке не задерживаться на работе.
McKinseyBA
09.04.2019 17:15+2В этой сфере (сетевой ритейл) — Ваше предложение не вариант. Сам до прихода в IT отработал полтора года бизнес-аналитиком РЦ в X5 (с зп слабого мидла). И там варианты не задерживаться появились лишь через 8 месяцев после трудоустройства, когда автоматизировал все, что только можно. Ключевое — там на твое место еще человек 20 желающих. Это Вам не в разработке :-)
dag_tech
09.04.2019 13:43Коллеги, вы не поверите… Во время моей работы в одной ну очень известной компании (ее точно знают все хабровчане) мне приходилось заполнять абсолютно (от слова ВАЩЕ) бестолковые отчеты — ну типа маркетинг, информация о заказчиках (полезных данных — менее одного процента, т.к. шаблон отчета был полностью оторван от реального мира). На одного заказчика нужно было ответить на 1000+ (это не шутка — ОДНА ТЫСЯЧА с небольшим) вопросов. Большинство вопросов предполагали выбор варианта ответов — 2-4 радиобаттона, кое-где — несколько чекбоксов (к счастью — независимых друг от друга), ну и совсем мало — заполняемых полей. Заказчиков было несколько десятков. Делать это нужно было ежеквартально. Итого получаем не менее 50 000 щелчков мышью (если по 1 щелчку в секунду — то получаем в квартал 14 часов сверхсоредоточенной точной работы). 2 года это делалось в 1 обычной html-странице — одна длинная страница-опросник на одного заказчика. Программами записи действий клавиатуры и мыши (некоторые описаны вот здесь ichip.ru/avtomatiziruem-rutinnie-deistviya.html, я попробовал несколько разных ) я сделал несколько макросов, предусматривающих разные наборы вариантов ответов — чтобы ответы для разных заказчиков в один и тот же период несколько отличались. После открытия пустой страницы под очередного заказчика, я нажимал одну из нескольких клавишных комбинаций для вызова конкретного макроса. Все макросы начинались с клавишной комбинации Alt+что-то — чтобы в Internet Explorer спозиционироваться в меню, потом Ctrl+F и ввод однозначной строки, чтобы спозиционироваться на 1-ом вопросе, дальше — перемещение сколько нужно раз Tab и нажатия Space на радиобаттонах и чекбоксах. В целом можно было спокойно наблюдать за промоткой страницы, заполняемой примерно за 20 секунд. Очень редко возникали ошибки, но к счастью внизу html-странички устанавливалась отметка — что есть пропущенные вопросы и можно было проскролить и поправить.
Счастье длилось недолго.
На очередной год страничку испортили — разукрасили какими-то вебовскими примочками и позиционирование по Tab стало почти невозможным — перемещение оказалось непредсказуемым (любые другие способы попадать на нужный элемент тоже работали очень нестабильно — я постарался проверить).
Взгрустнулось.
К счастью, не испортили одну полезную особенность этой страницы — все радиобаттоны и чекбоксы — сами кликабельные элементы располагались строго друг под другом (насчет кликабельности оказалось важным, т.к. в ряде случаев щелчок в текст элемента не работал).
Пришлось выкручиваться вручную следующим образом:
— подключил две мыши;
— правая мышь с с левой кнопкой под правую руку — с «тяжелым», очень точным, колесом — для того, чтобы получить «длинный» и слегка случайный скролл;
— левая мышь — правая кнопка настроена под левую руку — под одиночный щелчок;
— увеличиваем в браузере масштаб страницы — 140%; с одной стороны это увеличивает длину скролла, с другой стороны — увеличивает «полезную» площадь, в которую нужно попасть, чтобы включить радиобаттон или чекбокс;
— колесом правой мыши подматываю страницу;
— левую мышь стараюсь ни в коем случае не двигать, только щелкаю — и в 90% случаев уверенно попадаю — включаю какой-нибудь радиобаттон или чек-бокс ответа в очередном подкрученном вопросе.
Смысл в том, чтобы не переносить палец с кнопки на колесо и вообще не тратить время на перемещения мыши.
Проверка пропущенных вопросов внизу страницы была.
Управлялся меньше чем за 6 часов.
А еще через год, как это бывает со многими случайно-надуманными отчетами, этот отчет отменили и забыли.
Цифровизация…berez
09.04.2019 15:00Программами записи действий клавиатуры и мыши (… ) я сделал несколько макросов,
Первое, что пришло в голову — автозаполнение форм. Правильные автозаполнялки умеют и чекбоксы с радиобаттонами выставлять.
Второе, что пришло в голову — скрипт на чем-нибудь типа greasemonkey, чтобы прямо через DOM документа выставлял нужные значения.
И то, и другое работает практически мгновенно — не надо ждать, пока что-то там проскроллится. А после заполнения можно и вручную пару галок поменять, чтобы не у всех все было одинаково. :)dimka11
09.04.2019 17:12+1Без опыта написания скриптов времени уйдет больше, чем на ручное заполнение.
xPomaHx
11.04.2019 07:26Следующая стадия силениум или другой браузер без интерфейса, чтобы вообще всё в фоне делалось, а ты в это время героев играешь.
click0
09.04.2019 20:30Подобные скрипты должны иметь парольную защиту и быть в скомпиллированном виде.
Иначе работодатель захочет или перенести скрипты на все машины сотрудников или уволить, чтоб не выделилась среди других.xPomaHx
11.04.2019 07:59Лучше не быть говнистым и продать скрипт работодателю, чтобы всем было выгодно.
click0
11.04.2019 12:12Зачем работодателю платить деньги, если он может за просто так забрать скрипты, установленные на машине и установить копию другому сотруднику?
hatari90
11.04.2019 14:27Подойти к начальству и сказать «Смотрите, я тут сделал пару скриптов, благодаря которым могу половину времени плевать в потолок, и которыми охотно поделюсь за прибавку к зарплате»? Это имеет далеко не иллюзорные шансы плохо закончиться.
xPomaHx
11.04.2019 19:48Подойти сказать мой парень может написать скрипт за 1 зп, позволит вам сократить 2х сотрудников срок окупаемости 15 дней.
50к рублей за скрипт который писал 2-3 дня это норм цена.
qyix7z
11.04.2019 12:50Защита в эксель? Не смешите мои подковы ©Конь Юлий
А скомпилированный вид не проходит по условиям задачи.click0
11.04.2019 20:30Хорошо, в контексте Excel нужен obfuscator.
Работодатель всегда захочет улучшений, но с таким кодом так быстро не получится.qyix7z
12.04.2019 12:24В контексте сабжа, полагаю, никакая обфускация не понадобится, там и так черт ногу сломит.
*оценочное суждение, код не видел, ТС прошу не принимать близко к сердцу* :D
eugene_bx
09.04.2019 21:02Надо было девушку заставить автоматизировать, а потом ей уже можно смело увольняться.
Bobnecat
10.04.2019 00:33Я все такие так и не понял, все скрипты были написаны и запускались из под exel'овского VBA или какие либо другие программы? Я не программист, но работаю с экселем достаточно много, в том числе и с VBA, но не приходилось интегрировать подобные аутсайдерские приложения.
По теме автоматизации, пару раз решил автоматизировать процессы для своих коллег. Один раз написал VBA скрипту которая структурировала большие данные в пару секунд, процесс который до этого занимал 5-6 часов. Тетеньки занимавшиеся этим процессом меня поблагодарили и раздражительно отмахнулись. Мол не нужна им такая автоматизация, иначе из двух у только одной останется работа.
В другом случае, успешно автоматизировав процесс и потратив около недели экспериментирований с VBS, сэкономил коллеге 1 день работы ежемесячно. Через пол года процесс сменился на другой и мой макрос уже не был востребован. В обоих случаях не жалею потраченного времени так как занимался этими проектами в большей мере для собственного развития. С тех пор правда перестал скриптить что-либо для кого-либо кроме себя.VSOP_juDGe
10.04.2019 11:39Надо было не тетенькам работу презентовать, а руководству. Чтобы тетенек в расход, а вам премию :)
Gibboustooth
10.04.2019 11:19Я правильно понимаю, что ваш скрипт привязан к пользовательской функции, т.е. пользователь пишет в ячейку что-нибудь типа =import_from_website(A1, B2, C3), а в теле этой import_from_website запускается вся ваша чехарда с движением курсора и нажиманием кнопок? Если да, то позвольте поинтересоваться — зачем? Я не очень понимаю юзкейс для такой функции. Почему нельзя сделать процедуру, которая пробегает по таблице и повесить ее на кнопочку?
Кроме того, вы не пробовали решить свою задачу через InternetExplorer.Application?
Сначала сделать процедуру, которая создаст новый объект IE, присвоит его глобальной переменной и покажет пользователю открытым на странице авторизации.
Пользователь в открытом окне введет свой логин-пароль для входа на сайт.
Теперь у вас есть веб-браузер с открытой сессией, с которым вы можете делать из VBA все, что захотите.
Без всяких манипуляций с курсором.
Однако, ActiveCell.Offset(0, 1).Value = x не сработало. Значение не поменялось. А в результате выполнения ошибка. После проверки различных предположений выяснилось, что изменение значение на листе приводит к пересчету всего листа, а значит и той формулы, которая вызывает этот пересчет.
Значение не поменялось не из-за пересчета, а из-за того, что функция не имеет права в ходе своего выполнения менять состояние книги (не скажу вам сейчас по памяти, относится ли это только к ячейкам или ко всем объектам книги). Отсюда и ошибка.PavelBryz Автор
11.04.2019 15:22Я правильно понимаю, что ваш скрипт привязан к пользовательской функции, т.е. пользователь пишет в ячейку что-нибудь типа =import_from_website(A1, B2, C3), а в теле этой import_from_website запускается вся ваша чехарда с движением курсора и нажиманием кнопок?
Нет. В ячейку пользователь записывает примерно следующее "=SetCursorPosition(x1, y1)+LeftClick()+SendKeybordKeys(c1)+
PressEnter()+WaitSeconds(3)+SetCursorPosition(x2, y2)+DoubleClick()+CopyToCell(c2)", где x1, y1, x2, y2 — это ячейки с координатами запомненными ранее, а c1 — ячейка с текстом который необходимо ввести, c2 это ячейка куда должен быть вставлен текст.
В результате Excel выполняет следующие действия: Перенос курсора по координатам x1, y1 -> нажатие левой кнопки мыши-> печать текста из ячейки c1 -> нажатие Enter -> подождать 3 секунды (пока загружается информация) -> переместить курсор в x2, y2 -> дважды кликнуть -> скопировать текст в ячейку c2.
Суть в том, что написать эту строчку может человек не знакомый с VBA или любым языком программирования. Проблема не в том, что нужно симулировать определенные действия, для этого полно инструментов и решений куда лучших чем мое, а в том, чтобы дать человеку который не может и не хочет строить свою карьеру в области IT инструмент, который позволит ему больше тратить времени на свою непосредственную работу (в данном случае общение с поставщиками, разработка рекламных материалов и т. д.), а не на тупое перетаскивание из одной среды в другую. В идеальном мире эти проблемы должны решатся на уровне IT с правильным подходом, описанием кейсов, тестированием и т. д., но если Вы поговорите с людьми не из IT подразделений Вы увидите, что большая часть работы выполняемая специалистами с высшим образованием может быть выполнена людьми без образования.
В этом и проблема с решением на базе InternetExplorer.Application или любым другим включающим в себя разработку. Для этого нужно лезть в код, а это не профиль моей девушки и других специалистов не из IT.
Значение не поменялось не из-за пересчета, а из-за того, что функция не имеет права в ходе своего выполнения менять состояние книги (не скажу вам сейчас по памяти, относится ли это только к ячейкам или ко всем объектам книги). Отсюда и ошибка.
Спасибо, что подсказали! Буду знать.Gibboustooth
11.04.2019 15:58В этом и проблема с решением на базе InternetExplorer.Application или любым другим включающим в себя разработку.
Не вижу проблемы. У вас будут вместо манипуляций с курсором другие функции (для примера):
— get_from_web(url, element_id) -> string
— set_to_web(url, element_id, value) -> boolean
— push_web_button(url, button_id, ...) -> boolean
и т.д. на каждое действие с веб-страницей, которое может делать пользователь. Это будет понятнее выглядеть, быстрее работать, а главное — будет надежнее. set_to_web будет возвращать FALSE если он вдруг не смог найти на странице нужного элемента; push_web_button будет возвращать FALSE если вдруг в результате нажатия произошло не то, что ожидалось. И так далее.
Что, например, вы будете делать, если страница не загрузилась или загрузилась неправильно, или загружалась дольше, чем вы ожидали? Что и куда в таком случае начнут вводить ваши функции?
PavelBryz Автор
11.04.2019 17:01Это хорошая идея. Но есть 2 минуса:
- Необходимо объяснять как искать и указывать элементы
- Не подходит для решений не связанных с вебом (например, работа с десктопными приложениями)
navferty
10.04.2019 15:35Присоединюсь к вопросу qyix7z
Правильно я понимаю, что пользователь вводит в ячейку UDF функцию, которая и запускает код? Других способов запуска (нажатие на кнопку, обработка событий листа/книги) не предусмотрено?
Такой способ запуска был сознательно выбран?
Раньше доводилось много заниматься «разработкой» на VBA под Excel. Могу предложить автору рассмотреть более привычные для пользователей способы запуска макросов (начиная от назначения сочетания клавиш/кнопки на понели инструментов) до вёрстки кастомной панели (Ribbon) на ленте MS Excel.
Если пользователь выбирает из множества этапов, можно подумать о UserForm с набором чекбоксов, либо служебный лист Excel, в определенных ячейках которого до запуска алгоритма пользователь проставляет, например, знаки "+"
PavelBryz, могу подсказать по реализации в ЛСPavelBryz Автор
10.04.2019 15:36Ответил в комментарии выше
Gibboustooth
11.04.2019 01:45Не зная конкретики сложно вам что-то посоветовать, но сейчас у вас это сделано нехорошо. UDF не предназначены к тому, для чего вы их приспособили и рано или поздно это выстрелит вам (точнее, вашей девушке) в ногу.
PavelBryz Автор
11.04.2019 11:13Excel в принципе не предназначен для таких выкрутасов. Именно по этому хаб «Ненормальное программирование». По поводу использование UDF, на данный момент, это выглядит вполне органично. Я не вижу какие проблемы могут возникнут в будущем. Если возникнут, обязательно отпишусь.
Gibboustooth
11.04.2019 11:45По поводу использование UDF, на данный момент, это выглядит вполне органично.
Все (!) описанные вами проблемы (невозможность менять значения ячеек, асинхронность вычислений, остановка по нажатию кнопки мыши) были связаны именно с использованием UDF.
О возможных проблемах сложно говорить, не видя деталей реализации, но среди них могут быть:
— неправильная последовательность выполнения функций (Эксель в общем-то не обещает, что функция А будет вычислена раньше функции Б, если только результат Б не зависит от результата А)
— остановка вычисления функций в произвольном месте. Это что-то с чем приходилось сталкиваться лично. Большой массив пользовательских функций на листе — и эксель просто отказывается вычислять половину из них по команде пересчёта листа или всей книги. Ничего при этом не пишет, никаких ошибок не выдает. Просто не вычисляет и всё.
Кроме того в голову приходит проблема, связанная с общим дизайном вашего решения: если где-то какой-то объект (на сайте или в книге) куда-то подвинется, то ваша программа станет работать неправильно и, в случае загрузки данных на сайт, вы это никак не сможете проверить. Вам очень повезет, если ошибка проявит себя сразу. Если же ошибка проявится через неделю или через месяц — последствия могут быть самые неприятные.
Читали мое предложение по использованию объекта InternetExplorer.Application для загрузки и скачивания данных? Что думаете на эту тему?
nikandr23
10.04.2019 17:53«Благодаря такой автоматизации получилось сократить время с трех часов до 30 минут.»
теперь девушка должна научится Хранить Тайну.
потому что «Сделал дело — берись за следущее».
(я тут как то раз автоматизировал сравнение Excel файла с LDAP… в результате двух человек уволили..)
alexander_v_pryadko
10.04.2019 23:09Можно было еще и руль с педалями пределать к Excelю :)
А вообще грустно. Неоднократно наблюдал за этой горе автоматизацией в Excel (каюсь, иногда и приходилось и самому делать такое).
Являясь ярым противником мнения, что все там можно сделать, и очень удобно, и без привлечения специалистов, призываю всех здравомыслящих людей:
Обработку прайсов таким идиотским способом, приравнять к пыткам. И освободить их от тупого ковыряния в ячейках, даже пр помощи прекрасных помощников, знающих VBA. Руководителей, склоняющих сотрудников к такого рода действиям, заносить в особый публичный список!
Sarymian
11.04.2019 08:25Мне показалось:
В качестве точки старта я выбрал задачу, на которую девушка тратила по её ощущениям больше всего времени. В рамках этой задачи девушке было необходимо:
или 18 упоминаний «девушки» сводит статью к простому:
«Ха! Лузеры смотрите у меня есть девушка»…
Даже в цитате выше, во втором предложении лаконичней было бы заменить «девушке» на «ей»…
А так, Хабро сообщество поздравляет Вас с тем, что у Вас есть девушка. Так держать!CHolfield
11.04.2019 17:50+1Только задроту могло так показаться. Что, впрочем, не противоречит вашему замечанию про количество лишних упоминаний третьего лица.
urtow
А еще можно на одном месте вертеть неоплачиваемые преработки и выходы в субботу.
А, стоп, девушка же.
Naves
На одной работе как-то коллега из IT-отдела на замечание, что пользователи из-за крайне неудобного интерфейса не будут вводить данные, а если и будут, то всякую чушь, ответил «тогда они будут получать только зарплату»
urtow
В таком случае я могу дат только один совет — набраться опыта и валить. Пока у тебя нет опыта (ценности для фирмы) условия ставят тебе, когда у тебя есть опыт (ценность для фирмы) — условия ставишь ты.
berez
У женщин бывают проблемы с «валить». Сужу по жене: страшно же! А вдруг никуда не возьмут? А вдруг работу не найду? Кому я нужна — ааааа!!!
И терпячки у женщин как-то побольше, мне кажется. Могут работать там, где мужик бы уже спился или с ума сошел.
urtow
Корелляции проблем с «валить» от пола не видел, «Да кому я нужен(нужна)» не зависит от пола.
Правда в посленднее время я потерял связь с этой частью людей — просто перестал общаться.
StrangerInTheKy
PavelBryz Автор
Для того, что бы помочь с повышением квалификации нужно время, которого без реализации этой автоматизации просто не было.
Сейчас время есть, что позволяет тратить его на обучение.
glowingsword
Странная у них логика. Если специалист хороший, не важно мужчина, женщина, что-то среднее или даже марсианин — он всегда найдёт себе работу. Как минимум не хуже предыдущей, а как правило лучше, так как за годы работы на текущем месте он/она точно прокачал/а навыки, а более скиловый специалист на новом месте может получить более выгодный offer. Женщинам нужно чуточку больше верить в себя в таких случаях. А страхи — они же иррациональны, нет смысла обращать на них внимание.
mimoprobegal
Если речь идет о крупном городе или Москве — то скорее всего и найдет, если же речь о провинции — то может быть или отсутствие альтернативы или альтернатива в виде кучки контор, стоящих друг друга.
Stan_1
В серьезной фирме условия не поставить. Там есть система бонусов, грейдов, и прочей HR-фигни, которую не перебить никому. А в случае, если условия будут ставиться слишком яро — компания тут же вспомнит «незаменимых людей не бывает». Тогда уж лучше уходить.
urtow
Серьезная фирма не хочет иметь проблем в случае обращения по неоплачиваемым переработкам.