Совместное использование модулей VBA в книгах - PullRequest
2 голосов
/ 27 марта 2019

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

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

Ответы [ 2 ]

1 голос
/ 27 марта 2019

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

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

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

1 голос
/ 27 марта 2019

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

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

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

Мы создали MASTER WORKBOOK со всеми необходимыми подсистемами и функциями.Я сделаю быстрый пример.Эта основная рабочая книга называется MASTER_WB (название VBAProject также MASTER_WB)

enter image description here

Этот 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 в качестве ссылки:

enter image description here

Обратите внимание, что в каждом 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 раз.

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

Надеюсь, вы сможете адаптировать его под свои нужды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...