访问公共功能表单和控制参数

时间:2018-07-27 17:40:57

标签: vba function ms-access parameter-passing

我设置了一个公共功能。除非要将日期控件的对应组合框控件设置为(绑定)值2,否则它就应该锁定并显示为灰色。我将此设置为公共函数,因此可以在表单加载时,当前调用它,当表单来回导航以及组合更改时触发。我还必须对两组成对的组合和日期控件执行此操作,因此将其包含在函数中可以方便地在需要时调用任何表单/控件配对。

这是公共功能:

Public Function DateFieldStatus(frm As Form, fkctl As Control, dtctrl As Control)
'Combo Status Values
'ID Combo
'1 =  not ok
'2 =  ok
'3 =  not ok

Select Case frm.fkctl
    Case 2
        frm.dtctrl.Locked = False
        frm.dtctrl.ForeColor = RGB(255, 255, 255)
    Case Else
        frm.dtctrl.Locked = True
        frm.dtctrl.ForeColor = RGB(214, 214, 214)
End Select
frm.dtctrl.Requery

End Function

我将其设置为调用主表单,如下所示:

Private Sub Form_Load()
    If DCount("ID", "tblMainTable") = 0 Then
        DoCmd.GoToRecord , , acNewRec
    Else
        DoCmd.GoToRecord , , acFirst
    End If
    Me.FirstControl.SetFocus
    DateFieldStatus Me.Form, Me.FKDropDown1, Me.dtDateControl1
End Sub

启动主窗体时,出现以下错误:

运行时错误“ 2465”: 应用程序定义或对象定义的错误

当我调试时,它突出显示了公共功能的这一行:

Select Case frm.fkctl

我假设它不喜欢将表单参数与控制参数结合在一起。

那不是你能做的吗?

有更好的方法吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

frm.fkctl在表单上寻找名为“ fkctl”的控件,但没有明显找到它。

您根本不需要将frm传递给函数-控制对象fkctl足以寻址该控件。

只需:

Select Case fkctl.Value

它将起作用。

可以

frm(fkctl.Name)

但这有点傻。

答案 1 :(得分:0)

谢谢,我意识到我不需要声明表格。我声明控件,当我调用该函数时,形式为。这是最终的解决方案:

公共职能-

offsetTop

以下是调用它的示例-

Public Function SmokerStatus(fkctl As Control, dtctrl As Control)
Dim Msg, Style, Title, Response
'ID Combo
'1 =  not ok
'2 =  ok
'3 =  not ok

    Msg = "You have changed the option status" & vbCrLf & _
    "to a status that doesn't require an option date." & vbCrLf & _
    "The corresponding option date has a value. " & vbCrLf & _
    "If you would like to delete that date, click yes, otherwise click no, and we will undo."
    Style = vbYesNo
    Title = "Option Date Only Applies to PAST Option Status"

Select Case fkctl
    Case 2
        dtctrl.Locked = False
        dtctrl.BackColor = RGB(255, 255, 255)
    Case Else
        If Nz(dtctrl, "") = "" Then
            dtctrl.Locked = True
            dtctrl.BackColor = RGB(214, 214, 214)
        Else
            Response = MsgBox(Msg, Style, Title)
            If Response = vbYes Then
                dtctrl.Value = ""
                dtctrl.Locked = True
                dtctrl.BackColor = RGB(214, 214, 214)
            Else
                fkctl.Undo

            End If
        End If
End Select
dtctrl.Requery

End Function

希望这对其他人有帮助。