Совместное использование модулей VBA в книгах

#excel #vba

#excel #vba

Вопрос:

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

Есть ли способ совместного использования модулей VBA во всех моих книгах, чтобы я мог вносить изменения только в одном месте?

Комментарии:

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

2. Вы могли бы изучить использование надстройки для функций.

Ответ №1:

Переместите код в отдельную книгу Excel и сохраните его как .xlam (надстройка с поддержкой макросов Excel).

Обратитесь к надстройке из инструментов — ссылок всех других файлов (нажмите Обзор, измените тип файла на «Файлы Microsoft Excel» и перейдите к файлу xlam).

Просмотрите код и убедитесь, что он написан правильно и должным образом ссылается на книги и рабочие листы. Например. ThisWorkbook теперь будет ссылаться на книгу надстройки, а не на документ, вызывающий ее.

Ответ №2:

Я получил любительское исправление для такого рода вещей. В моем офисе работает около 15 человек, которые совместно используют некоторые утилиты и UDF-файлы в EXCEL. Нам пришлось изменить 15 книг Excel, когда код нужно было пересмотреть или улучшить. Пустая трата времени

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

Мы нашли простое для нас решение. Я почти уверен, что действительно есть лучший способ сделать это, более элегантный, но это работает у нас последние 10 лет, и с нас хватит.

Мы создали ОСНОВНУЮ КНИГУ со всеми необходимыми подразделениями и функциями. Я приведу краткий пример. Эта основная книга называется MASTER_WB (название VBAProject также MASTER_WB)

введите описание изображения здесь

Этот MASTER_WB-файл будет содержать все ваши утилиты и распространенные коды. Как вы можете видеть на изображении, я набрал 1 sub и 1 UDF очень просто (как Public , для вызова из любого места).

Кроме того, я настоятельно рекомендую использовать инициалы MW в каждом подразделении / функции, которые вы вводите в MASTER_WB. Таким образом, вы на 100% уверены в отсутствии конфликта имен между USER_WB и MASTER_WB, вызывающими одну и ту же процедуру. Это просто личное исправление.

В этом MASTER_WB соответствующий код находится в объекте workbook:

 Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = True
End Sub

Private Sub Workbook_Open()
If Application.Workbooks.Count > 2 Then '2 BECAUSE I got also PERSONAL MACRO WORKBOOK
    ThisWorkbook.IsAddin = True
Else
    ThisWorkbook.IsAddin = False
End If
End Sub
  

Теперь мы сохраняем и закрываем MASTER_WB, а затем в каждом USER_WB в модуле мы добавляем вновь созданный MASTER_WB в качестве ссылки:

введите описание изображения здесь

Обратите внимание, что в каждом USER_WB мы также вводим коды для вызова тех общедоступных модулей и UDF, которые мы создали в MASTER_WB:

 Option Explicit

Sub ESTE_LIBRO()
Call MASTER_UTILITIES.MW_ESTE_LIBRO(ThisWorkbook)
End Sub

Function PORTRES(vRNG As Range) As Double
PORTRES = MASTER_UTILITIES.MW_PORTRES(vRNG)
End Function
  

И это было бы все! Теперь каждый ПОЛЬЗОВАТЕЛЬ_WB может получить доступ к UDF и вспомогательным файлам, хранящимся в MASTER_WB. И когда нам нужно внести обновление / правку, мы просто обновляем MASTER_WB.

Если мы создадим новый UDF / SUB, тогда да, его нужно создать в обеих книгах. MASTER_WB будет содержать сам код, и каждому USER_WB необходимо добавить в свои модули что-то вроде:

 Sub MY_NEW_SUB()
Call MASTER_UTILITIES.MY_NEW_SUB
End Sub
  

Кроме того, если параметры / аргументы вложенного файла / udf изменяются, да, вам также необходимо обновить каждый USER_WB.

Но поверьте мне, когда я говорю, что это того стоит, по крайней мере, в нашем офисе, потому что такие случаи редки. Самый обычный из них — это просто улучшение / добавление новой строки кодов, поэтому обновление MASTER_WB сделает новый код доступным для всех подключенных USER_WB пользователей, не делая этого 15 раз.

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

Надеюсь, вы сможете адаптировать это к своим потребностям.