如何使MS Access 2007表单代码在模块中工作

时间:2018-09-12 12:47:19

标签: vba ms-access ms-access-2007

我不知道这是否可行,但是...

我有几种包含相同代码的表格,但是根据不同的查询,它们都有不同的数据。

当我以一种形式更新代码时,必须在所有其他形式上进行相同的更改。

为简化更新过程,我将表单代码移至模块,但表单停止工作。

如何调用模块中的事件?

这是表单代码的示例,我将在所有表单上使用该代码:

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

3 个答案:

答案 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 ,而不用编写单独的事件处理程序。缺点是它不支持报表,并且对子表单的处理可能很奇怪。