Добрый день, уважаемые друзья.
Появилась необходимость запихать все свои наработки в VBA (макросы и функции) в файл DLL для работы на других компьютерах в офисе (не на тех, на которых пишется код).
Компьютер для написания кода - Windows 7 - 64 бита, Офис 2013 - 32 бита, MS Visio Studio 2012.
Прежде чем написать сюда, я перерыла просторы Интернет, но в полном объеме информацию так и не удалось получить. Много описанных в Интернет вариантов пробовала использовать, но финального, завершенного варианта так и не получилось создать. Ниже я опишу все пошагово, что и как создавалось.[/P]
Итак: Создаем пробную функцию в VBA, которую и будем зашивать в DLL.
Код |
---|
Public Function myPlus(ByVal x As Integer, ByVal y As Integer) As Integer
Return (x + y)
End Function |
Захожу в MS Visual Studio 2012 > Создать проект > Библиотека классов > Называю "Second_Project" > Жму "ОК".
Далее, в "Обозревателе решений", жму правой кнопкой на проекте > Свойства, и ставлю две галочки:
> Приложение > Сведения о сборке > Сделать сборку видимой для COM.
> Компиляция > Регистрация для СOM - взаимодействия.
Жму "ОК".
В файле Class1.vb прописываю интерфейсы и свои две тестовые функции:
Код |
---|
Public Interface ompzb52
Function myPlus(ByVal x As Integer, ByVal y As Integer) As Integer
Function myMinus(ByVal x As Integer, ByVal y As Integer) As Integer
End Interface
Public Class Second_Project
Implements ompzb52 Public Function myPlus(ByVal x As Integer, ByVal y As Integer) As Integer Implements ompzb52.myPlus
Return (x + y)
End Function Public Function myMinus(ByVal x As Integer, ByVal y As Integer) As Integer Implements ompzb52.myMinus
Return (x - y)
End Function
End Class |
Жму > Построить решение (F7) и получаю четыре файла Second_Project.dll, Second_Project.tlb, Second_Project.pdb, Second_Project.xml .
Далее создаю новый документ в MS Excel, сохраняю его в xlsm и жму родной Alt + F11.
В редакторе VISUAL BASIC FOR APPLICATION жму Tools > Refrence > Browse и выбираю созданный файл "Second_Project.tlb". Жму "ОК".[/P]
Теперь подключаю файл DLL.
В редакторе VISUAL BASIC FOR APPLICATION вставляю новый модуль, в котором прописываю одну из функций:
Код |
---|
Declare Function myPlus Lib "C:\Users\DUO\Second_Project.dll" (ByRef x As Integer, ByRef y As Integer) As Integer
Sub test()
Dim perem As New Second_Project.Second_Project
MsgBox (perem.myPlus(10, 3))
End Sub |
На этом участке я тестирую функцию из файла *tlb. Жму в редакторе ф5 и все прекрасно работает. Выводится MsgBox c цифрой 13. Ок. Правильно.
Прописываю в документе функцию: =myPlus(D4;D5) Не работает. В ячейках D4 и D5 указаны числа для суммирования.
Проблема 2.
Переношу файлы Second_Project.dll и Second_Project.tlb на другой компьютер, регистрирую их батником, в котором прописываю код:
Код |
---|
copy C:\Users\DUO\Desktop\Second_Project.dll C:\WINDOWS\SysWOW64
C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\regasm C:\WINDOWS\sysWOW64\Second_Project.dll /tlb:Second_Project.tlb /codebase
PAUSE |
Код |
---|
Скопировано файлов: 1. C:\Users\DUO\Desktop>C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\regasm C:\WINDOWS\sysWOW64\Second_Project.dll /tlb:Second_Project.tlb /codebaseMicrosoft .NET Framework Assembly Registration Utility 4.7.2053.0для Microsoft .NET Framework 4.7.2053.0c Корпорация Майкрософт (Microsoft Corporation). Все права защищены. RegAsm : warning RA0000 : Регистрация неподписанной сборки с использованием параметра /codebase может вызвать конфликт данной сборки с другими приложениями, которые могут быть установлены на том же компьютере. Параметр /codebase предназначен только для подписанных сборок. Присвойте сборке строгое имя и повторите регистрацию.RegAsm : Регистрация успешна.Для продолжения нажмите любую клавишу . . . |
Создаю пустой документ на другом компьютере (Windows 7 64 бита, Офис 2013 - 32 бита),
В редакторе VISUAL BASIC FOR APPLICATION жму Tools > Refrence > Browse и выбираю зарегистрированный файл "Second_Project.tlb" (В папке SysWOW64). Жму "ОК". Декларируюфункцию в файле DLL и Создаю тестовый макрос
Код |
---|
Declare Function myPlus Lib "C:\WINDOWS\SysWOW64\Second_Project.dll" (ByRef x As Integer, ByRef y As Integer) As Integer
Sub test()
Dim perem As New Second_Project.Second_Project
MsgBox (perem.myPlus(10, 3))
End Sub |
Жму в коде F5 и получаю ошибку ActiveX component can't create object.
Ни макрос, ни функция, прописанная в ячейке (которая находится в файле *tlb) не работает.
Подскажите, пожалуйста, блондинке, к каком напралении копать.
Заранее благодарна.