#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 раз.
Как я уже сказал в первой строке. это решение не самое элегантное, и наверняка есть лучшее, но я могу сказать, что оно работает для нас. Я хотел бы когда-нибудь узнать о разработке надстроек, но пока мы используем это любительское исправление.
Надеюсь, вы сможете адаптировать это к своим потребностям.