Страницы: 1
RSS
Хочу зашить код VBA Excel в DLL
 
Добрый день, уважаемые друзья.

Появилась необходимость запихать все свои наработки в 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) не работает.
Подскажите, пожалуйста, блондинке, к каком напралении копать.
Заранее благодарна.
Изменено: Margo_Krud - 08.10.2018 17:01:49
 
Доброе время суток.
Цитата
Margo_Krud написал:
Прописываю в документе функцию: =myPlus(D4;D5) Не работает.
Рабочий лист ничего не знает о том, что нужно создать объект класса Second_Project.Second_Project, а уж потом у него вызвать функцию.
Самое простое - перейти на написание того же с помощью Visual Studio, но используя оболочку ExcelDna. Сможете и подсказки в мастере функций показывать и так же как в VBA с Ribbon работать и даже, если захочется, свой RDP сервер сделать, ну, и для Com останется место.
Успехов.
 
Off
Margo_Krud, Плохая аватарка по этим причинам.
По вопросам из тем форума, личку не читаю.
 
Спасибо за ответ. Более важно запустить все те макросы в файлах DLL (TLB) на другом компьютере. Не подскажете простенький способ :)
Пробовала написать простую функцию в С++. Так результат такойже, на компьютере с Visual Studio код функции в Excel работает в DLL, а на другом пк с той же DLL код не работает.  
Изменено: Margo_Krud - 08.10.2018 17:20:39
 
Здравствуйте! Если текст написан на VBA, то почему бы не сделать обычную надстройку (*.xlam), выложить ее на сетевой диск и использовать на всех компьютерах?
Владимир
 
Цитата
Margo_Krud написал:
Более важно запустить все те макросы в файлах DLL (TLB) на другом компьютере
так ExcelDna это всё позволяет. Но если вам не нужны легкие пути, то почитайте.
По C++ это, если заглянет, то ответит возможно BedVit.
 
Цитата
Андрей VG написал:
так ExcelDna это всё позволяет
Спасибо, Андрей. Я ничего ранее не слышала об этом. Попробую покопать в направлении Excel Dna. Хотя, если честно, то я думала, что это не сложно (зашить код в DLL и пусть пользуются все кто хочет), а в итоге, промучалась несколько дней и ровным счетом ничего.
Изменено: Margo_Krud - 08.10.2018 17:56:09
 
Всем привет! Андрей, привет! Спасибо за рекомендации) Margo_Krud, ну вы и наворотили) Для ваших целей вполне подойдет и надстройка для Excel - .xlam. Это самый оптимальный вариант. Если вы хотите именно .dll или .xll нужно иметь ввиду:
1. Вам прейдется выучить новый язык - *.NET, C/C++ (любой другой, на котором можно писать динамические библиотеки)
2. Понимать разницу между процедурным программированием и ООП (процедурными dll и например - СОМ)
3. Иметь представление что такое строка (массив символов)
4. Если писать на С/С++ обязательны знания указателей, чего нет на .NET (вообще-то есть, но не обязательны)
5. ExcelDna упрощает процесс разработки в разы, но это. NET.
Написать процедурную dl на С++ для Excel элементарно (см. ссылки), пока не дойдете до строк:)
Если желание осталось, могу ответить подробнее на конкретные вопросы.
Написать dll на С++. Видео на эту же тему.
Изменено: bedvit - 10.10.2018 11:01:53
«Бритва Оккама» или «Принцип Калашникова»?
 
Спасибо, ребята. Безусловно, это все интересно и я очень увлеклась изучением С++. Изначально проблема стояла в следующем - "зашить функции, и макросы в dll, чтобы иметь возмость запускать их с любого компьютера офиса". Надстройка xlam не подходит по ряду причин (сейчас она на сетьевом рессурсе), но сейчас не об этом. Только dll и только MS Visio Studio :)
Спасибо bedvit за комментарий.
Дорогу осилит идущий.
 
Когда лучше использовать *.xlam, а когда *.dll?
Конечно используя правило найменьшего сопротевления, с найлучшим результатом/ефектом )))
 
Цитата
Margo_Krud написал:
Пробовала написать простую функцию в С++. Так результат такойже, на компьютере с Visual Studio код функции в Excel работает в DLL, а на другом пк с той же DLL код не работает.  
Нет нужных библиотек на другом ПК, загружайте нужные при компиляции проекта.
Проект -> Свойства -> Свойства конфигурации -> С/С++ -> Создание кода -> Библиотека времени выполнения. Для Debug-конфигурации выбрать Многопоточная отладка (/MTd), для release - Многопоточная (/MT).
Изменено: bedvit - 12.10.2018 20:57:07
«Бритва Оккама» или «Принцип Калашникова»?
 
ivanok_v2, звучит как "Что лучше съесть, рыбу или мёд?" Что для вас значит "найлучший результат/эффект"?
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:  Написать dll на С++
спасибо за линк и все рекомендации #8 !
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
bedvit написал: 2. Понимать разницу между процедурным программированием и ООП
я бы, например, посмотрела здесь
и имела бы в виду это
Изменено: JeyCi - 19.06.2019 10:17:36
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Наверх