Предыстория

Всем привет. В этой статье я хочу поделиться опытом написания кода на VBA.NET, созданного для решения рутинной задачки, связанной с парсингом Word-файла, последующей "бизнес-логикой" и выгрузкой результата в Excel. Скажу сразу: статья ориентирована больше на инженеров, работающих в производственных сферах и использующих Word/Excel, нежели чем на программистов.

Суть задачи

В общих словах, необходимо взять два Word-файла (старый и новый), выделить в каждом из них таблицы, удовлетворяющие определенному условию, далее вычленить из них столбцы № 3 (наименование) и 4 (номер ревизии). Затем нужно пробежаться по датасету нового файла и определить:

  • новые наименования (еще не было в старом Word-файле) - "new";

  • старые наименования, ревизия которых не изменилась - "not changed";

  • старые наименования (уже есть в старом Word), ревизия которых увеличилась строго на 1 - "changed";

  • старые наименования, ревизия которых НЕ увеличилась на 1 - "mistaked".

Задачка поступила от близкого мне человека, только-только вышедшего на новое место работы. Все его коллеги-инженеры проделывали эту работу руками через Ctrl+C и Ctrl+V. И, как самому молодому птенцу, поручили дерьмовую рутинную работу именно ему. Выходит, мне нужно было придумать что-то относительно простенькое, что поймет человек, программистом не являющийся, а также то, что пройдет бюрократический барьер отдела кибер-безопасности (по моему личному опыту работы в нефтегазовой сфере, в РФ с этим беда).

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

Почему именно VBA.NET?

1) Дело в том, что я сам - программист C++. Соответственно, в первую очередь подумал написать простенькое приложение на Qt, используя какой-либо open source для чтения Word/Excel. Что удалось найти:

  • Microsoft Office C++ SDK: официальный SDK от Microsoft, который предоставляет API для работы с Microsoft Office из C++

  • Aspose Words: библиотека, которая предоставляет API для создания, чтения, редактирования и сохранения документов Word/Excel в C++

  • DucX: открытая библиотека для работы с XML-документами

  • Использование системных header-файлов ("windows.h ", "altbase.h", "atlcom.h", "cmutil.h") и компонентной библиотеки "msword.olb".

Первые два варианта показались мне неприемлемыми с точки зрения трудозатрат. Не было времени с ними разбираться, необходимо было добиться цели как можно быстрее и, что самое главное, более простым путем для инженера. Третий вариант оказался скудноват со стороны функциональности. Четвёртый вариант - пожалуй, лучшее решение, но есть большая заморочка с тем, чтобы сконвертировать "msword.olb" в привычный header-файл при помощи компилятора midl.exe (по идее он на все ОС Windows имеется). От идеи использования C++ я отказался.

2) Идем дальше. Какой из языков программирования имеет простой синтаксис и широко развитое сообщество? Python. Что удалось найти по работе с Word:

С точки зрения необходимой функциональности и полноты документации выбор пал на python-docx. Быстро написал программку. Основной барьер с таким решением - это необходимость установки интерпретатора python и библиотек на все рабочие ПК, где будет решаться описанная задача. Отдел кибер-безопасности не пропускает (в моей карьере это уже не первое предприятие нефтегазовой сферы, не дающее устанавливать ничего "такого стороннего"). Обход - завернуть все в *.exe при помощи pyinstaller, но тогда теряется скорость и exe-шник весит много. Согласен, аргументы так себе, поэтому идея использования python для решения задачки - это отличная мысль (если у вас нет никаких препятствий по его установке). Я же захотел идти по менее "костыльному" пути.

3) Идем дальше. Весь пакет Office - от Microsoft, C# - тоже от него. Более чем на 100% был уверен, что в шарпах есть нужный мне пакет, который я с легкостью смогу подтянуть. Так и оказалось:

К сожалению, написав программу на C# с использованием первых двух пакетов, я столкнулся с двумя проблемами:
- Microsoft.Office.Interop.Word/Excel не будет работать, если (предположительно) на вашем ПК стоит repack, но не лицензированный Office-набор, а также если версия вашего Word/Excel не соответствует версии пакета Microsoft.Office.Interop: ошибка "System.IO.FileNotFoundException HResult=0x80070002 Could not load file or assembly 'office, Version=15.0.0.0".
- На компьютере нет .NET (не спешите высмеивать меня за то, что я этого не знал, ибо всерьез предполагалось, что на всех современных машинах в совокупности ОС Windows идет и платформа .NET для заранее возможной автоматизации).

Альтернативное решение (Aspose.Words и Aspose.Cells) мне не помогло, по каким-то причинам пакет неверно подсчитывал число таблиц во входном документе.

4) Вспомнив пары по информатике в своём инженерном ВУЗе и получив дополнительный совет от технического лидера своей команды, решил зайти со стороны VBA.NET. В целом, и искать ничего не пришлось, язык ведь именно для задач подобного рода и создан.
- DocumentFormat.OpenXml.Packaging и DocumentFormat.OpenXml.Wordprocessing для Word
- Microsoft.Office.Interop.Excel для Excel

Следует подчеркнуть, что справился со своей задачей на ура. Во-первых, абсолютно верно парсит содержимое Word-документа. Во-вторых, имеет интуитивно понятный синтаксис, если вы хорошо читаете по-английски, то код будет восприниматься как некоторый понятный текст/рассказ. В-третьих, решает проблему "отдела кибер-безопасности": опубликованное при помощи IDE приложение без антивирусных вопросов устанавливается на машину, но, если вам все равно попробуют вставить палки в колеса, не дав устанавливать на рабочий ПК "ничего такого стороннего", вы с легкостью можете применить Ctrl+C И Ctrl+V, чтобы перенести код в любой Word-файл, сохранённый в режиме поддержки макросов.

Код проекта-примера и описание, как его сделать

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

Пример простенького парсинга word-файлов и excel-я я выложил на своем GitHub. Там же и пример того, как это нативно сделать на python (вдруг вы из той команды инженеров, которые сами являются администраторами своих рабочих ПК). В репозиторий закинул документацию для кода, чтоб проще было ознакомиться с Visual Basic.NET.

Итак, у вас есть весь шаблон, который вы можете насыщать собственной бизнес-логикой. Детальный разбор каждого метода именно с точки зрения кода, а также пара вводных по синтаксису, находятся здесь. Я постарался сделать краткую выжимку теории вкупе с практикой таким образом, чтобы вы, потратив на разбор один-два вечера, смогли применить полученные знания у себя на работе. Не ленитесь заглядывать на GitHub.

Выводы

Вывод напрашивается очевидный: я пытался "ударить огромной кувалдой по маленькому гвоздику", когда пробовал решить описанную задачу на C++. C# - менее тяжелый вариант, однако тянущий за собой сложности, разбираться в которых времени и желания у инженера, думаю, нет. Python, повторюсь, - самое то. Если вы на работе являетесь админом своего ПК, то однозначно он. Но если вам запрещают что-то устанавливать, то Visual Basic - прекрасное решение, ведь на крайний случай можно просто "скопипастить" код в docx-документ, сохраненный с макросами.

Пожелания

Это мой первый труд, опубликованный здесь. Коллеги-программисты, если у вас есть опыт решения подобных задач еще какими-либо простыми путями, пожалуйста, поделитесь (особенно интересен C++). Уважаемые инженеры, буду признателен за обратную связь, если описанный проект-пример понятен вам как человеку, который не пишет код ежедневно. Надеюсь, кому-то данный материал действительно принесет пользу в вопросах рабочей рутины.

Комментарии (48)


  1. itGuevara
    07.06.2023 08:50
    +1

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

    Поэтому, чтобы самому себе помочь (даже не по инженерным задачам) приходится использовать то, что есть на каждом ПК: VBA, JS (браузерный), bat. Подобную проблему \ решение читал и в западных историях.


    1. Surrogate
      07.06.2023 08:50
      +1

      Самое главное достоинство VBA - низкий порог вхождения!

      1. Включил макрорекордер на запись

      2. Сделал что нужно используя пользовательский интерфейс

      3. Остановил запись

      4. Допилил напильником код для повторного использования

      5. PROFIT…


      1. Akina
        07.06.2023 08:50
        +1

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


        1. Surrogate
          07.06.2023 08:50
          +1

          Пункт 4 как раз требует достаточно приличных знаний

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

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

          Еще из плюсов VBA, что пользователю можно пользоваться системными константами (Enumerations), того приложения под которое пишется код.


    1. qyix7z
      07.06.2023 08:50

      что есть на каждом ПК: VBA, JS (браузерный), bat.
      VBA зависит от наличия установленного офиса, а вот VBScript точно из коробки имеется.


  1. aborouhin
    07.06.2023 08:50
    +3

    Простите, но как Ваш код на VB.NET решает описанные в тексте применительно к C# проблемы? Куда Вы его предлагаете пользователю "скопипастить в docx-документ", ведь в VBA используется классический VB, а не .NET? У Вас получилось ровно то же самое решение, что можно было бы сделать на C#, со всеми его недостатками, только с другим синтаксисом. А чтобы реализовать это же на VBA, код надо переписать под другую версию языка.


    1. starfair
      07.06.2023 08:50

      Сталкивался с подобной автора проблемой, но для автоматизации на CorelDraw. VB в целом более "толерантен" к изменениям API, нежели С#. Почему - не стал разбираться, ибо просто не было особой нужды. Но в целом - факт остаётся фактом, на VB (а тем более на VBA) "проще" что то написать и поддерживать, если требуется создавать некий прикладной код на зоопарк версий.


      1. aborouhin
        07.06.2023 08:50

        Конкретно в этом случае проблемы с совместимостью assemblies (если они есть) будут на уровне .NET, независимо от того, на C# или VB.NET написан код. Без необходимости тащить пользователям бинарник (EXE или надстройку) тоже не обойтись.
        Объём работы, необходимой для переработки этого кода с VB.NET на VBA я не оценивал, но как минимум это не copy&paste.

        P.S. Да и несуществующий (увы) VBA.NET в тегах намекает, что автор немного запутался...


        1. starfair
          07.06.2023 08:50

          Может быть и так. Хотя, как я понял, скорее речь идёт о неких универсальных наборах интерфейсов для VB.NET, благодаря использованию которого можно отвязаться от использования для работы с документами непосредственно exe самого офиса. Тогда проблема уходит использования кода завязанного на assemblies, а значит и проблема с изменением API от версии к версии. Просто пишешь своё приложение, которое на VB пишется в общем то легче, по сравнению с кучей особенностей C#, и получаем для своих задач некую тулзу, работающую с общераспространнёным форматом офисных файлов.


          1. aborouhin
            07.06.2023 08:50
            +1

            Что C#, что VB.NET компилируется в .NET IL, на чём вся разница между ними исчезает. Так что выбор VB.NET может быть обусловлен тем, что он кому-то проще/привычнее, но не более.
            А вот VBA - совсем другая история.


            1. starfair
              07.06.2023 08:50

              Я не великий специалист по VB.Net, но насколько я помню этот вопрос, тут дело скорее в простоте работы с ActiveX в плане загрузки и манипуляций, так как там всё работает примерно так же как и в VBA. Поэтому, не так важно во что превращается код после компиляции. Важнее то, насколько просто начинать и поддерживать работу по автоматизации. В С# контроль за всей этой историей куда строже, и поэтому код там уже куда сильнее будет привязан к конкретным версиям используемых объектов и их интерфейсов, нежели в VB


              1. aborouhin
                07.06.2023 08:50

                Нет, Вы как раз пишете про классический VB (версий до 6 включительно), который работает с COM (ActiveX), и на базе которого построен VBA.

                А VB.NET построен на платформе .NET и с внешними зависимостями работает ровно так же, как и любое приложение, написанное на любом другом .NET языке. Поэтому и итоговый бинарник будет точно так же привязан или не привязан (тут я предположения автора подтвердить или опровергнуть не могу, сам не сталкивался) к версиям, как если бы он был написан на C#.


                1. starfair
                  07.06.2023 08:50

                  Ну, может и так. Хотя, глянул сейчас вот немного порылся по этому поводу, и собственно отчасти соглашусь, отчасти всё равно сложилось впечатление,что VB.Net менее требователен в плане работы с кодом ActiveX компонентов. Хотя, опять же - спорить не буду. Может автор и правда использовал VB именно из-за очень большого сходства с привычным по MS Office и сравнительно простым VBA.


        1. Okker Автор
          07.06.2023 08:50

          Согласен, Вы правы. Подправил. Речь именно про VBA.NET


          1. starfair
            07.06.2023 08:50
            +1

            VBA.NET? Это что за зверь такой?


            1. Okker Автор
              07.06.2023 08:50

              https://ru.m.wikipedia.org/wiki/Visual_Basic_.NET

              Вот этот)

              Ведь по факту я писал программку с использованием именно его


              1. starfair
                07.06.2023 08:50
                +6

                А вы разницу между VBA (Visual Basic for Application),VB и VB.NET не пробовали выяснить, прежде чем писать VBA.NET?


    1. Okker Автор
      07.06.2023 08:50
      -1

      Смотрите, код VBA.NET помог мне избавиться от тех ошибок, которые выскакивали в момент использования C# и необходимых пакетов. Я согласен, что данную задачку можно и на C# легко осилить, но лично на моем ПК вылезли те ошибки, что я привел (у меня как раз crack).

      По поводу сравнения VBA.NET/VBA: Вы думаете, что синтаксис будет и внешний облик кода отличаться кардинально?


      1. aborouhin
        07.06.2023 08:50
        +5

        Во-первых, никакого VBA.NET не существует (а очень жаль).

        Во-вторых, синтаксис будет отличаться. Степень кардинальности не знаю, в каких попугаях измерить, конечно. Но это точно не уровень "скопировать код в документ". Можете последовать собственной рекомендации, скопировать Ваш код в VBA-редактор Office и посчитать количество ошибок :)

        И прежде всего, отличается сам механизм взаимодействия с вшеними компонентами. В VB.NET Вы ссылаетесь на .NET Assemblies, в VBA - используете COM-компоненты. Скажем, Вы используете DocumentFormat.OpenXml. Есть ли аналог этого пакета для COM, который можно использовать в VBA? Не знаю, может и есть, но из установленного по умолчанию точно ничего не находится.


        1. Okker Автор
          07.06.2023 08:50

          Спасибо за развернутый ответ!


      1. mayorovp
        07.06.2023 08:50

        Смотрите, код VBA.NET помог мне избавиться от тех ошибок, которые выскакивали в момент использования C# и необходимых пакетов.

        Вот вы использовали пакеты DocumentFormat.OpenXml.* в вашем "VBA.NET". Почему вы даже не попытались использовать их же в C#?


        Или вот вы пишете что у вас заработал Microsoft.Office.Interop.Excel в вашем "VBA.NET". Но это абсолютно тот же самый Microsoft.Office.Interop.Excel что и в C#, который у вас, якобы, не работал.


        Или вот упомянутая вами проблема с отсутствием .NET, который вы решили… как-то. Почему вы даже не пытались применить то же самое решение для C#?


        1. Okker Автор
          07.06.2023 08:50

          Во вторую очередь я написал программку именно на C#. Да, пакеты те же, все вы верно говорите)

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


  1. webhamster
    07.06.2023 08:50

    Как Vsiual Basic отлично помогает решать инженерные задачи

    Возможно не все в курсе, но... Visual Basic - самый страшный язык программирования по мнению пользователей Stackoverflow

    https://infostart.ru/journal/news/tekhnologii/sayt-stack-overflow-nazval-samye-strashnye-i-samye-lyubimye-yazyki-programmirovaniya_1250744/

    https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-dreaded


    1. LuchS-lynx
      07.06.2023 08:50

      Ну не знаю, как по мне язык и язык, что-то в нем удачного есть, что-то устаревшего, что-то не очень удачного. Он вполне решает проблемы для офисного ПО, но в то же время он не оптимизирован на многопоточность (VB6.0 это конец 90х, когда о многопроцессорности/многоядерности можно было только мечтать, хотя материнские платы на 2 сокета уже тогда были, а вот HT еще нет)


    1. DMGarikk
      07.06.2023 08:50

      Visual Basic — самый страшный язык программирования по мнению пользователей Stackoverflow

      было бы забавно послушать аргументы
      VB (который 6.0) вполне себе рядовой язык по нынешним меркам, я бы даже рискнул его с питоном сравнить по отношению к типизации и по наличию основ ООП, что в нем такого "страшного", опятьже, опираясь на день сегодняшний, мне сложно придумать


      когда я еще в школе учился, в огромный недостаток и минус ему приписывали возможность (причем отключаемую) динамической типизации


  1. LuchS-lynx
    07.06.2023 08:50
    +1

    Сейчас потихоньку заставляют переходить на иностранное ПО, судя по всему тут или перспектива макросы писать на StarBasic, т.к. LibreOffice идет почти в каждом линуксе из коробки, или есть еще из реестра одинаковый с лица AlterOffice. Либо переходить на python, но с ним много подводных камней в корпоративной среде, хотя бы потому что его надо ставить...
    Другие российские офисы не позволяют работать макросом с диском, т.е. открыть/записать файл, МойОфис отличился с LUA, макросом нельзя даже получить системное время и дату. Чуть получше с JS у Р7, но по факту все так же ни кнопку создать и макрос к ней привязать, ни файл открыть/записать/закрыть на диске.


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

    https://www.minstroyrf.gov.ru/tim/xml-skhemy/


    1. starfair
      07.06.2023 08:50

      Хм, а что разве в поставке Lua "МойОфис" отключили os.date() os.time()?
      Согласен, выбор Lua для автоматизации спорен, но имеет и собственно большой плюс в том, что очень многое можно расширить за счёт загружаемых налету модулей, в том числе и бинарных. Так что, в теории можно даже своё GUI припилить, вместо убогого родного. Конечно внутренний API по работе с документами там довольно убогий, на фоне MS Office, но для 99% офисных работ по тексту и таблицам вполне должно хватить, если не брать что то очень извращённое.


      1. LuchS-lynx
        07.06.2023 08:50

        Хм, а что разве в поставке Lua "МойОфис" отключили os.date() os.time()?

        проблема в том, что os.time() здесь не работает, а при использовании DocumentAPI.DateTime из инструкции макрос выдает ошибку: либо nil, либо пусто, если прописать его в переменную с конвертацией типа в текст.

        Так что, в теории можно даже своё GUI припилить, вместо убогого родного. Конечно внутренний API по работе с документами там довольно убогий, на фоне MS Office, но для 99% офисных работ по тексту и таблицам вполне должно хватить, если не брать что то очень извращённое.

        Я в прошлом году тестировал несколько офисов на скорость чтения/записи в ячейку и работоспособность кое-каких решений... В общем МойОфис был самым медленным, они, с тех пор, допилили код, но все никак не дойдут руки посмотреть как и что там поменялось
        https://habr.com/ru/articles/674580/

        но для 99% офисных работ по тексту и таблицам вполне должно хватить, если не брать что то очень извращённое.

        Мне как раз нужно изощренное - передавать данные из одного файла в другие в пакетном режиме


        1. starfair
          07.06.2023 08:50

          проблема в том, что os.time() здесь не работает, а при использовании DocumentAPI.DateTime из инструкции макрос выдает ошибку: либо nil, либо пусто, если прописать его в переменную с конвертацией типа в текст.

          Специально полез и проверил. Вполне себе работает.

                  begin_pos:insertText("Текст в начале строки")
                  begin_pos:insertText("Второй параграф")
                  begin_pos:insertText("Дата и время создания" .. os.date())

          Выводит такое вот в документ:

          Про os.time() - так оно выводит в мс от даты 01.01.1970 00:00 и требует пересчёта (формула довольно большая, но вполне себе общедоступная). Чтобы получить время в общепринятом смысле, надо задавать формат вывода в os.date("%H:%M") Подробнее можно в руководстве глянуть
          Что касается DocumentAPI.DateTime - так это просто формат данных, который используется внутри специального сервиса отслеживания изменений документа, и как я понял, отдельно его использовать не удастся

          Я в прошлом году тестировал несколько офисов на скорость чтения/записи в ячейку и работоспособность кое-каких решений... В общем МойОфис был самым медленным, они, с тех пор, допилили код, но все никак не дойдут руки посмотреть как и что там поменялось

          Ну, тут спорить не буду. Почитал вашу статью. Я ещё так глубоко в работы именно с таблицами в МойОфис не зализал, но сдаётся мне, вы просто не настолько глубоко углубились в тему Lua, поэтому и может быть, использовали автоматизацию не совсем так, как предусматривали это разработчики. Хотя да - там всё сложно, и похоже что автоматизация там сделана для "галочки" и толком его развитием никто не занимается. API крайне слабое и неполное. Описание тоже мягко говоря оставляет желать лучшего.

          Мне как раз нужно изощренное - передавать данные из одного файла в другие в пакетном режиме

          Так вроде особых проблем нет, хотя конечно не знаю что вы конкретно имеете ввиду. Средствами офиса через API и читать, и создавать и сохранять файлы (правда, это в основном только в формате самого МойОФис)


          1. LuchS-lynx
            07.06.2023 08:50
            +2

            Ответ службы поддержки год назад

            Так вроде особых проблем нет, хотя конечно не знаю что вы конкретно имеете ввиду.

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

            https://habr.com/ru/articles/344956/

            https://habr.com/ru/articles/359218/

            Вот так это выглядит на практике, то что хочу переписать


            1. starfair
              07.06.2023 08:50

              А! Ясно!
              Я макросы вообще не рассматриваю как средство автоматизации! Я пробую из надстроек. Так всё работает. Макросы это вообще изврат в исполнении разработчиков, так как их нельзя в тех же таблицах вызвать по имени в формулах тех же таблиц. Нельзя привязать к какому нибудь контролу в документе (их в тексте документа опять же просто нет). А работа вручную - такое себе удовольствие! На моё недоумение, мне в службе поддержки сказали что такого в планах нет.

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

              Скажу честно - пробежался вкратце, но я как раз занимался недавно схожими задачами. Правда, более касаемо в разрезе просто внутренней документации проектной организации. Пилилось схожее на специализированом отечественном ПО под названием "Lotsia". В плане программирования чего либо в нём - сущий ад и "мойофис" во многом может показаться ещё и ничего. Но в плане как раз схожих задач по генерированию чего то схожего с описанным - там есть довольно много уже автоматизированного. Но рекомендовать не буду, ибо реализация проектной СЭД там отвратная, как по мне. И я смотрю, что никто так толком ничем у нас в стране заниматься особо не спешит, ибо при отсутствии альтернатив, "программисткие ёжики будут плакать, ругаться, но всё равно лезть на кактус". То есть или пользоваться с матами то чем дали, или изобретать велосипеды каждый на своём рабочем месте.


              1. LuchS-lynx
                07.06.2023 08:50
                +1

                Я пробую из надстроек. Так всё работает. Макросы это вообще изврат в исполнении разработчиков, так как их нельзя в тех же таблицах вызвать по имени в формулах тех же таблиц.

                Почему нельзя? Можно, только объявляешь не declare sub, а declare function, при этом функция может что-то возвращать, а может и нет, тут как сам код пропишешь/настроишь.

                Нельзя привязать к какому нибудь контролу в документе (их в тексте документа опять же просто нет)

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

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

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


                1. starfair
                  07.06.2023 08:50

                  Ещё раз, чтобы не было недопонимания - я вам написал про МойОфис и ваши старания в нем, а не про MS Office/


                  1. LuchS-lynx
                    07.06.2023 08:50
                    +1

                    Тогда прошу пардону. по МойОфис у меня у самого, как я писал выше, много вопросов на которых нет ответа, из-за чего его не могу рассматривать как альтернативу для себя и своей команды в разработке ПО в рамках малой автоматизации оформления документации в стр-ве. Увы, LibreOffice тут безусловно выглядит более предпочтительным вариантом, хотя тоже не идеальным


    1. Okker Автор
      07.06.2023 08:50

      Абсолютно согласен, что с python есть великая проблема потому, что его надо ставить. Лично постоянно встречался с таким в инженерной сфере


      1. LuchS-lynx
        07.06.2023 08:50

        Тут уж не так много вариантов, хотя под Линуксом можно попробовать упаковать в Appimage, да и под Винду вроде есть варианты откомпилировать в портативные сборки


  1. schebotar
    07.06.2023 08:50

    Я подобную рутинную задачу решил написав надстройку для Excel с помощью библиотеки Excel-DNA. У меня входные данные только Excel файлы правда, но парсер можно и вордовских написать, без проблем. Так реализовал экспорт спецификации в девятиграфку в dwt например. Тут же импорт другой будет.
    Код на VB ваш в Excel-DNA тоже можно адаптировать. .NET же

    .NET кстати на машине целевой возможно и есть, но рантайма нужной версии нет.


    1. Okker Автор
      07.06.2023 08:50

      Надстройку написали на VBA.NET?

      Есть ли что-то такое (для прасинга Word/Excel), но на плюсах?


      1. schebotar
        07.06.2023 08:50

        Писал на C#
        Вам немного разобраться нужно что такое .NET платформа.
        Она поддерживает и VB, и например F#. На сайте той же библиотеки что я упомянул есть примеры и на этих языках. Они потом все в MSIL компилируются.


  1. DikSoft
    07.06.2023 08:50
    +2

    Забавно. Тоже надо было повозиться с чужими большими таблицами, а вспоминать VBA было лень. Ну и из Powershell вылезать тоже лень.

    $xl = New-Object -COM "Excel.Application"
    $xl.Visible = $true
    $wb = $xl.Workbooks.Open($InputFile)
    #select first sheet 
    $ws = $wb.Sheets.Item(1) 
    ...
    $objRange = $ws1.UsedRange
    $xlCellTypeLastCell = 11
    $objLastcell = $objRange.SpecialCells($xlCellTypeLastCell)
    $lastrow = $objLastcell.row
    $lastcolumn = $objLastcell.column
    

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


    1. Surrogate
      07.06.2023 08:50

      - тут хороший набор подсказок.

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


      1. DikSoft
        07.06.2023 08:50
        +1

        Похоже что-то в движке Хабра сломалось. Вчера ссылка работала:
        https://www.myfaqbase.com/q0001773-Scripting-Powershell-5-0-Working-with-Microsoft-Office-Excel-part-1.html


        1. Surrogate
          07.06.2023 08:50

          Большое спасибо !


  1. GreedyHamster
    07.06.2023 08:50

    Писать приложение на VB.NET для системы, где dotNET отсутствует... Сильно... Для WinXP? Т.к. начиная с Висты dotNET ставится с ОС по умолчанию.

    Не проще ли написать надстройку на VBA, к-рая не создаст никаких проблем на ограниченном аккаунте?


    1. Okker Автор
      07.06.2023 08:50

      Вы уверены, что платформа идет с ОС по умолчанию? На целевом рабочем ПК возникала ошибка «отсутствия .NET», пока я не «опубликовал» решение и не получил setup.exe

      Если .NET отсутствует, разве не завернет setup.exe при установке приложения на целевой ПК необходимые компоненты?

      С точки зрения ограниченности аккаунта, такое может быть проще. Но в моем случае проблем с установкой не оказалось (именно скомпилированной проги)


      1. Dimsml
        07.06.2023 08:50

        Вы уверены, что платформа идет с ОС по умолчанию?

        Посмотрите в папке, C:\Windows\Microsoft.NET\Framework64\*version* , там должен быть файлик csc.exe, наведите на него мышкой и посмотрите что за подсказка всплывает.

        По идее, с новыми версиям Windows должна по умолчанию идти какая-то версия .NET FW. Вот тут галка рядом с версией - должно быть установлено по умолчанию как компонент системы.


      1. aborouhin
        07.06.2023 08:50

        У Вас сборка под .NET Framework 4.7.2, который идёт в комплекте с Win 10 v. 1803 и выше.


      1. GreedyHamster
        07.06.2023 08:50

        Вы уверены, что платформа идет с ОС по умолчанию?

        Да, начиная с Висты.