【发布时间】:2016-09-17 00:50:13
【问题描述】:
我在 MSScriptControl 上阅读的所有文档都说它可以响应添加到其中的对象的事件。
脚本控件允许您编写脚本,该脚本将自动 当对象上的事件发生时触发。 https://msdn.microsoft.com/en-us/library/ms974586.aspx
ScriptControl 将能够接收对象生成的事件 使用 AddObject 方法添加。 http://flylib.com/books/en/1.492.1.154/1/
但我这样做没有成功。我假设这意味着 ScriptControl 内的代码将在添加的对象引发它的事件时触发。我无法让任何人工作。
寻找将 any 对象添加到 ScriptControl 并处理由该控件触发的事件的示例代码。不要关心对象是自定义类、窗体、控件还是内置 Excel 对象(如 Worksheet)。
在 Win Server 2008 64 位上运行 Office 2010 32 位。
对替代方法持开放态度,例如 WSH,但 Tushar Mehta 在这里没有成功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
不确定以下是否相关,不太明白: http://www.programmersheaven.com/discussion/79452/me-activecontrol-and-events
【问题讨论】:
-
可能,添加对象只是添加对象而没有该对象的任何代码。就像您将 oClass 添加为对象但未添加其代码一样。我认为这是因为我们设置了 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 & "结束子"
-
嗨@MukulVarshney,谢谢你的建议。但是,在将对象添加到 ScriptControl 之后,我不知道如何向对象添加代码。您说要添加一个模块,但是我如何将添加的模块与添加的对象关联?你能显示代码吗? -thx
标签: excel vba vbscript scriptcontrol msscriptcontrol