В этой статье мы описываем макрофункцию ExecuteExcel4Macro, давно забытую и фактически устаревшую функцию, которая, тем не менее, помогла нам автоматизировать процесс подбора, используя только файлы Excel, список кандидатов и библиотеку документов на SharePoint.

Разумеется, это было только временное решение, и мы уже заменили его российским специализированным ПО, автоматизирующим HR-процессы в сфере управления талантами.

Кратко про ExecuteExcel4Macro

Функция ExecuteExcel4Macro умеет считывать данные из одной ячейки из книги Excel, и не важно какой: открытой или закрытой, хранящейся на локальном жестком диске или в сети.

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

Sub Hello_ExecuteExcel4Macro()

'1: С локального жесткого диска, используя ссылки R1C1:
Debug.Print _
ExecuteExcel4Macro("'C:\TEMP\[Workbook.xlsx]Worksheet'!R1C1")

'2: С локального жесткого диска, используя именованный диапазон, примененный к одной ячейке:
Debug.Print _
ExecuteExcel4Macro("'C:\TEMP\Workbook.xlsx'!NAMED_RANGE_OF_ONE_CELL")

'3: Из сети, используя ссылки R1C1:
Debug.Print _
ExecuteExcel4Macro("'https://binaries.templates.cdn.office.net/support/templates/en-gb/[tf10000091.xlsx]Time Sheet'!R5C2")

'4: Из сети, используя именованный диапазон, примененный к одной ячейке:
Debug.Print _
ExecuteExcel4Macro("'https://binaries.templates.cdn.office.net/support/templates/en-gb/tf10000091.xlsx'!WorkweekHours")

End Sub

Ограничение функции ExecuteExcel4Macro

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

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

Что же касается типов данных, то функция импортирует данные как vbDouble, vbString и vbBoolean.

Пример применения

Предположим, что наши пользователи вводят данные в книги Excel, основанные на едином шаблоне, и сохраняют их в библиотеку документов на SharePoint. Скажем, более 20 рекрутеров, более 1000 заявок на подбор, хранящихся в более 100 папках на SharePoint.

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

Как показано на рисунке ниже, целевая книга имеет результирующую таблицу и VBA-процедуру, которая, в свою очередь:

  1. Проверяет именованные столбцы в целевой таблице, напр., «Имя1» и «Имя2»

  2. Находит книги-источники в требуемой директории на SharePoint

  3. Импортирует данных из именованных ячеек из книг-источников в результирующую таблицу в соответствующие именованные столбцы

Настройка именованных диапазонов в книгах Excel для импорта с помощью ExecuteExcel4Macro
Настройка именованных диапазонов в книгах Excel для импорта с помощью ExecuteExcel4Macro

В данной статье мы не объясняем, как получить список файлов для формирования запросов, т.к. это можно сделать различными способами в зависимости от расположения файлов. Например, мы подключали SharePoint как сетевой диск.

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

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

Демонстрация: https://youtu.be/IMtmn2CT-0E

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


  1. iingvaar
    00.00.0000 00:00
    +1

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


    1. starfair
      00.00.0000 00:00
      +1

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


      1. LuchS-lynx
        00.00.0000 00:00

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


        1. starfair
          00.00.0000 00:00

          Эмм, не уверен , что речь идёт о записи в файл Excel. Как я понял, наоборот - о считывании информации из файла формата эксела, без необходимости проводить всю процедуру по открытию документа. Для записи в ячейки, наверное придётся делать все процедуры с созданием объекта и открытием в нём документа.
          PS.Посмотрел в описание, и я в первом комментарии был не совсем прав. Это свойства объекта Application, которое создаётся при открытии через CreateObject("Excel.Application"), так что объект всё равно создавать надо.


          1. LuchS-lynx
            00.00.0000 00:00

            в любом случае поезд уже ушел... сейчас приняли решение о переработке кода под python с написанием интерфейса на qt что бы теперь приложение было кроссплатформенным.


            1. starfair
              00.00.0000 00:00
              +2

              Ну, сейчас многие в силу известных событий убегают из проприетарных решений Microsoft в пользу более открытых. Хотя, по моему мнению и опыту, как ни ругают VBA, а с точки зрения простоты бизнес-автоматизации я так и не нашел аналогов. Хотя, если смотреть на кроссплатформеность, то связка Python+Qt наверное и правда самая перспективная.


    1. Tamerlan_Hajiyev
      00.00.0000 00:00

      Reverse engineering only.


    1. Latyshenko Автор
      00.00.0000 00:00

      Рад, что шокировал эксперта. Тут видео https://youtu.be/IMtmn2CT-0E с демонстрацией идеи, описанной в статье.


  1. Ad_fesha
    00.00.0000 00:00

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


    1. Latyshenko Автор
      00.00.0000 00:00

      Когда выбирал платформу для решения, смотрел также VSTO – но не нашел никаких ощутимых преимуществ по сравнению с VBA, помимо учебных, конечно. По аналогии - Python+Qt и другие языки не рассматривал, т.к. выгоды не были очевидны.