Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45

Связать VBA Excel файл с DLL без регистрации, с возможностью менять значения ячеек

08.02.2018, 18:38. Показов 8476. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Подскажите, пожалуйста, а то я не догоняю что я делаю не так...
Я не силен в "ООП", поэтому прошу помощи у профессионалов.

Нужно большую часть кода перенести из VBA в DLL, раньше макрос брал данные из ячеек, бегал по листам, создавал книги, возвращался обратно и т.д., но как это прописывается в DLL?
  1. Как прописать вызов функции из excel без указания параметров, так как нужно чтобы эта функция не возвращала значение, а работала с ячейками?
  2. Как из DLL определить нужную книгу (ту из которой была вызвана эта DLL)?
  3. Как передаются массивы?
  4. Почему excel не видит DDL?

Бьюсь уже больше недели, перечитал уже все что можно и где можно...

Вот например короткий код и как я это пишу, что не правильно?

Это в excel:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Option Explicit
Public Const D0 As Date = #1/1/1970#
#If Win64 Then
Public Declare PtrSafe Function GetTimeZoneInformation Lib "kernel32" _
(lpTimeZoneInformation As TIME_ZONE_INFORMATION) As LongLong
#Else
Public Declare Function GetTimeZoneInformation Lib "kernel32" _
(lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
#End If
Public Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
End Type
Public Type TIME_ZONE_INFORMATION
        Bias As Long
        StandardName(32) As Integer
        StandardDate As SYSTEMTIME
        StandardBias As Long
        DaylightName(32) As Integer
        DaylightDate As SYSTEMTIME
        DaylightBias As Long
End Type
Public strParam1(10) As String
Public strList1 As String
Public strList2 As String
Public ShTab As Object
Public ShTab2 As Object
Public intColum As Integer
Public intRow4 As Integer
Public s1 As Integer
Public i As Integer
Public p1 As Integer
 
#If Win64 Then
Public Declare PtrSafe Function FnVoz1 Lib "D:\Users\serge\YandexDisk\Temp\VB обучение\Excel and dll\testDLL.dll" ()
#Else
Public Declare Function FnVoz1 Lib "D:\Users\serge\YandexDisk\Temp\VB обучение\Excel and dll\testDLL" ()
#End If
 
Public Sub FnConstant()
strList1 = "List1"    '
strList2 = "List2"    '
Set ShTab = Sheets(strList1)
Set ShTab2 = Sheets(strList2)
intColum = 2
intRow4 = 10
Run.Application FnVoz1
End Sub
Это в DLL Проект1 в Класс1:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Public strList1 As String
Public strList2 As String
Public ShTab As Object
Public ShTab2 As Object
Public intColum As Integer
Public intRow4 As Integer
Public s1 As Integer
Public i As Integer
Public p1 As Integer
 
Public xlApp As Object
Public xlBook As Object
Public xlSheet As Object
 
Public Function FnVoz1()
   On Error Resume Next
 
    Set xlApp = GetObject(, "Excel.Application")
    If Err.Number = 429 Then
        Err.Number = 0
        Set xlApp = CreateObject("Excel.Application")
   End If
   On Error GoTo 0
   
strList1 = "List1"    '
strList2 = "List2"    '
Set ShTab = Excel.Sheets(strList1)
Set ShTab2 = Excel.Sheets(strList2)
intColum = 2
intRow4 = 10
 
On Error GoTo CancelHandler
Application.EnableCancelKey = xlErrorHandler
 
s1 = Application.CountIf(Excel.ShTab.Range(Excel.ShTab.Cells(2, intColum), Excel.ShTab.Cells(intRow4, intColum)), "<>""")
  strParam1(i) = ChrW(248)
    For i = 1 To s1
        strParam1(i) = Excel.ShTab.Cells(i + 1, intColum).Value
    Next i
   
   
Excel.ShTab.Cells(2, intColum + 1).Select
 
    For i = 1 To s1
      If Excel.ShTab.Cells(i + 1, intColum).Value = 5 Then Call FnVoz2
      ActiveCell.Offset(1, 0).Range("A1").Select
    Next i
    p1 = 1
    
CancelHandler:
Application.EnableCancelKey = xlInterrupt
End Function
Public Function FnVoz2()
On Error GoTo CancelHandler
Application.EnableCancelKey = xlErrorHandler
 
MsgBox "Привет!    "
    
CancelHandler:
Application.EnableCancelKey = xlInterrupt
End Function
Это в Проект1 в Модуль1:
Visual Basic
1
Public strParam1(10) As Variant
Добавлено через 2 часа 48 минут
Мега мозги, помогите пжл.!

Добавлено через 1 час 24 минуты
Уважаемые ПРОФИ, просьба помочь в этом вопросе, я вижу что за несколько часов уже 38 просмотров, значит не я один такой,
информации по этим тонкостям очень мало, в основном общие ответы, с короткими примерами или вообще без них
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.02.2018, 18:38
Ответы с готовыми решениями:

Создание dll для динамического подключения в EXCEL без регистрации
Доброго времени суток! Дорогие друзья, переработал большой объем информации из интернета, но решения не нашел. Как создать...

Как зарыть файл без сохранения (Excel/VBA )?
Как закрыть .xls без сохранения, чтобы не выскакивало окно с вопросом о сохранении изменений в файле? Зарание спасибо, Alex

Как сохранить VBA-массив в CSV-файл без Excel
Как можно сохранить VBA-массив в CSV-файл без использования Excel? Сейчас я сначала вставляю данные из VBA-массива в Excel, а затем...

53
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
11.02.2018, 17:54  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SlavaRus Посмотреть сообщение
Тут смотрел?
Создание процедурных DLL в Visual Basic (статья)
Да, смотрел, и скачивал примеры, но excel все равно не видит DLL, как будто какой то
библиотеки ему не хватает...
0
35 / 32 / 15
Регистрация: 23.12.2014
Сообщений: 97
11.02.2018, 18:42
При объявлении функции из Вашей DLL в коде макроса Excel, после слова "Lib", Вам нужно задать полный путь к Вашей DLL:

Visual Basic
1
Public Declare Function ФункцияВВашейDLL Lib "ПолныйПутьКВашейDLL" (параметр As ТипПараметра) As ВозвращаемыйТипВашейФункции
0
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
11.02.2018, 18:48  [ТС]
Цитата Сообщение от AlexSmel Посмотреть сообщение
(параметр As ТипПараметра) As ВозвращаемыйТипВашейФункции
Конечно путь я прописываю, но вот эти параметры... у меня же нет параметров
Я же в примере в самом первом посте все написал, что у меня за код в excel и какой в VB6

Функцию описываю так :
Visual Basic
1
2
3
4
5
#If Win64 Then
Public Declare PtrSafe Function FnVoz1 Lib "D:\Users\serge\YandexDisk\Temp\VB обучение\Excel and dll\testDLL.dll" ()
#Else
Public Declare Function FnVoz1 Lib "D:\Users\serge\YandexDisk\Temp\VB обучение\Excel and dll\testDLL.dll" ()
#End If
0
 Аватар для dzug
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
11.02.2018, 20:46
Больше 10 лет назад скачал программу игры в шахматы, и автор её, указан в прилагаемых документах. Вы делаете ход шахматной фигурой в Вёрде и передаете в DLL , а из библиотеки приходит ответный ход.. Без всякой регистрации DLL .
Вложения
Тип файла: rar Chess_64.rar (119.9 Кб, 11 просмотров)
1
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
11.02.2018, 20:54  [ТС]
dzug, спасибо за помощь, но я ее уже скачивал, но запустить так и не смог, сначала поправил
на 64 разрядный офис, но затем не понимаю что ему не хватает...
Миниатюры
Связать VBA Excel файл с DLL без регистрации, с возможностью менять значения ячеек  
0
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
11.02.2018, 20:56  [ТС]
Цитата Сообщение от dzug Посмотреть сообщение
Вы делаете ход шахматной фигурой в Вёрде и передаете в DLL , а из библиотеки приходит ответный ход.. Без всякой регистрации DLL
Но это как раз то что мне и нужно (только excel)...
0
 Аватар для dzug
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
11.02.2018, 21:58
Цитата Сообщение от Sergey533 Посмотреть сообщение
dzug, спасибо за помощь, но я ее уже скачивал, но запустить так и не смог, сначала поправил
на 64 разрядный офис, но затем не понимаю что ему не хватает...
Как раз 64 разрядный офис и не нужен, не было такого в 2003 году. У меня прекрасно играет в 2007 Офисе ( 32-х битный) .
Выделенную желтым строку я отключил , играет и без неё..По моему это какая то иконка на форме.
0
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
11.02.2018, 22:24  [ТС]
dzug, вопрос не в том чтобы в шахматы поиграть, а смысл моего желания научиться этому - это защитить часть кода,
я уже поднимал другую тему и пришел к выводу, что оптимальнее всего перенести часть кода в DLL из excel.
Так как я никогда этого не делал, то и не понимаю как установить связь, поэтому я написал простой код, разделил его на две части одну поместил в Active DLL, а вторую часть оставил в excel, но сделал это как я думал должно быть
А ни черта не работает...
Если кто нибудь поможет на этом примере рассказать что я делаю не так, то я смогу перелопатить весь свой код.
Вопросов всего 4 (пока), и четвертый стал пока на первое место:

4. Почему excel не видит DDL? - > хотя лежат в одной папке (да и путь полный на всякий случай прописал, хотя по итогу нужно от этого уйти)
1. Как прописать вызов функции из excel без указания параметров, так как нужно чтобы эта функция не возвращала значение, а работала с ячейками? - т.е. любой пользователь запускает макрос, он доходит до этой функции -> она перехватывает управление -> идет обратно в этот же excel -> считывает данные определенных ячеек -> производит внутренний расчет -> ставит некоторые данные в ячейки -> передает управление обратно excel
2. Как из DLL определить нужную книгу (ту из которой была вызвана эта DLL)?
3. Как передаются массивы?
Миниатюры
Связать VBA Excel файл с DLL без регистрации, с возможностью менять значения ячеек  
0
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
12.02.2018, 00:09  [ТС]
Совсем упростил код, но не видит DLL...
0
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
12.02.2018, 00:16  [ТС]
Скрин
Миниатюры
Связать VBA Excel файл с DLL без регистрации, с возможностью менять значения ячеек  
0
 Аватар для dzug
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
12.02.2018, 16:01
Цитата Сообщение от Sergey533 Посмотреть сообщение
Совсем упростил код, но не видит DLL...
Но в Вёрде видит.. Посмотрите как там вызывает DLL ..

Добавлено через 23 минуты
DLL бывают процедурные, а бывают ActiveX. Какая у вас DLL?
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
12.02.2018, 18:11
Решал как то задачу коммивояжера динамическим программированием, для ускорения алгоритм расчетов перенес в dll, написанную на FreeBasic, ускорение происходит за счет более быстрого языка и за счет потоков.
Пример взаимодействия Excel с DLL во вложении (стабильно работает с Excel32, под Excel64 возможно не будет работать)
Вложения
Тип файла: zip TSP_dll.zip (136.3 Кб, 10 просмотров)
0
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
12.02.2018, 18:59  [ТС]
Цитата Сообщение от dzug Посмотреть сообщение
DLL бывают процедурные, а бывают ActiveX. Какая у вас DLL?
Я выбирал ActiveX, снимок1

Так же как я понял excel видит эту DLL - снимок2, но не может к ней обратиться, может как то по другому нужно обращаться?
Миниатюры
Связать VBA Excel файл с DLL без регистрации, с возможностью менять значения ячеек   Связать VBA Excel файл с DLL без регистрации, с возможностью менять значения ячеек  
0
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
12.02.2018, 19:04  [ТС]
Цитата Сообщение от m-ch Посмотреть сообщение
Пример взаимодействия Excel с DLL во вложении (стабильно работает с Excel32, под Excel64 возможно не будет работать)
Проверяю на Excel32, выдает ошибку -Снимок3

Может какой то библиотеки не хватает?

В excel подключил, наверное все что можно... снимок 4
Миниатюры
Связать VBA Excel файл с DLL без регистрации, с возможностью менять значения ячеек   Связать VBA Excel файл с DLL без регистрации, с возможностью менять значения ячеек  
0
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
12.02.2018, 19:11  [ТС]
m-ch, а в самом проект1 в модуле, код почти весь красный...
Миниатюры
Связать VBA Excel файл с DLL без регистрации, с возможностью менять значения ячеек  
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
12.02.2018, 19:14
Цитата Сообщение от Sergey533 Посмотреть сообщение
Проверяю на Excel32, выдает ошибку -Снимок3
Может какой то библиотеки не хватает?
файл TSP_x86.dll должен находится в той же папке, что и TSP_DLL+EXE.xlsm

Цитата Сообщение от Sergey533 Посмотреть сообщение
а в самом проект1 в модуле, код почти весь красный...
файл TSP_x86.bas написан на FreeBasic и должен открываться и компилироваться в FB
0
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
12.02.2018, 19:21  [ТС]
Цитата Сообщение от m-ch Посмотреть сообщение
файл TSP_x86.dll должен находится в той же папке, что и TSP_DLL+EXE.xlsm
Да, конечно (снимок6), я понимаю это, я на таком же принципе и хотел построить свою структуру, т.к.
вот здесь читал https://msdn.microsoft.com/en-... s.60).aspx , что
ищет в:
If you do not specify a path for libname, Visual Basic will search for the file in the following order:

Directory containing the .exe file

Current directory

Windows system directory (often but not necessarily \Windows\System)

Windows directory (not necessarily \Windows)

Path environment variable
Миниатюры
Связать VBA Excel файл с DLL без регистрации, с возможностью менять значения ячеек  
0
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
12.02.2018, 19:23  [ТС]
Цитата Сообщение от m-ch Посмотреть сообщение
находится в той же папке, что и TSP_DLL+EXE.xlsm
Кнопки "Случайно" и "Сброс" - без ошибок, но "DLL" и "EXE" - ошибка
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
12.02.2018, 19:26
Цитата Сообщение от Sergey533 Посмотреть сообщение
но "DLL" и "EXE" - ошибка
В какую папку распаковали архив? возможно нет доступа к файлам .dll и .exe
попробуйте сохранить все файлы в доступную для чтения/записи папку на диске
0
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 45
12.02.2018, 21:21  [ТС]
Цитата Сообщение от m-ch Посмотреть сообщение
В какую папку распаковали архив? возможно нет доступа к файлам .dll и .exe
попробуйте сохранить все файлы в доступную для чтения/записи папку на диске
Да, стало работать, я до этого в загрузках так и распаковал, перекинул на другой диск, стала работать эта прога!

Тогда можно пояснить, почему вот эта не работает? еще больше упростил...

Excel VBA:

Visual Basic
1
2
3
4
5
6
7
8
Option Explicit
Public p1 As Integer
 
Public Declare PtrSafe Function FnVoz1 Lib "E:\VB\Excel and dll\testDLL.dll" ()
Public Sub FnConstant()
    FnVoz1
    
End Sub
Это в DLL:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Option Explicit
Public p1 As Long
 
Public xlApp As Object
Public xlBook As Object
Public xlSheet As Object
 
Public Function FnVoz1()
   On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application")
    If Err.Number = 429 Then
        Err.Number = 0
        Set xlApp = CreateObject("Excel.Application")
   End If
   On Error GoTo 0
   
Set xlBook = xlApp.Workbook
Set xlSheet = xlBook.Sheets(1)
 
xlApp.Visible = True
    xlSheet.Range("A1").Value = 10
        p1 = xlSheet.Range("A1").Value
 
End Function
Архив ниже
Вложения
Тип файла: rar Excel and dll.rar (17.1 Кб, 5 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.02.2018, 21:21

Как создать файл DLL так, чтобы его можно было подключить к VBA Excel?
Пытаясь научиться подключать к VBA хотя бы самую тривиальную функцию на C++. Для примера написал на C++ простую функцию Kvadrat и...

Как подключить к VBA Excel файл DLL, лежащий в той же папке, с использованием относительного пути?
С использованием этой инструкции создал dll на С++ для подключения к VBA Excel. Подключил функцию к VBA следующим образом: ...

VBA в excel вставка ячеек
Здрасте! такой вопрос. Есть 2 книги в excel, нужно из одной скопировать определенные ячейки и при вставке в другую их объеденить. (В...

Excel vba. Сложение ячеек
Есть код в Excel, который должен складывать значения из столбцов и писать ответ в следующем, но выдает ошибку Run-time error '424': Object...

Сравнение ячеек в VBA Excel
Добрый день, друзья. Выручите меня, пожалуйста. Итак, имеется табличка с возможностью автоматизированного заполнения ячеек (один из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru