我在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
也许,添加对象只需添加该对象而不需要该对象的任何代码。就像您将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“ –
hi @MukulVarshney,thx for suggestion。但是,在将对象添加到ScriptControl后,我不知道如何向对象添加代码。你说要添加一个模块,但我如何将添加的模块与添加的对象关联?你能显示代码吗? -thx –