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

问题描述 投票:1回答:3

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

我有几个包含相同代码的表单,但它们都具有基于不同查询的不同数据。

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

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

如何从模块中调用事件?

这是一个表单中的代码示例,我将在我的所有表单中使用:

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
vba ms-access ms-access-2007
3个回答
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

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。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.