Comments 90
А, стоп, девушка же.
И терпячки у женщин как-то побольше, мне кажется. Могут работать там, где мужик бы уже спился или с ума сошел.
Правда в посленднее время я потерял связь с этой частью людей — просто перестал общаться.
У женщин бывают проблемы с «валить». Сужу по жене: страшно же! А вдруг никуда не возьмут? А вдруг работу не найду? Кому я нужна — ааааа!!!Для этого, вообще-то, и придумали мужей и психологическую привязанность (эволюция придумала давным-давно, и да, практически именно для этого — поддержка на период нетрудоспособности). А парень, вместо помощи с выбиванием оплаты за переработки, поиском нормальной работы и помощи с повышением квалификации занялся тем, что тоже решил бесплатно поработать на этого работодателя.
Благодаря такой автоматизации получилось сократить время с трех часов до 30 минут.Что в свою очередь позволит сократить еще треть сотрудников
Хотя судя по вводной «прошли сокращения и теперь надо работать до восхода луны» это не тот случай.
Если нагрузка на оставшиеся 2/3 не вырастет то почему бы и нет?
Есть риск, что девушка ТС может оказаться не в той трети.
По сравнению с ситуацией "до автоматизации" — не вырастет.
И оказалось, что его руководство не озаботилось вопросом передачи его знаний преемникам
и виноват в этом, Билл Гейтс, лично.
но, к счастью, скинуть свое user-developer добро у них не прокатило
а если б он это все наклепал не в екселе, а на джаве\питоне\пхп\голанге\баш скриптах на винде через cygwin + нечто типа FireBird\mongoDB? Это б радикально повысило желание айти отдела рабираться с неизвестно чем написанным неизвестно кем?
Это б радикально повысило желание айти отдела рабираться с неизвестно чем написанным неизвестно кем?
Нет, конечно. Хотя парировать отсутствием людей с нужной компетенцией было бы еще проще.
Но не везде в целом к IT-отделу относятся как к палочке-выручалочке, которой можно поручить любую задачу (хотя некоторые пытаются скинуть ответственность, куда же без этого).
Есть область ответственности. Конкретно данная задача была полностью на их отделе. А какими средствами и на каком стеке она выполняется — не имеет значения. Вас же не заставят зарплату считать, если вдруг в бухгалтерии сработал bus factor?
Вдобавок человек уже ушел, а только потом руководство спохватилось о передаче знаний.
Понятно, что код коду рознь — может быть простыня на тысячи строк, которая не делает ничего криминального, а может быть пара функций, представляющая собой нацеленный в ногу реактивный гранотомёт. У автора оригинального поста, например, второй вариант. Но у меня почему-то не получается донести до него эту мысль.
Можно написать скрипт, который будет собирать количество строк кода в экселевских файлах и размеры файлов Access.
У меня ажно кремастерный мускул сократился. Понятно, что на дебилов нормальные средства могут не подействовать, но это перебор. Лучше нафиг Акцесс из пакета (-30% от стоимости про офиса), макросы VBA объявит вне закона, обосновать вирусной угрозой. Я не для того проводил себе Интернет, чтобы отвлекаться на такого рода автоматизацию.
Плюс еще постоянный риск, что самописные эксель-скрипты начнут глючить из-а одной неверной ссылки, и разбираться заставят именно администратора, как вам такое?
Понятно, что на дебилов нормальные средства могут не подействовать, но это перебор.
А что такого? Найти каждый файл *.xlsm и посмотреть какого в нем размера файл VBProject (если не ошибаюсь, так называется файл, в котором эксель хранит макросы). Это позволит примерно оценить масштаб трагедии.
Запретить — конечно проще. С точки зрения IT департамента наверняка так и надо поступить. Но на мой взгляд это не продуктивный подход.
Кроме того, нередко человек берется за VBA не от хорошей жизни, а после того, как его пару раз пошлют айтишники со словами «это не наше дело, у нас куча работы, вертись как хочешь».
Как я упоминал в статье:
Самое разумное, что можно было бы сделать в этой ситуации, – это написать ТЗ на разработку необходимого функционала и через начальство передать разработчикам. Однако сокращение коснулась всех, в том числе и разработчиков. В результате, у них не было достаточно ресурсов на реализацию этой автоматизации
Как результат либо так, либо сидеть до ночи. Даже учитывая возможные ошибки, мне кажется, что выбор из этих двух альтернатив очевиден.
В результате, у них не было достаточно ресурсов на реализацию этой автоматизации
Это не очень понятно. Для квалифицированного разработчика настроить автоматический импорт/экспорт CSV файлов — это не задача, требующая невероятных ресурсов и усилий. Возможно, стоит еще раз сходить к руководству с предложением «а давайте мы все-таки настроим автоматические загрузки-выгрузки и не будем тут огород городить».
Возможно, стоит еще раз сходить к руководству с предложением «а давайте мы все-таки настроим автоматические загрузки-выгрузки и не будем тут огород городить».
Ключевое тут это еще раз. По словам девушки это бесполезно. Может и есть какие-то варианты, но ни она, ни её начальница похоже продавить выделение ресурсов не могут.
Как раз от того, что вопросы решаются на уровне «Вась, а не поможешь мне тут табличку в экселе заполнить данными из 10000 отдельных документов?» и наступает управленческий хаос.
Потому что нужно ходить не к рядовым исполнителям, у которых есть определенный круг задач (и которые могут справедливо послать), а к своему начальнику. Чтобы тот вынес вопрос на обсуждение.
Не затрагивая обращения к рядовым сотрудникам других отделов. А только решение своими силами используя Эксель и VBA.
Вот исполнителю в начале статьи поставил задачу именно тот начальник к которому вы посылаете чтобы он вынес вопрос на обсуждение. Как думает как быстро он увидит исполнение своего желания или чужого желания которое он ставит исполнителю?
Как думает как быстро он увидит исполнение своего желания или чужого желания которое он ставит исполнителю?
В случае с героиней статьи, пока двигается процесс по «белой» автоматизации, работа не встает. Сотрудники продолжают сидеть и заполнять таблички вручную. В моем же случае (деталей не знаю, я был сторонним наблюдателем) имела место ситуация, когда сотруднику была поставлена задача, но способ ее решения был неведом никому, кроме него самого, в результате получился незаменимый сотрудник, как оказалось.
Со сказанным выше целиком согласен, это косяк управления. А эксель тут выступил в виде инструмента, который есть из коробки и не требует админских привилегий для установки (чего потребовала бы большая часть «серьезных» инструментов, и что не прошло бы бесследно).
и не требует админских привилегий для установки
vs code тоже
это косяк управления. А эксель тут выступил в виде инструмента
Это реальная жизнь.
Я работал по ИТ и мне мое руководство в каждой организации очень часто ставило задачи которые решались только Excell файлами, разными костылями и прочими — в тоже время часто само сидело как в приведенном примере — тупо ручками затрачивало много часов на решение задач которые тупо автоматизировались с сокращением времени во много раз, были задачи повторяющиеся от ежедневно до ежемесячно.
И говорить руководителю когда он скидывает с себя задачу — это нужно автоматизировать, и пока не будет автоматизировано делать не буду — не прокатит.
Руководство ставит задачи и ему по барабану как она будет решена, ему нужно выполнение задачи здесь и лучше вчера, и ему не хочется затрачивать кучу своего времени на постановку задач автоматизации, обсуждения и прочего.
имела место ситуация, когда сотруднику была поставлена задача, но способ ее решения был неведом никому, кроме него самого
А это всегда. Никогда ни сталкивались что обычно способы известны только тому кому была поставлена задача? Когда в ИТ не пишутся инструкции, базы знаний, журналы изменений и т.д. и т.п...
Притом моя реализация была как в примере — шаг влево, вправо и у стороннего человека затык где надо разбираться в коде. А если расписывать и обрабатывать все возможные случаи — то будет затрачено очень много времени и у другого человека так же будет затык.
Ну и просто к выше
Для квалифицированного разработчика настроить автоматический импорт/экспорт CSV файлов — это не задача, требующая невероятных ресурсов и усилий. Возможно, стоит еще раз сходить к руководству с предложением «а давайте мы все-таки настроим автоматические загрузки-выгрузки и не будем тут огород городить».
Видел кучи программ которые внедрялись руководством ИТ, но где отсутствовал импорт/экспорт. Вот к кому идти, если сам руководитель ИТ внедряет… А программы разные справочники с большим количеством записей.
Любая ли автоматизация требует инструментов промышленного качества? На мой взгляд — нет. Позиция «либо мы делаем автоматизацию на С#+MSSQL с 300 страничной документацией решения и 100% покрытием тестами, либо делаем руками» по мне так контпродуктивна.
Проблема экселя в низком пороге вхождения
Это его преимущество.
Качество кода это к скорости и дешевизне разработки. Если же разработчик сам пользователь, то какие вообще претензии к качеству кода могут быть? Зачем оно там? Что качество кода там решает? Ничего.
Именно поэтому и взлетел MS офис, потому что в тот момент он решал не проблема качества кода, а проблему разного бизнеса, которым нужен был удобный продукт с низким порогом входа, который бы решал бизнес-задачи.
Очень многие ИТшники технические решения для бизнеса и сам бизнес.
три четверти на воздух смело можно отправить.
Недавно в компании прошло большое сокращение, поэтому количество работы на одного сотрудника резко выросло. Поэтому ей пришлось регулярно задерживаться на работе, иногда даже выходить по субботам. Такая же проблема возникла и у её коллег.
Вспомнилась история про мужика, который завел себе вторую семью в соседнем городе. И длилось это несколько лет, пока жена случайно не узнала, что никаких командировок и переработок у ее благоверного не бывает…
Почему бы просто не отключить пересчет на время выполнения:
OldApplicationCalculation = Application.Calculation
Application.Calculation = xlCalculationManual
'что-то делаем
Application.Calculation = OldApplicationCalculation
И раз уж Вы используете MSForms.DataObject, то почему Control + C, а не .PutInClipboard? Это же сначала надо что-то выделить, чтобы скопировать.
Потому что, когда код VBA работает, пользователь не может ничего протягивать. И наоборот, когда пользователь что-то делает, то код запускается после его действия, а не во время.
Пользователь что-то сделал, запустился код (как кстати он запускается?), остановил пересчет, код что-то выполнил, восстановил пересчет, закончил выполнение, отдал управление юзеру.
И вообще столько мест где можно хранить позицию курсора, кроме самих ячеек. Например, почему бы не оставить просто в переменных vba? Есть еще имена, примечания к ячейке, реестр, да хоть в текстовый файл пиши.
Процесс написание скрипта последовательности действий состоит из отработки небольших групп действий и объединение их в одну. Но при переключении на свободную ячейку вся последовательность тут же отрабатывалась
Трудности с пересчетом листа связанны с тем, что по какой-то причине, как я предположил, автоматическим пересчетом листа, формулы, записывающие значения в ячейки запускали бесконечный цикл и выпадали с ошибкой.
Я попробовал Ваш вариант с отключением автоматического пересчета, но к сожалению проблему это не решило.
Касательно записи координат в ячейки. Это сделано для того, чтобы пользователь видел, что-то, что он делает находит отражение в системе. Кроме того, формулы, управляющие движение мышки опираются именно на ячейки.
Говоря в общем, финальный инструмент должен быть наглядным, чтобы человек мог быстро в нем освоится. Исходя из этого скрывать координаты в переменных, которые пользователь никогда не увидит не практично.
формулы, записывающие значения в ячейки запускали бесконечный цикл и выпадали с ошибкойЗдесь можно попробовать использовать итеративные вычисления.
Это сделано для того, чтобы пользователь видел, что-то, что он делает находит отражение в системе.То есть на выполнение скрипта требуется время, пользователю надо показать, что система работает, а не зависла? Я использую для этого прогресс бар для эксель, честно стыренный с planetaexcel.ru. Кастомизируется полностью и может дать пользователю понимание, сколько времени осталось до завершения.
Правильно я понимаю, что пользователь вводит в ячейку UDF функцию, которая и запускает код? Других способов запуска (нажатие на кнопку, обработка событий листа/книги) не предусмотрено?
Да, Вы правильно поняли. И нет других способов не предусмотрено по причине того, что пользователь из описанных функций мог составить последовательность действий, которую он сейчас выполняет в ручную. Это не готовый макрос под одну конкретную задачу, а группа функций используя которые можно симулировать то, что пользователь делает в ручную.
То есть на выполнение скрипта требуется время, пользователю надо показать, что система работает, а не зависла?
Проблема не в том, что пользователь не видит работы во время выполнения макроса. Проблема скорее в наглядности работы. Пользователи в Excel привыкли к работе с ячейками и, грубо говоря, того, что нет в ячейке для них не существует. По этому координаты записываются в ячейки, на которые могут ссылаться другие функции. Кроме того, пользователь с самых первых моментов знакомства с программой должен видеть результаты, пусть и такие не значительные как 2 числа в ячейках. Это формирует ощущение у пользователя, что программа работает, что сказывается на доверии и желании продолжать разбираться.
Сам выбор шагов можно сделать на основе, например, Data Validation — будет доступен удобный дроп-даун для выбора шага из заранее указанных вариантов
Обратная сторона — придётся добавить немного вспомогательного кода, для запуска соответствующей функции исходя из имени шага.
При большом количестве работы копи-пастой с данными очень удобно использовать мышь с дополнительными боковыми кнопками с их настройкой на копировать и вставить. И выработкой привычки для переключений между окнами использовать клавиатуру. Так же помогает перенести панель задач вверх чтобы меньше водить мышкой.
Некоторое время назад для автоматизации работы с данными — из одной программы с обработкой в другую программу которые не поддерживали экспорт-импорт, а только ручной ввод использовался xstarter с созданными задачами (полно других программ, просто в 2013 году она уже была знакома). Сложная обработка данных в эксель файле (многостраничный) в котором идет обработка формулами, или в самих задачах xstartera если без эксель файла. Программа работает с окнами, мышкой, клавиатурой, буфером памяти. В результате было нужно или нажать вставить из памяти или нажать кнопку Записать, сохранить введенное.
И мое ихмо — для пользователей таких поделок проще делать формулами экселя на листах чтобы пользователь мог при желании сам разобраться и изменить работу под новые хотелки когда руководством поставлена задача выполнить большую однотипную работу к вчерашнему дню.
Лучше бы автор посоветовал девушке не задерживаться на работе.
Счастье длилось недолго.
На очередной год страничку испортили — разукрасили какими-то вебовскими примочками и позиционирование по Tab стало почти невозможным — перемещение оказалось непредсказуемым (любые другие способы попадать на нужный элемент тоже работали очень нестабильно — я постарался проверить).
Взгрустнулось.
К счастью, не испортили одну полезную особенность этой страницы — все радиобаттоны и чекбоксы — сами кликабельные элементы располагались строго друг под другом (насчет кликабельности оказалось важным, т.к. в ряде случаев щелчок в текст элемента не работал).
Пришлось выкручиваться вручную следующим образом:
— подключил две мыши;
— правая мышь с с левой кнопкой под правую руку — с «тяжелым», очень точным, колесом — для того, чтобы получить «длинный» и слегка случайный скролл;
— левая мышь — правая кнопка настроена под левую руку — под одиночный щелчок;
— увеличиваем в браузере масштаб страницы — 140%; с одной стороны это увеличивает длину скролла, с другой стороны — увеличивает «полезную» площадь, в которую нужно попасть, чтобы включить радиобаттон или чекбокс;
— колесом правой мыши подматываю страницу;
— левую мышь стараюсь ни в коем случае не двигать, только щелкаю — и в 90% случаев уверенно попадаю — включаю какой-нибудь радиобаттон или чек-бокс ответа в очередном подкрученном вопросе.
Смысл в том, чтобы не переносить палец с кнопки на колесо и вообще не тратить время на перемещения мыши.
Проверка пропущенных вопросов внизу страницы была.
Управлялся меньше чем за 6 часов.
А еще через год, как это бывает со многими случайно-надуманными отчетами, этот отчет отменили и забыли.
Цифровизация…
Программами записи действий клавиатуры и мыши (… ) я сделал несколько макросов,
Первое, что пришло в голову — автозаполнение форм. Правильные автозаполнялки умеют и чекбоксы с радиобаттонами выставлять.
Второе, что пришло в голову — скрипт на чем-нибудь типа greasemonkey, чтобы прямо через DOM документа выставлял нужные значения.
И то, и другое работает практически мгновенно — не надо ждать, пока что-то там проскроллится. А после заполнения можно и вручную пару галок поменять, чтобы не у всех все было одинаково. :)
Иначе работодатель захочет или перенести скрипты на все машины сотрудников или уволить, чтоб не выделилась среди других.
А скомпилированный вид не проходит по условиям задачи.
По теме автоматизации, пару раз решил автоматизировать процессы для своих коллег. Один раз написал VBA скрипту которая структурировала большие данные в пару секунд, процесс который до этого занимал 5-6 часов. Тетеньки занимавшиеся этим процессом меня поблагодарили и раздражительно отмахнулись. Мол не нужна им такая автоматизация, иначе из двух у только одной останется работа.
В другом случае, успешно автоматизировав процесс и потратив около недели экспериментирований с VBS, сэкономил коллеге 1 день работы ежемесячно. Через пол года процесс сменился на другой и мой макрос уже не был востребован. В обоих случаях не жалею потраченного времени так как занимался этими проектами в большей мере для собственного развития. С тех пор правда перестал скриптить что-либо для кого-либо кроме себя.
Кроме того, вы не пробовали решить свою задачу через InternetExplorer.Application?
Сначала сделать процедуру, которая создаст новый объект IE, присвоит его глобальной переменной и покажет пользователю открытым на странице авторизации.
Пользователь в открытом окне введет свой логин-пароль для входа на сайт.
Теперь у вас есть веб-браузер с открытой сессией, с которым вы можете делать из VBA все, что захотите.
Без всяких манипуляций с курсором.
Однако, ActiveCell.Offset(0, 1).Value = x не сработало. Значение не поменялось. А в результате выполнения ошибка. После проверки различных предположений выяснилось, что изменение значение на листе приводит к пересчету всего листа, а значит и той формулы, которая вызывает этот пересчет.
Значение не поменялось не из-за пересчета, а из-за того, что функция не имеет права в ходе своего выполнения менять состояние книги (не скажу вам сейчас по памяти, относится ли это только к ячейкам или ко всем объектам книги). Отсюда и ошибка.
Я правильно понимаю, что ваш скрипт привязан к пользовательской функции, т.е. пользователь пишет в ячейку что-нибудь типа =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.
Значение не поменялось не из-за пересчета, а из-за того, что функция не имеет права в ходе своего выполнения менять состояние книги (не скажу вам сейчас по памяти, относится ли это только к ячейкам или ко всем объектам книги). Отсюда и ошибка.
Спасибо, что подсказали! Буду знать.
В этом и проблема с решением на базе 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 если вдруг в результате нажатия произошло не то, что ожидалось. И так далее.
Что, например, вы будете делать, если страница не загрузилась или загрузилась неправильно, или загружалась дольше, чем вы ожидали? Что и куда в таком случае начнут вводить ваши функции?
Правильно я понимаю, что пользователь вводит в ячейку UDF функцию, которая и запускает код? Других способов запуска (нажатие на кнопку, обработка событий листа/книги) не предусмотрено?
Такой способ запуска был сознательно выбран?
Раньше доводилось много заниматься «разработкой» на VBA под Excel. Могу предложить автору рассмотреть более привычные для пользователей способы запуска макросов (начиная от назначения сочетания клавиш/кнопки на понели инструментов) до вёрстки кастомной панели (Ribbon) на ленте MS Excel.
Если пользователь выбирает из множества этапов, можно подумать о UserForm с набором чекбоксов, либо служебный лист Excel, в определенных ячейках которого до запуска алгоритма пользователь проставляет, например, знаки "+"
PavelBryz, могу подсказать по реализации в ЛС
По поводу использование UDF, на данный момент, это выглядит вполне органично.
Все (!) описанные вами проблемы (невозможность менять значения ячеек, асинхронность вычислений, остановка по нажатию кнопки мыши) были связаны именно с использованием UDF.
О возможных проблемах сложно говорить, не видя деталей реализации, но среди них могут быть:
— неправильная последовательность выполнения функций (Эксель в общем-то не обещает, что функция А будет вычислена раньше функции Б, если только результат Б не зависит от результата А)
— остановка вычисления функций в произвольном месте. Это что-то с чем приходилось сталкиваться лично. Большой массив пользовательских функций на листе — и эксель просто отказывается вычислять половину из них по команде пересчёта листа или всей книги. Ничего при этом не пишет, никаких ошибок не выдает. Просто не вычисляет и всё.
Кроме того в голову приходит проблема, связанная с общим дизайном вашего решения: если где-то какой-то объект (на сайте или в книге) куда-то подвинется, то ваша программа станет работать неправильно и, в случае загрузки данных на сайт, вы это никак не сможете проверить. Вам очень повезет, если ошибка проявит себя сразу. Если же ошибка проявится через неделю или через месяц — последствия могут быть самые неприятные.
Читали мое предложение по использованию объекта InternetExplorer.Application для загрузки и скачивания данных? Что думаете на эту тему?
теперь девушка должна научится Хранить Тайну.
потому что «Сделал дело — берись за следущее».
(я тут как то раз автоматизировал сравнение Excel файла с LDAP… в результате двух человек уволили..)
А вообще грустно. Неоднократно наблюдал за этой горе автоматизацией в Excel (каюсь, иногда и приходилось и самому делать такое).
Являясь ярым противником мнения, что все там можно сделать, и очень удобно, и без привлечения специалистов, призываю всех здравомыслящих людей:
Обработку прайсов таким идиотским способом, приравнять к пыткам. И освободить их от тупого ковыряния в ячейках, даже пр помощи прекрасных помощников, знающих VBA. Руководителей, склоняющих сотрудников к такого рода действиям, заносить в особый публичный список!
В качестве точки старта я выбрал задачу, на которую девушка тратила по её ощущениям больше всего времени. В рамках этой задачи девушке было необходимо:
или 18 упоминаний «девушки» сводит статью к простому:
«Ха! Лузеры смотрите у меня есть девушка»…
Даже в цитате выше, во втором предложении лаконичней было бы заменить «девушке» на «ей»…
А так, Хабро сообщество поздравляет Вас с тем, что у Вас есть девушка. Так держать!
Автоматизация бизнес-процессов в Excel или как спасти девушку от переработок