Дано: клиенты присылают заказы на закупку в Excel’е. Excel файлы у всех одинаковой структуры, только содержимое каждый раз разное. Как мне сделать так, чтобы я мог запускать выгрузку из этих файлов в формат, пригодный для импорта заказов на продажу в iScala?

Логичным видится создать макрос. Я так и сделал.

Но он будет доступен только в том файле, который я создал, а хотелось бы, чтобы он был доступен при открытии любого присланного файла с заказом и при этом не надо было бы открывать какой-то дополнительный файл. Для этого мы можем сохранить его в виде надстройки Excel (файл с расширением .xlam. По-русски звучит смешно 🙂 ):

Теперь нужно подключить сохранённую надстройку, для этого перейдите в параметры Excel — «Файл -> Параметры -> Надстройки»:

Внизу формы найдите «Управление», выберите «Надстройки Excel» и нажмите кнопку «Перейти». Появится форма «Надстройки». Нажмите «Обзор»:

Выберите нужный файл, который мы сохранили в качестве надстройки ранее:

Теперь надстройка доступна для использования. Но как нам её использовать? Точнее, не её, а требуемый нам макрос. Откроем файл, который нам присылает клиент. В нём макроса нет, он в надстройке. Попробуем просмотреть код макроса: с помощью комбинации клавиш Alt + F11

Да, при просмотре кода он доступен. А теперь посмотрим, список макросов, ведь пользователь не будет входить в просмотр кода, ему нужно каким-то образом вызвать макрос:


Вот это сюрприз! И что теперь делать?
Конечно, посмотреть, как это сделано у кого-нибудь другого 🙂 Хороший пример — добавление нашего макроса в меню Excel на закладку «Надстройки». Для этого в файле надстройки, которую мы создали раньше, необходимо добавить несколько строк кода, например, так:

Private Sub Workbook_Open()
Dim MyNewMenu As CommandBarPopup ' Выпадающее пользовательское меню
Dim cmdSubBarCtrl As CommandBarControl ' Пункт выпадающего меню
Dim MenuExists As Boolean ' Флаг существования пользовательского меню
Dim SubMenu As CommandBarPopup ' Выпадающее подменю
Dim SubCmdCtrl As CommandBarControl ' Пункт выпадающего подменю
Dim rcnt, ccnt, i, cel
Set WorksheetsMenuBar = Application.CommandBars.ActiveMenuBar
MenuExists = False
For Each cmdBarCtrl In WorksheetsMenuBar.Controls
If cmdBarCtrl.Caption = "SalesOrder" Then
Application.CommandBars("worksheet menu bar").Controls("SalesOrder").Delete
End If
Next cmdBarCtrl
MenuExists = True
If Not MenuExists Then
MsgBox ("ROOT is not found")
End If
Set MyNewMenu = WorksheetsMenuBar.Controls.Add(Type:=msoControlPopup, Temporary:=False)
MyNewMenu.Caption = "SalesOrder"
Set SubCmdCtrl = MyNewMenu.Controls.Add(Type:=msoControlButton, Temporary:=False)
With SubCmdCtrl
.FaceId = 3271
.Caption = "Export to TXT file"
.OnAction = "Module1.To_TXT_File"
End With
End Sub
Не забудьте сохранить код, нажав на кнопку «Сохранить»! Перезагрузите Excel. Снова откройте присланный файл с заказом покупателя, перейдите на закладку «Надстройки»:

Макрос запускается!

А вот и наш файл:




