События в VBA

Автор Тема: События в VBA  (Прочитано 3337 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн anton.gorschnevАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
События в VBA
« : 12-03-2019, 16:52:36 »
Добрый день. Помогите разобраться с  событиями в VBA для объектов Inventor. Если несложно поделитесь примером кода с пояснениями в VBA например на событие OnSaveDocument.
В Excel все просто выберешь объект и его события на вкладках, в  Inventor эти списки пустые возможно необходимо подключения библиотеки событий?

Отмечено как Решение Александр Ривилис 13-03-2019, 15:40:47

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: События в VBA
« Ответ #1 : 13-03-2019, 08:19:22 »
События могут вызываться только из класса, поэтому к макросу нужно создать класс.
В общем здесь можно поступить двояко: можно прявязаться к событию приложения, а можно привязаться к событию конкретного документа
Через события приложения. Макрос:
Код - Visual Basic [Выбрать]
  1. Sub ApplicationSaveRun()
  2.  
  3. Dim SaveEvent As ApplicationSave
  4. Set SaveEvent = New ApplicationSave
  5.  
  6. Dim flag As Boolean: flag = True
  7.  
  8. Do While flag
  9. DoEvents
  10. Loop
  11.  
  12. End Sub
  13.  

Теперь создайте класс с именем ApplicationSave и вставьте туда следующий код:

Код - Visual Basic [Выбрать]
  1. Private WithEvents e_onsave As ApplicationEvents
  2.  
  3. Private Sub Class_Initialize()
  4. Set e_onsave = ThisApplication.ApplicationEvents
  5. End Sub
  6.  
  7. Private Sub e_onsave_OnSaveDocument(ByVal DocumentObject As Document, ByVal BeforeOrAfter As EventTimingEnum, ByVal Context As NameValueMap, HandlingCode As HandlingCodeEnum)
  8.  
  9.     If BeforeOrAfter = kBefore Then MsgBox "Before Save"
  10.     If BeforeOrAfter = kAfter Then MsgBox "kAfter Save"
  11.     If BeforeOrAfter = kAbort Then MsgBox "Abort Save"
  12.    
  13. End Sub
  14.  

**********************************************
теперь вариант через привязку к событию самого документа
Код - Visual Basic [Выбрать]
  1. Sub DocumentSaveRun()
  2.  
  3. Dim SaveEvent As DocumentSave
  4. Set SaveEvent = New DocumentSave
  5.  
  6. Call SaveEvent.SetDocument(ThisApplication.ActiveDocument)
  7.  
  8. Dim flag As Boolean: flag = True
  9.  
  10. Do While flag
  11. DoEvents
  12. Loop
  13.  
  14. End Sub
  15.  

Теперь создайте класс с именем DocumentSave и вставьте туда следующий код:

Код - Visual Basic [Выбрать]
  1. Private WithEvents e_doc_save As DocumentEvents
  2.  
  3. Public Sub SetDocument(ByVal doc As Document)
  4. Set e_doc_save = doc.DocumentEvents
  5. End Sub
  6.  
  7. Private Sub e_doc_save_OnSave(ByVal BeforeOrAfter As EventTimingEnum, ByVal Context As NameValueMap, HandlingCode As HandlingCodeEnum)
  8.     If BeforeOrAfter = kBefore Then MsgBox "Before Save"
  9.    
  10.     If BeforeOrAfter = kAfter Then MsgBox "kAfter Save"
  11.    
  12.     If BeforeOrAfter = kAbort Then MsgBox "Abort Save"
  13.  
  14. End Sub
  15.  


P.S. Только не пойму, почему то функция DoEvents ресурсы жрет одного процессора, видимо потому что VBA сам по себе корявый.

Оффлайн anton.gorschnevАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
Re: События в VBA
« Ответ #2 : 13-03-2019, 10:53:21 »
Большое спасибо.
Получается бесполезная вещь "события" в VBA.
Чтобы отреагировать на событие необходимо в ручную запустить процедуру отслеживания этого события или я не  до конца разобрался.
Я рассчитывал получить эффект как VB.NET по коду

Код - vb.net [Выбрать]
  1. Private m_ApplicationEvents As Inventor.ApplicationEvents
  2. Public Sub Activate(ByVal addInSiteObject As Inventor.ApplicationAddInSite, _
  3. ByVal firstTime As Boolean) _
  4. Implements Inventor.ApplicationAddInServer.Activate
  5. m_inventorApplication = addInSiteObject.Application
  6. m_ApplicationEvents = m_inventorApplication.ApplicationEvents
  7. AddHandler m_ApplicationEvents.OnOpenDocument, _
  8. AddressOf Me.m_ApplicationEvents_OnOpenDocument
  9. End Sub
  10. Private Sub m_ApplicationEvents_OnOpenDocument( _
  11. ByVal DocumentObject As Inventor._Document, _
  12. ByVal FullDocumentName As String, _
  13. ByVal BeforeOrAfter As Inventor.EventTimingEnum, _
  14. ByVal Context As Inventor.NameValueMap, _
  15. ByRef HandlingCode As Inventor.HandlingCodeEnum)
  16. System.Windows.Forms.MessageBox.Show(_
  17. "OnOpenDocument: " + DocumentObject.DisplayName)
  18. End Sub

А сейчас получается необходимо запустить процедур

Код - Visual Basic [Выбрать]
  1. Sub DocumentSaveRun()
  2.  
  3. Dim SaveEvent As DocumentSave
  4. Set SaveEvent = New DocumentSave
  5.  
  6. Call SaveEvent.SetDocument(ThisApplication.ActiveDocument)
  7.  
  8. Dim flag As Boolean: flag = True
  9.  
  10. Do While flag
  11. DoEvents
  12. Loop
  13.  
  14. End Sub

чтобы начать отслеживать событие сохранения.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: События в VBA
« Ответ #3 : 13-03-2019, 14:09:38 »
Получается бесполезная вещь "события" в VBA.
Да как и сам VBA, от VBA есть одна полезная вещь: посмотреть текущее состояние инвентора.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: События в VBA
« Ответ #4 : 13-03-2019, 20:21:31 »
Я рассчитывал получить эффект как VB.NET по коду
В случае с AddIn происходит событие загрузки AddIn при загрузки инвентора, поэтому в AddIn все события "автоматически" подключатся, а макрос в VBA, что то должно вызвать, либо AddIn либо iLogic либо юзер с кнопки. Раньше были автомакросы, то ли 4 то ли 5 видов, срабатывали при определенных событиях, но это оказалось злом и от этого разрабы отказались. AddIn, как говорится, рулит.

Оффлайн anton.gorschnevАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
Re: События в VBA
« Ответ #5 : 14-03-2019, 08:26:56 »
Всем спасибо за ответы, очень помогло. На событие подписываюсь в ADDin, по наступлению которого запускаю макрос в документе. Наверное самое оптимальное решение на стадии отладки и тестирования. После отладки буду переходить полностью  на VB.NET.
Возник попутный вопрос. Может кто в курсе как отключить сообщение Inventor  что в открываемой документе есть макрос,
сообщение вызывается при открытии деталей из библиотеки  или созданию документа по шаблону.



Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: События в VBA
« Ответ #6 : 14-03-2019, 20:51:48 »
попробуйте, что бы не появлялось окно
Код - Visual Basic [Выбрать]
  1. ThisApplication.SilentOperation = True
  2.  
  3. ThisApplication.SilentOperation = False
  4.