访问VBA公共功能 - 控制和字段的变量



我想设置一个公共函数,如下:

(a(

Public Function CheckYNField(chkControl As Control, chkField As String)
If chkField = "Y" Then
    chkControl = -1
ElseIf chkField = "N" Then
    chkControl = 0
Else: chkControl = 0
End If
End Function

(b(

Public Function CheckYNFlipper(chkControl As Control, chkField As String)
If chkField = "Y" Then
    chkField = "N"
    chkControl = 0
ElseIf chkField = "N" Then
    chkField = "Y"
    chkControl = -1
Else: chkField = "Y"
    chkControl = -1
End If
End Function

这样做的原因是,我有一个形式,该表格具有下面的SQL表。我无法控制数据,但我必须代表它,以维护数据。我有10个字段,在基础表中,它们具有y或n作为其值。数据类型实际上是NVARCHAR(10(。同时,我必须将这些字段显示为复选框控件,表单上,以易于使用。

上面的代码是我对A的尝试并根据该控件的ONCLICK事件将复选框切换到检查或未检查的情况。

我想将chkfield和chkcontrol变量变成公共功能,那就是桌面,以及形式控制。我似乎无法获得正确的语法,并希望有人可以澄清如何做到这一点。

对于表格负载和电流,我尝试了以下方式:

CheckYNField Forms("frmFormNameA").Controls(chkCheckNameA), tblTableName.FieldA

对于单击,我尝试了以下操作:

CheckYNFlipper Forms("frmFormNameA").Controls(chkCheckNameA), tblTableName.FieldA

我已经尝试了其他一些方法,但似乎没有起作用。我做错了什么,但我不能说什么。感谢任何提示!


编辑/更新:我尝试了Kostas K.的解决方案,放弃了用字段和控件参数来制作公共功能的想法。我将以下内容放在负载和当前:

With Me
    If .txtfieldboundtablefieldA.Value = "Y" Then
        .unboundchkA.Value = True
    ElseIf .txtfieldboundtablefieldA.Value = "N" Then
        .unboundchkA.Value = False
    Else: .unboundchkA.Value = False
    End If
End With

这是连续形式的,因此可以像巨大的网格一样显示出来。有一些识别绑定的字段控件,然后是一系列这些复选框,以显示每个特定字段的y/n true/false状态。我无法将复选框绑定到字段,因为它将表中的字段值更改为-1或0,我们需要将其保留y或n。我添加了一个绑定的文本字段,以保持表/字段值对于每一行(因此,在上述修订的代码中对文本框控件的调用(。该复选框是未结合的,并且可以在那里显示字段值,并允许用户检查和取消选中,因此我可以使用单击代码更改y和n。

之间的表字段值。

基于每一行,上面的代码似乎并未显示每个绑定文本字段的正确复选框值。它根据当前有重点的行显示。如果我单击一行,表字段为y,则表格上的所有行复选框显示为true。如果我移动到一行,在该行中为N,则所有行的所有复选框都会更改为false。我努力根据表中的每个记录,在连续表格的每一行上只能获得1个复选框,以准确显示。这是一张小桌子,例如30个记录。我真的认为以我们需要的方式呈现这并不难。

有什么想法,我怎么能做到这一点?

编辑:

将复选框的控制源设置为:

= IIf([YourYesNoField] = "Y", -1, 0)

为了单击时更新:

Private Sub chkCheckNameA_Click()
    Dim yesNo As String
        yesNo = IIf(Me.chkCheckNameA.Value = 0, "Y", "N") 'reverse value
    CurrentDb.Execute "Update [YourTable] SET [YourYesNoField]='" & yesNo & "' WHERE [ID]=" & Me![ID], dbFailOnError
    Me.Requery
End Sub

您可以尝试一下。

检查Y/N字段,并将函数的布尔返回值分配到复选框(a(。

在复选框单击事件上,检查其值并更新Y/N字段(B(。

'Form Load
Private Sub Form_Load()
    With Me
        .chkCheckNameA.Value = CheckYNField(![FieldA])
    End With
End Sub
'Click
Private Sub chkCheckNameA_Click()
    With Me
        ![FieldA] = IIf(.chkCheckNameA.Value = 0, "N", "Y")
    End With
End Sub
'True returns -1, False returns 0
Private Function CheckYNField(ByVal chkField As String) As Boolean
    CheckYNField = (chkField = "Y")
End Function

chkcontrol是一个控件,因此您需要访问该控件的属性。尝试将代码更改为:

Public Function CheckYNField(chkControl As Control, chkField As String)
If chkField = "Y" Then
    chkControl.Value = -1
ElseIf chkField = "N" Then
    chkControl.Value = 0
Else: chkControl.Value = 0
End If
End Function

,然后在您的其他功能中相同的想法。

最新更新