2016-09-17 48 views
3

我在MSScriptControl上读过的所有文档都说它可以响应添加到它的对象的事件。如何在Microsoft脚本控制中实现事件?

脚本控制允许您编写脚本,该脚本会在发生对象上的事件时自动触发 。 https://msdn.microsoft.com/en-us/library/ms974586.aspx

ScriptControl将能够吸收由使用AddObject方法添加的对象 生成的事件。 http://flylib.com/books/en/1.492.1.154/1/

但我没有成功这样做。我认为这意味着当添加的对象引发它的事件时,ScriptControl内部的代码将会触发。我无法得到任何工作。

寻求示例代码将任何对象添加到ScriptControl,并处理该控件触发的事件。不关心对象是自定义类,表单,控件还是内置Excel对象(如Worksheet)。

在Win Server 2008 64bit上运行Office 2010 32位。

开放的替代方法,如WSH,但梅塔的Tushar没有与此http://dailydoseofexcel.com/archives/2009/08/19/using-vbscript-to-monitor-office-eventsor-not/

成功,我已经成功地将Excel应用程序对象到ScriptControl的,和Excel应用程序对象上执行的代码:

这工作没有任何问题:

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( “环球”)CodeObject。Name_Of_Your_Event(参数列表)” 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”“Hello,world from added module。”“ “&_ vbNewLine&”End Sub“ –

+0

hi @MukulVarshney,thx for suggestion。但是,在将对象添加到ScriptControl后,我不知道如何向对象添加代码。你说要添加一个模块,但我如何将添加的模块与添加的对象关联?你能显示代码吗? -thx –

回答

1

以使其成为工作的重点是:必须后设置的监听级的事件触发对象都添加到脚本Control--不是之前。这意味着,这条线一定的SC里面执行:

Set oListener.EventFiringObject = oEventFiringObject

这里烧制的工作示例和脚本控制内部对象之间的响应,事件。

在这个例子中:

  • 我演示2种事件射击的对象:一个自定义类,以及一个工作表。
  • 自定义类在添加到scriptcontrol(“sc”)之前被实例化。
  • 我在自定义sc对象中调用方法。

要设置演示

  • 启动一个新的项目(即在添加新工作簿)。
  • 在您的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火灾发生时,您会看到MyEventclsEventClass,clsClassListener用消息框响应该事件。

现在切换到Excel前端,并在Sheet2的单元格中输入一个值。你会看到clsSheetListener回复Change事件与消息框。

+0

接下来的目标是实例化脚本控制中的侦听器和/或事件源... –