Модуль импорта Excel-VBA из текстового файла (без использования центра доверия) - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь создать пользовательскую библиотеку дочерних элементов и функций, сохраненных в виде файлов .txt, в сетевом расположении, где различные пользователи создаваемой мной книги могут импортировать их в зависимости от выбранной ими пользовательской функции. Пользователи рабочей книги будут использовать рабочую книгу только через формы пользователя. Я не хочу требовать, чтобы они изменили свои настройки центра безопасности для работы этого кода библиотек импорта, поэтому я не хочу использовать команду wb.VBproject.References.import или делать их надстройкой.

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

Я не понимаю, как это возможно, поскольку я ссылаюсь на весь этот код в выражении «With ThisWorkbook». Что я делаю не так?

Sub importLib(libName As String)
  Application.DisplayAlerts = False

  Path = "C:\Users\(username)\Desktop\excelLibraries\" 'Example only, my path is actually a network location
  lib = Path & libName
  Dim wb As Workbook
  Set wb = ThisWorkbook
  With wb
    On Error Resume Next
    Dim wbModules As Modules

    Set wbModules = .Application.Modules 'wb=ThisWorkbook, but doesn't point to this workbook when other workbooks open???

    'wb.VBProject.VBComponents.Import lib '---> library saved as .bas, but this requires the user to change their security settings
    'wb.VBProject.References.AddFromFile lib '---> library saved as add-in reference, but this requires user to change security settings

'----This method works when no other workbooks are open
    For Each a In wbModules 'Clear any previous Library Module
        If a.Name = "Library" Then
            a.Delete
            Exit For
        End If
    Next

    Set m = wbModules.Add 'Create a new Library Module
    m.Name = "Library"
    m.InsertFile lib 'Insert the code
   On Error GoTo 0
 End With
 Application.DisplayAlerts = True

 End Sub

 Sub callsub()
  importLib "library1.txt"
 End Sub

1 Ответ

0 голосов
/ 16 января 2019

Внесение следующих изменений, похоже, сработало для меня.

  1. Измените Dim wbModules As Modules на Dim wbModules. В противном случае я получаю ошибку несоответствия типов.
  2. Удалить .Application in Set wbModules = .Application.Modules.

EDIT:

Как отметил @ Матье Гиндон в комментарии, но его следует сохранить в теле вопроса, Application относится к экземпляру Excel приложения, хосту . Коллекция Modules содержит все открытые модули независимо от рабочей книги.

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