Я получил любительское исправление для такого рода вещей.В моем офисе около 15 человек, которые делятся некоторыми утилитами и UDFS на EXCEL.Мы должны были изменить 15 книг Excel, когда код должен был быть пересмотрен или улучшен.Трата времени
Прежде всего, я должен сказать, что для того, чтобы это решение работало, все пользователи должны иметь общую папку, в которую вы можете поместить общую книгу для доступа всех. Если пользователи не могут поделиться чем-либо, это решение не будет работать.
Мы нашли простое решение для нас. Я почти уверен, что действительно есть лучший способ сделать это, более элегантный , но это работает для нас в течение последних 10 лет, и с нас хватит.
Мы создали MASTER WORKBOOK со всеми необходимыми подсистемами и функциями.Я сделаю быстрый пример.Эта основная рабочая книга называется MASTER_WB (название VBAProject также MASTER_WB)

Этот MASTER_WB будет содержать все ваши утилиты и общие коды.Как вы можете видеть на картинке, я набрал 1 sub и 1 UDF очень просто (как Public
, чтобы вызываться из любого места).
Кроме того, я настоятельно рекомендую использовать инициалы MW в каждой подпрограмме / функции, которую вы вводите в MASTER_WB.Таким образом, вы на 100% уверены, что между именами USER_WB и MASTER_WB нет конфликта имен, вызывающего одну и ту же процедуру. Это просто личная фиксация.
В этом MASTER_WB соответствующий код находится в объекте рабочей книги:
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
И это все!Теперь каждый USER_WB может получить доступ к UDF и подпрограммам, хранящимся в MASTER_WB.И когда нам нужно сделать обновление / изменение, мы просто обновляем MASTER_WB.
Если мы создадим new 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 раз.
Как я уже говорил в первой строке.это решение не является самым элегантным, и наверняка есть лучшее, но я могу сказать, что оно работает для нас.Я хотел бы однажды узнать о разработке надстроек, но сейчас мы используем это любительское исправление.
Надеюсь, вы сможете адаптировать его под свои нужды.