Моя девушка занимается закупками в торговой сети. Недавно в компании прошло большое сокращение, поэтому количество работы на одного сотрудника резко выросло. Поэтому ей пришлось регулярно задерживаться на работе, иногда даже выходить по субботам. Такая же проблема возникла и у её коллег.

image

О решении, позволившем моей девушке возвращаться домой вовремя, можно прочитать под катом.

При этом значительную часть того, что они делали можно автоматизировать: получение данных с фронта, заполнение 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)


  1. urtow
    09.04.2019 10:48
    +6

    А еще можно на одном месте вертеть неоплачиваемые преработки и выходы в субботу.
    А, стоп, девушка же.


    1. Naves
      09.04.2019 12:22

      На одной работе как-то коллега из IT-отдела на замечание, что пользователи из-за крайне неудобного интерфейса не будут вводить данные, а если и будут, то всякую чушь, ответил «тогда они будут получать только зарплату»


      1. urtow
        09.04.2019 12:34

        В таком случае я могу дат только один совет — набраться опыта и валить. Пока у тебя нет опыта (ценности для фирмы) условия ставят тебе, когда у тебя есть опыт (ценность для фирмы) — условия ставишь ты.


        1. berez
          09.04.2019 12:47

          У женщин бывают проблемы с «валить». Сужу по жене: страшно же! А вдруг никуда не возьмут? А вдруг работу не найду? Кому я нужна — ааааа!!!
          И терпячки у женщин как-то побольше, мне кажется. Могут работать там, где мужик бы уже спился или с ума сошел.


          1. urtow
            09.04.2019 13:13

            Корелляции проблем с «валить» от пола не видел, «Да кому я нужен(нужна)» не зависит от пола.
            Правда в посленднее время я потерял связь с этой частью людей — просто перестал общаться.


          1. StrangerInTheKy
            09.04.2019 13:17
            +2

            У женщин бывают проблемы с «валить». Сужу по жене: страшно же! А вдруг никуда не возьмут? А вдруг работу не найду? Кому я нужна — ааааа!!!
            Для этого, вообще-то, и придумали мужей и психологическую привязанность (эволюция придумала давным-давно, и да, практически именно для этого — поддержка на период нетрудоспособности). А парень, вместо помощи с выбиванием оплаты за переработки, поиском нормальной работы и помощи с повышением квалификации занялся тем, что тоже решил бесплатно поработать на этого работодателя.


            1. PavelBryz Автор
              09.04.2019 17:18

              Для того, что бы помочь с повышением квалификации нужно время, которого без реализации этой автоматизации просто не было.
              Сейчас время есть, что позволяет тратить его на обучение.


          1. glowingsword
            09.04.2019 20:14

            Странная у них логика. Если специалист хороший, не важно мужчина, женщина, что-то среднее или даже марсианин — он всегда найдёт себе работу. Как минимум не хуже предыдущей, а как правило лучше, так как за годы работы на текущем месте он/она точно прокачал/а навыки, а более скиловый специалист на новом месте может получить более выгодный offer. Женщинам нужно чуточку больше верить в себя в таких случаях. А страхи — они же иррациональны, нет смысла обращать на них внимание.


            1. mimoprobegal
              10.04.2019 08:46

              Если речь идет о крупном городе или Москве — то скорее всего и найдет, если же речь о провинции — то может быть или отсутствие альтернативы или альтернатива в виде кучки контор, стоящих друг друга.


        1. Stan_1
          10.04.2019 09:36

          В серьезной фирме условия не поставить. Там есть система бонусов, грейдов, и прочей HR-фигни, которую не перебить никому. А в случае, если условия будут ставиться слишком яро — компания тут же вспомнит «незаменимых людей не бывает». Тогда уж лучше уходить.


          1. urtow
            10.04.2019 12:50

            Серьезная фирма не хочет иметь проблем в случае обращения по неоплачиваемым переработкам.


  1. trir
    09.04.2019 10:55
    +1

    А ведь где то там есть БД — в которой можно настроить импорт/экспорт в .csv и это элементарная задача…


  1. EminH
    09.04.2019 11:04
    +5

    Благодаря такой автоматизации получилось сократить время с трех часов до 30 минут.
    Что в свою очередь позволит сократить еще треть сотрудников


    1. yukon39
      09.04.2019 12:03

      Если нагрузка на оставшиеся 2/3 не вырастет то почему бы и нет? Автоматизация же.
      Хотя судя по вводной «прошли сокращения и теперь надо работать до восхода луны» это не тот случай.


      1. Free_ze
        09.04.2019 13:53

        Если нагрузка на оставшиеся 2/3 не вырастет то почему бы и нет?

        Есть риск, что девушка ТС может оказаться не в той трети.


      1. Hardcoin
        09.04.2019 13:57

        По сравнению с ситуацией "до автоматизации" — не вырастет.


        1. CHolfield
          10.04.2019 10:40
          +1

          это не автоматизация, это Эксель — враг тру-автоматизации и сущность, порождающая корпоративных незаменимых дебилов во плоти.


          1. hatari90
            11.04.2019 14:17

            Подписываюсь. Был опыт, когда из не-IT отдела ушел человек, в числе прочего клепавший некоторые срочные отчеты, на основании которых происходили денежные расчеты с контрагентами. И оказалось, что его руководство не озаботилось вопросом передачи его знаний преемникам. Оказалось, что там был лютый треш в виде бесчисленных экселей с локальной базой Access (о существовании которой никто кроме него не знал, какие говорите бэкапы?). Тогда это первым делом попытались спихнуть на IT, но, к счастью, скинуть свое user-developer добро у них не прокатило.


            1. mkovalevskyi
              11.04.2019 19:32

              И оказалось, что его руководство не озаботилось вопросом передачи его знаний преемникам


              и виноват в этом, Билл Гейтс, лично.

              но, к счастью, скинуть свое user-developer добро у них не прокатило

              а если б он это все наклепал не в екселе, а на джаве\питоне\пхп\голанге\баш скриптах на винде через cygwin + нечто типа FireBird\mongoDB? Это б радикально повысило желание айти отдела рабираться с неизвестно чем написанным неизвестно кем?


              1. hatari90
                12.04.2019 10:03

                Это б радикально повысило желание айти отдела рабираться с неизвестно чем написанным неизвестно кем?

                Нет, конечно. Хотя парировать отсутствием людей с нужной компетенцией было бы еще проще.
                Но не везде в целом к IT-отделу относятся как к палочке-выручалочке, которой можно поручить любую задачу (хотя некоторые пытаются скинуть ответственность, куда же без этого).
                Есть область ответственности. Конкретно данная задача была полностью на их отделе. А какими средствами и на каком стеке она выполняется — не имеет значения. Вас же не заставят зарплату считать, если вдруг в бухгалтерии сработал bus factor?


                1. Naves
                  12.04.2019 11:56

                  Зарплату не заставят, а вот вбивать какие-нибудь табели-накладные запросто могут в отдельных фирмах.


            1. saboteur_kiev
              12.04.2019 00:20

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


              1. Gibboustooth
                12.04.2019 00:35

                Здесь согласен. Кроме того, нередко человек берется за VBA не от хорошей жизни, а после того, как его пару раз пошлют айтишники со словами «это не наше дело, у нас куча работы, вертись как хочешь».


                1. CHolfield
                  12.04.2019 09:43

                  Это ненормальная ситуация у вас описана. Похоже, появление Эксель-автоматизации есть косвенный признак неправильно работающей системы управления предприятием.


                  1. Gibboustooth
                    12.04.2019 10:10

                    Не появление, а чрезмерное разрастание. Эту ситуацию не так сложно мониторить, на самом деле. По крайней мере, на самом поверхностном уровне. Можно написать скрипт, который будет собирать количество строк кода в экселевских файлах и размеры файлов Access.

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


                    1. CHolfield
                      12.04.2019 15:23

                      Можно написать скрипт, который будет собирать количество строк кода в экселевских файлах и размеры файлов Access.

                      У меня ажно кремастерный мускул сократился. Понятно, что на дебилов нормальные средства могут не подействовать, но это перебор. Лучше нафиг Акцесс из пакета (-30% от стоимости про офиса), макросы VBA объявит вне закона, обосновать вирусной угрозой. Я не для того проводил себе Интернет, чтобы отвлекаться на такого рода автоматизацию.
                      Плюс еще постоянный риск, что самописные эксель-скрипты начнут глючить из-а одной неверной ссылки, и разбираться заставят именно администратора, как вам такое?


                      1. Gibboustooth
                        12.04.2019 15:38

                        Понятно, что на дебилов нормальные средства могут не подействовать, но это перебор.

                        А что такого? Найти каждый файл *.xlsm и посмотреть какого в нем размера файл VBProject (если не ошибаюсь, так называется файл, в котором эксель хранит макросы). Это позволит примерно оценить масштаб трагедии.

                        Запретить — конечно проще. С точки зрения IT департамента наверняка так и надо поступить. Но на мой взгляд это не продуктивный подход.


                    1. PavelBryz Автор
                      12.04.2019 16:26

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

                      Кроме того, нередко человек берется за VBA не от хорошей жизни, а после того, как его пару раз пошлют айтишники со словами «это не наше дело, у нас куча работы, вертись как хочешь».

                      Как я упоминал в статье:
                      Самое разумное, что можно было бы сделать в этой ситуации, – это написать ТЗ на разработку необходимого функционала и через начальство передать разработчикам. Однако сокращение коснулась всех, в том числе и разработчиков. В результате, у них не было достаточно ресурсов на реализацию этой автоматизации

                      Как результат либо так, либо сидеть до ночи. Даже учитывая возможные ошибки, мне кажется, что выбор из этих двух альтернатив очевиден.


                      1. Gibboustooth
                        12.04.2019 16:49

                        В результате, у них не было достаточно ресурсов на реализацию этой автоматизации


                        Это не очень понятно. Для квалифицированного разработчика настроить автоматический импорт/экспорт CSV файлов — это не задача, требующая невероятных ресурсов и усилий. Возможно, стоит еще раз сходить к руководству с предложением «а давайте мы все-таки настроим автоматические загрузки-выгрузки и не будем тут огород городить».


                        1. PavelBryz Автор
                          12.04.2019 17:03

                          Возможно, стоит еще раз сходить к руководству с предложением «а давайте мы все-таки настроим автоматические загрузки-выгрузки и не будем тут огород городить».

                          Ключевое тут это еще раз. По словам девушки это бесполезно. Может и есть какие-то варианты, но ни она, ни её начальница похоже продавить выделение ресурсов не могут.


                1. hatari90
                  12.04.2019 10:28

                  Потому что нужно ходить не к рядовым исполнителям, у которых есть определенный круг задач (и которые могут справедливо послать), а к своему начальнику. Чтобы тот вынес вопрос на обсуждение. Есть ли свободные ресурсы, есть ли люди со знанием нужного стека и компетенцией. Если нет, но функционал нужен — выделить бюджет.
                  Как раз от того, что вопросы решаются на уровне «Вась, а не поможешь мне тут табличку в экселе заполнить данными из 10000 отдельных документов?» и наступает управленческий хаос.


                  1. pnetmon
                    12.04.2019 12:36

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

                    Не затрагивая обращения к рядовым сотрудникам других отделов. А только решение своими силами используя Эксель и VBA.
                    Вот исполнителю в начале статьи поставил задачу именно тот начальник к которому вы посылаете чтобы он вынес вопрос на обсуждение. Как думает как быстро он увидит исполнение своего желания или чужого желания которое он ставит исполнителю?


                    1. hatari90
                      12.04.2019 18:15

                      Как думает как быстро он увидит исполнение своего желания или чужого желания которое он ставит исполнителю?

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


                      1. trir
                        12.04.2019 20:56

                        и не требует админских привилегий для установки

                        vs code тоже


                      1. pnetmon
                        12.04.2019 21:19

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

                        Это реальная жизнь.


                        Я работал по ИТ и мне мое руководство в каждой организации очень часто ставило задачи которые решались только Excell файлами, разными костылями и прочими — в тоже время часто само сидело как в приведенном примере — тупо ручками затрачивало много часов на решение задач которые тупо автоматизировались с сокращением времени во много раз, были задачи повторяющиеся от ежедневно до ежемесячно.


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


                        Руководство ставит задачи и ему по барабану как она будет решена, ему нужно выполнение задачи здесь и лучше вчера, и ему не хочется затрачивать кучу своего времени на постановку задач автоматизации, обсуждения и прочего.


                        имела место ситуация, когда сотруднику была поставлена задача, но способ ее решения был неведом никому, кроме него самого

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


                        Притом моя реализация была как в примере — шаг влево, вправо и у стороннего человека затык где надо разбираться в коде. А если расписывать и обрабатывать все возможные случаи — то будет затрачено очень много времени и у другого человека так же будет затык.


                        Ну и просто к выше


                        Для квалифицированного разработчика настроить автоматический импорт/экспорт CSV файлов — это не задача, требующая невероятных ресурсов и усилий. Возможно, стоит еще раз сходить к руководству с предложением «а давайте мы все-таки настроим автоматические загрузки-выгрузки и не будем тут огород городить».

                        Видел кучи программ которые внедрялись руководством ИТ, но где отсутствовал импорт/экспорт. Вот к кому идти, если сам руководитель ИТ внедряет… А программы разные справочники с большим количеством записей.


                        1. Naves
                          12.04.2019 23:20

                          В 90% случаев ИТ не выбирает программу для внедрения, а если и выбирает, то все равно их никто не слушает. Или программа, которая умеет экспорт/импорт не имеет сертификата фстэк/фсб/роскомнадзора/тысячиих. Собственно другая программа потому и имеет сертификат, потому что через неё нельзя сделать «автоматизированный массовый экспорт данных»


          1. Gibboustooth
            11.04.2019 15:17

            Проблема экселя в низком пороге вхождения и растягивание пользователя области использования инструмента далеко за границы его применимости. Но это не проблема инструмента. То, что люди используют скотч там, где нужна сварка — это не проблема скотча.

            Любая ли автоматизация требует инструментов промышленного качества? На мой взгляд — нет. Позиция «либо мы делаем автоматизацию на С#+MSSQL с 300 страничной документацией решения и 100% покрытием тестами, либо делаем руками» по мне так контпродуктивна.


            1. saboteur_kiev
              12.04.2019 00:20

              Проблема экселя в низком пороге вхождения


              Это его преимущество.


              1. Gibboustooth
                12.04.2019 00:33

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


                1. saboteur_kiev
                  12.04.2019 03:15

                  Низкое качество кода и сомнительные архитектурные решения далеко не всегда влияет на бизнес.

                  Качество кода это к скорости и дешевизне разработки. Если же разработчик сам пользователь, то какие вообще претензии к качеству кода могут быть? Зачем оно там? Что качество кода там решает? Ничего.

                  Именно поэтому и взлетел MS офис, потому что в тот момент он решал не проблема качества кода, а проблему разного бизнеса, которым нужен был удобный продукт с низким порогом входа, который бы решал бизнес-задачи.

                  Очень многие ИТшники технические решения для бизнеса и сам бизнес.


    1. 200sx_Pilot
      09.04.2019 22:19

      почему треть?
      три четверти на воздух смело можно отправить.


  1. RicoScrewdriver
    09.04.2019 11:05

    При работе с внешними источниками данных можно попробовать использовать VBS. Можно переключаться между приложениями, например копировать данные с сайта и вставлять их в Excel. Нормально работают нажатия спец клавиш (Enter, Tab, Alt, Ctrl, стрелки на клавиатуре и т.д.). Рутину автоматизировать самое то. Альтернативным вариантом может быть AutoIT — позволяет создавать скрипты автоматизации, способные имитировать действия пользователя, такие как текстовый ввод и воздействия на элементы управления системы и программ, а также реагировать на события (например, выполнять определённые действия при открытии окна с определённым заголовком). Там куча всего.


    1. 1Ridav
      09.04.2019 13:30

      А еще есть PengueeBot, для решения автора подошел бы на ура


  1. berez
    09.04.2019 12:31
    +1

    Недавно в компании прошло большое сокращение, поэтому количество работы на одного сотрудника резко выросло. Поэтому ей пришлось регулярно задерживаться на работе, иногда даже выходить по субботам. Такая же проблема возникла и у её коллег.

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


    1. funca
      09.04.2019 23:48
      -2

      Благодаря решениям руководства у автора могла появиться куча вакантного времени для еще одной девушки, но он предпочел купаться с экселем.


  1. qyix7z
    09.04.2019 12:38

    Если честно, то я не очень понял трудностей с пересчетом листа.
    Почему бы просто не отключить пересчет на время выполнения:

    OldApplicationCalculation = Application.Calculation
    Application.Calculation = xlCalculationManual
    'что-то делаем
    Application.Calculation = OldApplicationCalculation

    И раз уж Вы используете MSForms.DataObject, то почему Control + C, а не .PutInClipboard? Это же сначала надо что-то выделить, чтобы скопировать.


    1. PavelBryz Автор
      09.04.2019 15:16

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


      1. qyix7z
        09.04.2019 15:40
        +1

        Я наверное так и не понял, что и как у Вас работает.
        Потому что, когда код VBA работает, пользователь не может ничего протягивать. И наоборот, когда пользователь что-то делает, то код запускается после его действия, а не во время.
        Пользователь что-то сделал, запустился код (как кстати он запускается?), остановил пересчет, код что-то выполнил, восстановил пересчет, закончил выполнение, отдал управление юзеру.
        И вообще столько мест где можно хранить позицию курсора, кроме самих ячеек. Например, почему бы не оставить просто в переменных vba? Есть еще имена, примечания к ячейке, реестр, да хоть в текстовый файл пиши.


        1. PavelBryz Автор
          09.04.2019 16:19

          Подумал, что Ваш комментарий про пересчет относится к составлению формул.

          Процесс написание скрипта последовательности действий состоит из отработки небольших групп действий и объединение их в одну. Но при переключении на свободную ячейку вся последовательность тут же отрабатывалась

          Трудности с пересчетом листа связанны с тем, что по какой-то причине, как я предположил, автоматическим пересчетом листа, формулы, записывающие значения в ячейки запускали бесконечный цикл и выпадали с ошибкой.
          Я попробовал Ваш вариант с отключением автоматического пересчета, но к сожалению проблему это не решило.
          Касательно записи координат в ячейки. Это сделано для того, чтобы пользователь видел, что-то, что он делает находит отражение в системе. Кроме того, формулы, управляющие движение мышки опираются именно на ячейки.
          Говоря в общем, финальный инструмент должен быть наглядным, чтобы человек мог быстро в нем освоится. Исходя из этого скрывать координаты в переменных, которые пользователь никогда не увидит не практично.


          1. qyix7z
            10.04.2019 08:18

            Правильно я понимаю, что пользователь вводит в ячейку UDF функцию, которая и запускает код? Других способов запуска (нажатие на кнопку, обработка событий листа/книги) не предусмотрено?

            формулы, записывающие значения в ячейки запускали бесконечный цикл и выпадали с ошибкой
            Здесь можно попробовать использовать итеративные вычисления.
            Это сделано для того, чтобы пользователь видел, что-то, что он делает находит отражение в системе.
            То есть на выполнение скрипта требуется время, пользователю надо показать, что система работает, а не зависла? Я использую для этого прогресс бар для эксель, честно стыренный с planetaexcel.ru. Кастомизируется полностью и может дать пользователю понимание, сколько времени осталось до завершения.


            1. PavelBryz Автор
              10.04.2019 15:31

              Правильно я понимаю, что пользователь вводит в ячейку UDF функцию, которая и запускает код? Других способов запуска (нажатие на кнопку, обработка событий листа/книги) не предусмотрено?

              Да, Вы правильно поняли. И нет других способов не предусмотрено по причине того, что пользователь из описанных функций мог составить последовательность действий, которую он сейчас выполняет в ручную. Это не готовый макрос под одну конкретную задачу, а группа функций используя которые можно симулировать то, что пользователь делает в ручную.
              То есть на выполнение скрипта требуется время, пользователю надо показать, что система работает, а не зависла?

              Проблема не в том, что пользователь не видит работы во время выполнения макроса. Проблема скорее в наглядности работы. Пользователи в Excel привыкли к работе с ячейками и, грубо говоря, того, что нет в ячейке для них не существует. По этому координаты записываются в ячейки, на которые могут ссылаться другие функции. Кроме того, пользователь с самых первых моментов знакомства с программой должен видеть результаты, пусть и такие не значительные как 2 числа в ячейках. Это формирует ощущение у пользователя, что программа работает, что сказывается на доверии и желании продолжать разбираться.


              1. navferty
                10.04.2019 16:22

                Если необходимо дать пользователю возможность самостоятельно указать последовательность действий, то как вариант, можно отдельно предусмотреть выбор этапов, и запуск всей цепочки действий по кнопке/сочетанию клавиш. На мой взгляд, детерминированный запуск алгоритма более надежен, и не потребует настройки пересчета ячеек в опциях MS Excel.

                Сам выбор шагов можно сделать на основе, например, Data Validation — будет доступен удобный дроп-даун для выбора шага из заранее указанных вариантов

                Пример выбора шагов
                image


  1. pnetmon
    09.04.2019 12:41

    При большом количестве работы копи-пастой с данными очень удобно использовать мышь с дополнительными боковыми кнопками с их настройкой на копировать и вставить. И выработкой привычки для переключений между окнами использовать клавиатуру. Так же помогает перенести панель задач вверх чтобы меньше водить мышкой.


    Некоторое время назад для автоматизации работы с данными — из одной программы с обработкой в другую программу которые не поддерживали экспорт-импорт, а только ручной ввод использовался xstarter с созданными задачами (полно других программ, просто в 2013 году она уже была знакома). Сложная обработка данных в эксель файле (многостраничный) в котором идет обработка формулами, или в самих задачах xstartera если без эксель файла. Программа работает с окнами, мышкой, клавиатурой, буфером памяти. В результате было нужно или нажать вставить из памяти или нажать кнопку Записать, сохранить введенное.


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


  1. Necessitudo
    09.04.2019 12:43
    +1

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


    1. PavelBryz Автор
      09.04.2019 15:17

      К сожалению, сейчас это не вариант. Я советовал.


    1. McKinseyBA
      09.04.2019 17:15
      +2

      В этой сфере (сетевой ритейл) — Ваше предложение не вариант. Сам до прихода в IT отработал полтора года бизнес-аналитиком РЦ в X5 (с зп слабого мидла). И там варианты не задерживаться появились лишь через 8 месяцев после трудоустройства, когда автоматизировал все, что только можно. Ключевое — там на твое место еще человек 20 желающих. Это Вам не в разработке :-)


  1. 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 часов.
    А еще через год, как это бывает со многими случайно-надуманными отчетами, этот отчет отменили и забыли.
    Цифровизация…


    1. berez
      09.04.2019 15:00

      Программами записи действий клавиатуры и мыши (… ) я сделал несколько макросов,

      Первое, что пришло в голову — автозаполнение форм. Правильные автозаполнялки умеют и чекбоксы с радиобаттонами выставлять.
      Второе, что пришло в голову — скрипт на чем-нибудь типа greasemonkey, чтобы прямо через DOM документа выставлял нужные значения.
      И то, и другое работает практически мгновенно — не надо ждать, пока что-то там проскроллится. А после заполнения можно и вручную пару галок поменять, чтобы не у всех все было одинаково. :)


      1. dimka11
        09.04.2019 17:12
        +1

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


        1. berez
          09.04.2019 17:52
          +3

          Зато появится и опыт, и скрипт :)


        1. mkovalevskyi
          10.04.2019 21:50

          у вас же несколько лет было, если я правильно понимаю?..


      1. xPomaHx
        11.04.2019 07:26

        Следующая стадия силениум или другой браузер без интерфейса, чтобы вообще всё в фоне делалось, а ты в это время героев играешь.


  1. McKinseyBA
    09.04.2019 17:16

    Автору статьи — респект!


  1. saboteur_kiev
    09.04.2019 20:02
    +1

    Все искал в статье где же спойлеры с примерами кода…


  1. click0
    09.04.2019 20:30

    Подобные скрипты должны иметь парольную защиту и быть в скомпиллированном виде.
    Иначе работодатель захочет или перенести скрипты на все машины сотрудников или уволить, чтоб не выделилась среди других.


    1. xPomaHx
      11.04.2019 07:59

      Лучше не быть говнистым и продать скрипт работодателю, чтобы всем было выгодно.


      1. click0
        11.04.2019 12:12

        Зачем работодателю платить деньги, если он может за просто так забрать скрипты, установленные на машине и установить копию другому сотруднику?


      1. hatari90
        11.04.2019 14:27

        Подойти к начальству и сказать «Смотрите, я тут сделал пару скриптов, благодаря которым могу половину времени плевать в потолок, и которыми охотно поделюсь за прибавку к зарплате»? Это имеет далеко не иллюзорные шансы плохо закончиться.


        1. xPomaHx
          11.04.2019 19:48

          Подойти сказать мой парень может написать скрипт за 1 зп, позволит вам сократить 2х сотрудников срок окупаемости 15 дней.
          50к рублей за скрипт который писал 2-3 дня это норм цена.


    1. qyix7z
      11.04.2019 12:50

      Защита в эксель? Не смешите мои подковы ©Конь Юлий
      А скомпилированный вид не проходит по условиям задачи.


      1. click0
        11.04.2019 20:30

        Хорошо, в контексте Excel нужен obfuscator.
        Работодатель всегда захочет улучшений, но с таким кодом так быстро не получится.


        1. qyix7z
          12.04.2019 12:24

          В контексте сабжа, полагаю, никакая обфускация не понадобится, там и так черт ногу сломит.
          *оценочное суждение, код не видел, ТС прошу не принимать близко к сердцу* :D


  1. eugene_bx
    09.04.2019 21:02

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


  1. Bobnecat
    10.04.2019 00:33

    Я все такие так и не понял, все скрипты были написаны и запускались из под exel'овского VBA или какие либо другие программы? Я не программист, но работаю с экселем достаточно много, в том числе и с VBA, но не приходилось интегрировать подобные аутсайдерские приложения.

    По теме автоматизации, пару раз решил автоматизировать процессы для своих коллег. Один раз написал VBA скрипту которая структурировала большие данные в пару секунд, процесс который до этого занимал 5-6 часов. Тетеньки занимавшиеся этим процессом меня поблагодарили и раздражительно отмахнулись. Мол не нужна им такая автоматизация, иначе из двух у только одной останется работа.
    В другом случае, успешно автоматизировав процесс и потратив около недели экспериментирований с VBS, сэкономил коллеге 1 день работы ежемесячно. Через пол года процесс сменился на другой и мой макрос уже не был востребован. В обоих случаях не жалею потраченного времени так как занимался этими проектами в большей мере для собственного развития. С тех пор правда перестал скриптить что-либо для кого-либо кроме себя.


    1. VSOP_juDGe
      10.04.2019 11:39

      Надо было не тетенькам работу презентовать, а руководству. Чтобы тетенек в расход, а вам премию :)


  1. 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 не сработало. Значение не поменялось. А в результате выполнения ошибка. После проверки различных предположений выяснилось, что изменение значение на листе приводит к пересчету всего листа, а значит и той формулы, которая вызывает этот пересчет.

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


    1. 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.
      Значение не поменялось не из-за пересчета, а из-за того, что функция не имеет права в ходе своего выполнения менять состояние книги (не скажу вам сейчас по памяти, относится ли это только к ячейкам или ко всем объектам книги). Отсюда и ошибка.

      Спасибо, что подсказали! Буду знать.


      1. 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 если вдруг в результате нажатия произошло не то, что ожидалось. И так далее.

        Что, например, вы будете делать, если страница не загрузилась или загрузилась неправильно, или загружалась дольше, чем вы ожидали? Что и куда в таком случае начнут вводить ваши функции?


        1. PavelBryz Автор
          11.04.2019 17:01

          Это хорошая идея. Но есть 2 минуса:

          • Необходимо объяснять как искать и указывать элементы
          • Не подходит для решений не связанных с вебом (например, работа с десктопными приложениями)


  1. Grenvud
    10.04.2019 15:33

    PavelBryz, да Вы рыцарь программного кода. Сколько сейчас девушек вспомнили про свою переработку…


  1. navferty
    10.04.2019 15:35

    Присоединюсь к вопросу qyix7z

    Правильно я понимаю, что пользователь вводит в ячейку UDF функцию, которая и запускает код? Других способов запуска (нажатие на кнопку, обработка событий листа/книги) не предусмотрено?

    Такой способ запуска был сознательно выбран?
    Раньше доводилось много заниматься «разработкой» на VBA под Excel. Могу предложить автору рассмотреть более привычные для пользователей способы запуска макросов (начиная от назначения сочетания клавиш/кнопки на понели инструментов) до вёрстки кастомной панели (Ribbon) на ленте MS Excel.
    Если пользователь выбирает из множества этапов, можно подумать о UserForm с набором чекбоксов, либо служебный лист Excel, в определенных ячейках которого до запуска алгоритма пользователь проставляет, например, знаки "+"
    PavelBryz, могу подсказать по реализации в ЛС


    1. PavelBryz Автор
      10.04.2019 15:36

      Ответил в комментарии выше


      1. Gibboustooth
        11.04.2019 01:45

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


        1. PavelBryz Автор
          11.04.2019 11:13

          Excel в принципе не предназначен для таких выкрутасов. Именно по этому хаб «Ненормальное программирование». По поводу использование UDF, на данный момент, это выглядит вполне органично. Я не вижу какие проблемы могут возникнут в будущем. Если возникнут, обязательно отпишусь.


          1. Gibboustooth
            11.04.2019 11:45

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

            Все (!) описанные вами проблемы (невозможность менять значения ячеек, асинхронность вычислений, остановка по нажатию кнопки мыши) были связаны именно с использованием UDF.

            О возможных проблемах сложно говорить, не видя деталей реализации, но среди них могут быть:
            — неправильная последовательность выполнения функций (Эксель в общем-то не обещает, что функция А будет вычислена раньше функции Б, если только результат Б не зависит от результата А)
            — остановка вычисления функций в произвольном месте. Это что-то с чем приходилось сталкиваться лично. Большой массив пользовательских функций на листе — и эксель просто отказывается вычислять половину из них по команде пересчёта листа или всей книги. Ничего при этом не пишет, никаких ошибок не выдает. Просто не вычисляет и всё.

            Кроме того в голову приходит проблема, связанная с общим дизайном вашего решения: если где-то какой-то объект (на сайте или в книге) куда-то подвинется, то ваша программа станет работать неправильно и, в случае загрузки данных на сайт, вы это никак не сможете проверить. Вам очень повезет, если ошибка проявит себя сразу. Если же ошибка проявится через неделю или через месяц — последствия могут быть самые неприятные.

            Читали мое предложение по использованию объекта InternetExplorer.Application для загрузки и скачивания данных? Что думаете на эту тему?


  1. nikandr23
    10.04.2019 17:53

    «Благодаря такой автоматизации получилось сократить время с трех часов до 30 минут.»
    теперь девушка должна научится Хранить Тайну.
    потому что «Сделал дело — берись за следущее».

    (я тут как то раз автоматизировал сравнение Excel файла с LDAP… в результате двух человек уволили..)


  1. alexander_v_pryadko
    10.04.2019 23:09

    Можно было еще и руль с педалями пределать к Excelю :)

    А вообще грустно. Неоднократно наблюдал за этой горе автоматизацией в Excel (каюсь, иногда и приходилось и самому делать такое).

    Являясь ярым противником мнения, что все там можно сделать, и очень удобно, и без привлечения специалистов, призываю всех здравомыслящих людей:
    Обработку прайсов таким идиотским способом, приравнять к пыткам. И освободить их от тупого ковыряния в ячейках, даже пр помощи прекрасных помощников, знающих VBA. Руководителей, склоняющих сотрудников к такого рода действиям, заносить в особый публичный список!


  1. Sarymian
    11.04.2019 08:25

    Мне показалось:

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

    или 18 упоминаний «девушки» сводит статью к простому:
    «Ха! Лузеры смотрите у меня есть девушка»…
    Даже в цитате выше, во втором предложении лаконичней было бы заменить «девушке» на «ей»…

    А так, Хабро сообщество поздравляет Вас с тем, что у Вас есть девушка. Так держать!


    1. CHolfield
      11.04.2019 17:50
      +1

      Только задроту могло так показаться. Что, впрочем, не противоречит вашему замечанию про количество лишних упоминаний третьего лица.