Vba 访问公共函数窗体和控制参数

Vba 访问公共函数窗体和控制参数,vba,function,ms-access,parameter-passing,Vba,Function,Ms Access,Parameter Passing,我设立了一个公共活动。它意味着锁定日期控件并使其变灰,除非其对应的组合框控件设置为(绑定)值2。我将其设置为一个公共函数,这样我就可以在加载表单时调用它,在当前状态下,当表单来回导航时,以及当组合更改时,都会触发该函数。我还必须对两组成对的组合和日期控件执行此操作,因此在函数中使用它可以在需要时更轻松地调用任何表单/控件配对 这是公共职能: Public Function DateFieldStatus(frm As Form, fkctl As Control, dtctrl As Contr

我设立了一个公共活动。它意味着锁定日期控件并使其变灰,除非其对应的组合框控件设置为(绑定)值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
Select Case frm.fkctl
我将其设置为在加载主窗体时调用,如下所示:

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”: 应用程序定义或对象定义错误

当我调试时,它会高亮显示这一行公共函数:

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
Select Case frm.fkctl
我假设它不喜欢我把表单参数和控制参数结合起来

这不是你能做的吗

有更好的方法吗


谢谢你的帮助

frm.fkctl
正在表单上查找名为“fkctl”的控件,但显然找不到它

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

简单地做:

Select Case fkctl.Value
它会起作用的

你可以


但是这有点傻。

谢谢,我意识到我不需要申报表格。我声明了控件,当我调用函数时,表单是。以下是最终解决方案:

公共职能-

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
下面是一个称之为-

OptionStatus Me.FKOptionCombo, Me.dtOptionDate

希望这对其他人有所帮助。

表单后面是公共功能还是独立模块?独立模块。这是一个未在表单模块中设置的公共函数。这是我写的,不是吗?是的,很接近。我只是想为其他人提供完整的功能。@missscripty。。。通常情况下,在StackOverflow OPs上,当它向未来的读者发出信号时,他们会被要求提供帮助。答案通常针对特定的问题,而不是整个解决方案。这很好,但是1)在发布答案之前,我已经找到了答案,2)我想发布完整的解决方案,这样其他人可以得到帮助。