我不知道这是否可行,但是...
我有几种包含相同代码的表格,但是根据不同的查询,它们都有不同的数据。
当我以一种形式更新代码时,必须在所有其他形式上进行相同的更改。
为简化更新过程,我将表单代码移至模块,但表单停止工作。
如何调用模块中的事件?
这是表单代码的示例,我将在所有表单上使用该代码:
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
答案 0 :(得分:3)
将表单的实例作为参数传递,并使用其替换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
答案 1 :(得分:3)
另一种选择是将电话号码作为变量传递给函数:
' 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安装在此位置。
答案 2 :(得分:1)
ComIntern的回答肯定是正确的。但是您也可以调整代码以利用当前活动的表单:
-E
一个优点是,您可以将事件设置为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
,而不用编写单独的事件处理程序。缺点是它不支持报表,并且对子表单的处理可能很奇怪。