Всем привет. В этой статье я хочу поделиться опытом написания кода на VBA.NET, созданного для решения рутинной задачки, связанной с парсингом Word-файла, последующей "бизнес-логикой" и выгрузкой результата в Excel. Скажу сразу: статья ориентирована больше на инженеров, работающих в производственных сферах и использующих Word/Excel, нежели чем на программистов. В общих словах, необходимо взять два Word-файла (старый и новый), выделить в каждом из них таблицы, удовлетворяющие определенному условию, далее вычленить из них столбцы № 3 (наименование) и 4 (номер ревизии). Затем нужно пробежаться по датасету нового файла и определить: новые наименования (еще не было в старом Word-файле) - "new"; старые наименования, ревизия которых не изменилась - "not changed"; старые наименования (уже есть в старом Word), ревизия которых увеличилась строго на 1 - "changed"; старые наименования, ревизия которых НЕ увеличилась на 1 - "mistaked". Задачка поступила от близкого мне человека, только-только вышедшего на новое место работы. Все его коллеги-инженеры проделывали эту работу руками через Ctrl+C и Ctrl+V. И, как самому молодому птенцу, поручили дерьмовую рутинную работу именно ему. Выходит, мне нужно было придумать что-то относительно простенькое, что поймет человек, программистом не являющийся, а также то, что пройдет бюрократический барьер отдела кибер-безопасности (по моему личному опыту работы в нефтегазовой сфере, в РФ с этим беда). Надеюсь, что ты, уважаемый инженер-читатель, прочтешь описанные тут примеры и тебе все станет более или менее понятно. 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: Aspose.Words for python python-docx docxpy С точки зрения необходимой функциональности и полноты документации выбор пал на python-docx. Быстро написал программку. Основной барьер с таким решением - это необходимость установки интерпретатора python и библиотек на все рабочие ПК, где будет решаться описанная задача. Отдел кибер-безопасности не пропускает (в моей карьере это уже не первое предприятие нефтегазовой сферы, не дающее устанавливать ничего "такого стороннего"). Обход - завернуть все в *.exe при помощи pyinstaller, но тогда теряется скорость и exe-шник весит много. Согласен, аргументы так себе, поэтому идея использования python для решения задачки - это отличная мысль (если у вас нет никаких препятствий по его установке). Я же захотел идти по менее "костыльному" пути. 3) Идем дальше. Весь пакет Office - от Microsoft, C# - тоже от него. Более чем на 100% был уверен, что в шарпах есть нужный мне пакет, который я с легкостью смогу подтянуть. Так и оказалось: Microsoft.Office.Interop.Word для работы с Word; Microsoft.Office.Interop.Excel для работы с Excel; Aspose.Words и Aspose.Cells как альтернатива. К сожалению, написав программу на 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++). Уважаемые инженеры, буду признателен за обратную связь, если описанный проект-пример понятен вам как человеку, который не пишет код ежедневно. Надеюсь, кому-то данный материал действительно принесет пользу в вопросах рабочей рутины.  C++ разработчик