Появилась необходимость запихать все свои наработки в 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 на другой компьютер, регистрирую их батником, в котором прописываю код:
Скопировано файлов: 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) не работает. Подскажите, пожалуйста, блондинке, к каком напралении копать. Заранее благодарна.
Margo_Krud написал: Прописываю в документе функцию: =myPlus(D4;D5) Не работает.
Рабочий лист ничего не знает о том, что нужно создать объект класса Second_Project.Second_Project, а уж потом у него вызвать функцию. Самое простое - перейти на написание того же с помощью Visual Studio, но используя оболочку ExcelDna. Сможете и подсказки в мастере функций показывать и так же как в VBA с Ribbon работать и даже, если захочется, свой RDP сервер сделать, ну, и для Com останется место. Успехов.
Спасибо за ответ. Более важно запустить все те макросы в файлах DLL (TLB) на другом компьютере. Не подскажете простенький способ Пробовала написать простую функцию в С++. Так результат такойже, на компьютере с Visual Studio код функции в Excel работает в DLL, а на другом пк с той же DLL код не работает.
Здравствуйте! Если текст написан на VBA, то почему бы не сделать обычную надстройку (*.xlam), выложить ее на сетевой диск и использовать на всех компьютерах?
Спасибо, Андрей. Я ничего ранее не слышала об этом. Попробую покопать в направлении Excel Dna. Хотя, если честно, то я думала, что это не сложно (зашить код в DLL и пусть пользуются все кто хочет), а в итоге, промучалась несколько дней и ровным счетом ничего.
Всем привет! Андрей, привет! Спасибо за рекомендации) Margo_Krud, ну вы и наворотили) Для ваших целей вполне подойдет и надстройка для Excel - .xlam. Это самый оптимальный вариант. Если вы хотите именно .dll или .xll нужно иметь ввиду: 1. Вам прейдется выучить новый язык - *.NET, C/C++ (любой другой, на котором можно писать динамические библиотеки) 2. Понимать разницу между процедурным программированием и ООП (процедурными dll и например - СОМ) 3. Иметь представление что такое строка (массив символов) 4. Если писать на С/С++ обязательны знания указателей, чего нет на .NET (вообще-то есть, но не обязательны) 5. ExcelDna упрощает процесс разработки в разы, но это. NET. Написать процедурную dl на С++ для Excel элементарно (см. ссылки), пока не дойдете до строк:) Если желание осталось, могу ответить подробнее на конкретные вопросы. Написать dll на С++. Видео на эту же тему.
Спасибо, ребята. Безусловно, это все интересно и я очень увлеклась изучением С++. Изначально проблема стояла в следующем - "зашить функции, и макросы в dll, чтобы иметь возмость запускать их с любого компьютера офиса". Надстройка xlam не подходит по ряду причин (сейчас она на сетьевом рессурсе), но сейчас не об этом. Только dll и только MS Visio Studio Спасибо bedvit за комментарий. Дорогу осилит идущий.
Margo_Krud написал: Пробовала написать простую функцию в С++. Так результат такойже, на компьютере с Visual Studio код функции в Excel работает в DLL, а на другом пк с той же DLL код не работает.
Нет нужных библиотек на другом ПК, загружайте нужные при компиляции проекта. Проект -> Свойства -> Свойства конфигурации -> С/С++ -> Создание кода -> Библиотека времени выполнения. Для Debug-конфигурации выбрать Многопоточная отладка (/MTd), для release - Многопоточная (/MT).
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)