Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Хочу зашить код VBA Excel в DLL
 
Спасибо, ребята. Безусловно, это все интересно и я очень увлеклась изучением С++. Изначально проблема стояла в следующем - "зашить функции, и макросы в dll, чтобы иметь возмость запускать их с любого компьютера офиса". Надстройка xlam не подходит по ряду причин (сейчас она на сетьевом рессурсе), но сейчас не об этом. Только dll и только MS Visio Studio :)
Спасибо bedvit за комментарий.
Дорогу осилит идущий.
Хочу зашить код VBA Excel в DLL
 
Цитата
Андрей VG написал:
так ExcelDna это всё позволяет
Спасибо, Андрей. Я ничего ранее не слышала об этом. Попробую покопать в направлении Excel Dna. Хотя, если честно, то я думала, что это не сложно (зашить код в DLL и пусть пользуются все кто хочет), а в итоге, промучалась несколько дней и ровным счетом ничего.
Изменено: Margo_Krud - 08.10.2018 17:56:09
Хочу зашить код VBA Excel в DLL
 
Спасибо за ответ. Более важно запустить все те макросы в файлах DLL (TLB) на другом компьютере. Не подскажете простенький способ :)
Пробовала написать простую функцию в С++. Так результат такойже, на компьютере с Visual Studio код функции в Excel работает в DLL, а на другом пк с той же DLL код не работает.  
Изменено: Margo_Krud - 08.10.2018 17:20:39
Хочу зашить код 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
Страницы: 1
Наверх