我不知道这是否可能,但......
我有几个包含相同代码的表单,但它们都具有基于不同查询的不同数据。
当我以一种形式更新代码时,我必须对所有其他表单进行相同的更改。
为了简化更新过程,我将表单代码移动到模块,但表单停止工作。
如何从模块中调用事件?
这是一个表单中的代码示例,我将在我的所有表单中使用:
Public Sub CallSkype_Click()
Dim strProgramName As String
Dim strArgument As String
strProgramName = "C:\Program Files (x86)\Skype\Phone\skype.exe"
strArgument = "/callto:+01" & Me.Phone & ""
Call Shell("""" & strProgramName & """ """ & strArgument & """",
vbNormalFocus)
End Sub
将表单的实例作为参数传递并使用它来替换Me
:
Public Sub CallSkypeHandler(instance As Object)
Dim strProgramName As String
Dim strArgument As String
strProgramName = "C:\Program Files (x86)\Skype\Phone\skype.exe"
strArgument = "/callto:+01" & instance.Phone & ""
Shell """" & strProgramName & """ """ & strArgument & """", vbNormalFocus
End Sub
来自通话表格:
Public Sub CallSkype_Click()
CallSkypeHandler Me
End Sub
另一种选择是将电话号码作为变量传递给函数:
' sub in module
Public Sub MakeSkypeCall(PhoneNumber As String)
Dim strProgramName As String
Dim strArgument As String
strProgramName = "C:\Program Files (x86)\Skype\Phone\skype.exe"
strArgument = "/callto:+01" & PhoneNumber
Call Shell("""" & strProgramName & """ """ & strArgument & """", _
vbNormalFocus)
End Sub
然后,您的表单只会调用该子表单,并将电话号码传递给:
' calling sub from form
Public Sub CallSkype_Click()
MakeSkypeCall Me.Phone
End Sub
使用这种方法,您甚至无需使用表单即可轻松测试代码。
您可能还需要考虑不在代码中对Skype的程序路径进行硬编码:如果其他用户正在使用该数据库,则无法保证将在此位置安装Skype。
ComIntern的答案肯定是有效的。但您也可以调整代码以使用当前活动的表单:
Public Sub CallSkype()
Dim strProgramName As String
Dim strArgument As String
strProgramName = "C:\Program Files (x86)\Skype\Phone\skype.exe"
strArgument = "/callto:+01" & Screen.ActiveForm!Phone.Value & ""
Call Shell("""" & strProgramName & """ """ & strArgument & """",
vbNormalFocus)
End Sub
一个优点是,您可以将事件设置为=CallSkype()
,而不是编写单独的事件处理程序。缺点是它不支持报告,并且可能对子表单很奇怪。