2016-09-17 3 views
3

Все документы, которые я прочитал в MSScriptControl, говорят, что он может реагировать на события добавленных к нему объектов.Как реализовать событие в Microsoft Script Control?

Управление сценарием позволяет вам писать сценарий, который автоматически будет запускаться при возникновении события на объекте . https://msdn.microsoft.com/en-us/library/ms974586.aspx

Сценарий ScriptControl сможет передавать события, созданные объектами , с использованием метода AddObject. http://flylib.com/books/en/1.492.1.154/1/

Но у меня не было успеха. Я предполагаю, что это означает, что код внутри ScriptControl будет срабатывать, когда добавленный объект вызывает его событие. Я не могу заставить работать.

Искание примера кода добавления любого объекта объекта ScriptControl и обработки событий, запускаемых этим элементом управления. Не волнует, является ли объект пользовательским классом, формой, элементом управления или встроенным объектом Excel, таким как рабочий лист.

Запуск Office 2010 32bit на Win Server 2008 64bit.

Открыть чередовать методы, такие как WSH, но Tushar Мехта не имели успеха с этим здесь http://dailydoseofexcel.com/archives/2009/08/19/using-vbscript-to-monitor-office-eventsor-not/

Я успешно добавлен объект Excel Application в ScriptControl, и выполняется код на объект Excel Application:

Это не работает без проблем:

Function TestProc() 
      Dim oScriptCtl As New MSScriptControl.ScriptControl 

      With oScriptCtl 
        ' init 
        .Language = "VBScript" 
        .AllowUI = True 

        ' add Excel application object 
        .AddObject "app", Application, True 

        ' add procedure 
        Dim sCode As String 
        sCode = "Sub TestProc : MsgBox ""hi"" : End Sub" 
        .AddCode sCode 

        ' run procedure. Msgbox displays. 
        .Run "TestProc" 
      End With 

      ' cleanup 
      Set oScriptCtl = Nothing 
End Function 

терпит неудачу:

В этом тесте m_oScriptCtl является переменной с модулем. Ничего не происходит, когда я нажимаю форму:

Function TestForm() 
      Set m_oScriptCtl = New MSScriptControl.ScriptControl 

      With m_oScriptCtl 
        ' init 
        .Language = "VBScript" 
        .AllowUI = True 

        MyForm.Show False 

        .AddObject "app", Application, True 
        .AddObject "frm", MyForm, True 
        .State = Connected 

        Dim sCode As String 
        sCode = "Sub frm_Click(): MsgBox Chr(14): End Sub" 
        .AddCode sCode 
      End With 
End Function 

Следующий один сообщает следующее сообщение об ошибке на .AddCode:

Прогнозный ')'

Function TestSheet() 
      Set m_oScriptCtl = New MSScriptControl.ScriptControl 

      With m_oScriptCtl 
        ' init 
        .Language = "VBScript" 
        .AllowUI = True 

        .AddObject "app", Application, True 
        .AddObject "sheet", Sheet2, True 
        .State = Connected 

        Dim sCode As String 
        sCode = "Private Sub sheet_Change(ByVal Target As Range): MsgBox Target: End Sub" 
        .AddCode sCode 
      End With 
End Function 

В следующем тесте, MyClass определяется как:

Public Event MyEvent() 

Public Sub TestEvent() 
      RaiseEvent MyEvent 
End Sub 

Но следующие отчеты «объект не поддерживает свойство или метод» на .Run. Таким образом, в этом случае это не событие, которое терпит неудачу - я просто не могу запустить метод внутри класса.

Function TestClassEvent() 
      Set oScriptCtl = New MSScriptControl.ScriptControl 

      Dim oClass As New MyClass 

      With oScriptCtl 
        ' init 
        .Language = "VBScript" 
        .AllowUI = True 

        ' add objects 
        .AddObject "app", Application, True 
        .AddObject "oClass", oClass, True 
        .State = Connected 

        ' add code 
        Dim sCode As String 
        sCode = "Sub oClass_MyEvent() : MsgBox vbNullString : End Sub" 
        .AddCode sCode 

        .Run "oClass.TestEvent" 
      End With 

      ' cleanup 
      Set oScriptCtl = Nothing 
End Function 

Улики:

Кто отвечал:

Если вы полностью не утонуть ваши события, попробуйте вызвать «ScriptControl1.Modules ("Global") CodeObject..Name_Of_Your_Event (ParameterList)» http://computer-programming-forum.com/59-vbscript/4b059f9f6eacfaf0.htm

- но обходной путь мне не ясна: процедуры событий не должны быть„под названием“явно, они должны просто огонь. Следующие строки и дают «Метод или член данных не найден», в приведенном выше примере TestClassEvent:

m_oScriptCtl.Modules("Global").CodeObject.MyEvent 
m_oScriptCtl.Modules("Global").CodeObject.TestEvent 

Я не проверял следующее, потому что я не совсем уверен, как:

контроль сценарий не может обрабатывать события из класса в том же проекте как приложение это время организовано в https://diigo.com/08we68

не уверен, если следующее имеет значение, d on't вполне понимает: http://www.programmersheaven.com/discussion/79452/me-activecontrol-and-events

+0

Возможно, добавление объекта просто добавляет объект без кода этого объекта. Как вы добавили oClass в качестве объекта, но его код не был добавлен. Это я думал, потому что у нас есть Set objModule = .Modules.Add («NewModule»), а затем мы добавляем код к нему с помощью objModule.AddCode. Поэтому предложение состоит в том, чтобы добавить класс, а затем добавить в него код как «Private WithEvents frm As New UserForm», «Private Sub frm_Click()» & _ vbNewLine & vbTab & «MsgBox» «Привет, мир из добавленного модуля». "& _ vbNewLine &" End Sub " –

+0

привет @MukulVarshney, thx для предложения. Но я не знаю, как добавить код к объекту, после добавления объекта в ScriptControl. Вы говорите, что хотите добавить модуль, но как связать добавленный модуль с добавленным объектом? Можете ли вы показать код? -thx –

ответ

1

Ключа, чтобы сделать его работу является: Вы должны установить событие-огневой-объект в слушателе-классе после добавления как к Script Control-- не раньше, чем. Значение, эта линия должна быть выполнена внутри SC:

Set oListener.EventFiringObject = oEventFiringObject

Вот рабочий пример стрельбы и реагирования на них, события между объектами внутри Control Script.

В этом примере:

  • я демонстрирую 2 вида событий стрельбы объектов: пользовательский класс, и рабочий лист.
  • Созданный пользовательский класс создается перед добавлением его в scriptcontrol ("sc").
  • Я вызываю метод в пользовательском объекте sc.

Для установки демо

  • Начать новый проект (т.е. добавить новую книгу в Excel).
  • В вашей VB IDE добавьте ссылку на Microsoft Script Control.
  • Создайте следующие компоненты VB:

Код

Класс clsSheetListener:

Public WithEvents oSht As Worksheet 

Private Sub oSht_Change(ByVal Target As Range) 
    ' show changed cell 
    MsgBox "Sheet Listener" & vbCrLf & "Changed: " & Target.Address _ 
      & vbCrLf & Target.Cells(1).Value2 
End Sub 

Класс clsEventClass:

Public Event MyEvent(sCaller As String) 

Public Sub Raise_MyEvent(sCaller As String) 
    RaiseEvent MyEvent(sCaller) 
End Sub 

Класс clsClassListener:

Public WithEvents m_oEventClass As clsEventClass 

Private Sub m_oEventClass_MyEvent(sCaller As String) 
    ' show my execution-scope 
    MsgBox "Class Listener, " & sCaller & " caller" 
End Sub 

Модуль Module1:

Function Main() 
    ' init scriptcontrol 
    Set m_oScriptCtl = Nothing 
    Set m_oScriptCtl = New MSScriptControl.ScriptControl 
    With m_oScriptCtl 
    .Language = "VBScript" 
    .AllowUI = True 

    ' add Excel application object, needed for all Excel methods in script-control 
    .AddObject "sc_Application", Application, True 


    ' add Sheet2 to the sc 
    ' code executed in sc refers to objects by name, as defined in .AddObject 
    .AddObject "sc_oSheet", Sheet2, True 

    ' init sheet event-listener, and add to sc 
    Dim oSheetListener As New clsSheetistener 
    .AddObject "sc_oSheetListener", oSheetListener, True 

    ' register the sheet-object with its listener in the scriptcontrol 
    ' so the listener can hear the sheet's events 
    .ExecuteStatement "Set sc_oSheetListener.oSht = sc_oSheet" 


    ' init custom event-firing class object, and add to sc 
    Dim oEventClass As New clsEventClass 
    .AddObject "sc_oEventClass", oEventClass, True 

    ' init class-event listener, and add to sc 
    Dim oClassListener As New clsClassListener 
    .AddObject "sc_oClassListener", oClassListener, True 

    ' register event-firing object with its listener inside the Script Control 
    ' so the listener can hear the object's events 
    .ExecuteStatement "Set sc_oClassListener.m_oEventClass = sc_oEventClass" 


    ' cause event to be raised. 
    ' Call from local context, then sc-context. 
    ' it's the same object instance in both cases 
    oEventClass.Raise_MyEvent "Local" 
    .ExecuteStatement "sc_oEventClass.Raise_MyEvent ""SC""" 

    End With 
End Function 

Тестирование

Шаг через Main(). Вы увидите, когда Raise_MyEvent стреляет MyEvent в clsEventClass, clsClassListener отвечает на событие сообщением.

Теперь переключитесь на интерфейс Excel и введите значение в ячейке в Sheet2. Вы увидите сообщение clsSheetListener на событие Change с полем сообщений.

+0

следующая цель состоит в том, чтобы создать экземпляр слушателя и/или источника событий внутри элемента управления скриптом ... –