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

时间:2017-06-08 19:44:55

标签: vba function variables ms-access

我想设置如下的公共函数:

(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进行的尝试 - 将复选框控件设置为与表格中的当前值对齐 - > -1 = Y和0 = N,并且B - 更新表值,并根据该控件的onclick事件,将复选框切换为选中或取消选中,从原来的位置切换到相反的位置。

我想将chkField和chkControl变量设置为public-function,即table-field和form-control。我似乎无法获得正确的语法,并希望有人可能会澄清如何做到这一点。

表单加载和当前,我试过这个:

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真/假状态。我无法将复选框绑定到字段,因为它将表中的字段值更改为-1或0,我们需要它保持Y或N.我添加了一个绑定文本字段,以保存表/字段值对于每一行(因此在上面修订的代码中调用文本框控件)。该复选框未绑定,并且显示字段值,并允许用户选中和取消选中,因此我可以使用点击代码更改Y和N之间的表字段值。

上面的代码似乎并不是基于每一行显示每个绑定文本字段的正确复选框值。它显示基于当前具有焦点的行。如果我单击表格字段为Y的行,则表单上的所有行复选框都显示为true。如果我移动到表格字段为N的行,则所有行的所有复选框都将更改为false。我很难在最初得到1个复选框,根据表格中的每个记录,在连续表格的每一行上准确显示。这是一张小桌子,就像30条记录。我真的不认为以我们需要的方式呈现这一点会如此困难。

任何想法,我怎么能更好地做到这一点?

2 个答案:

答案 0 :(得分:1)

编辑:

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

= 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

答案 1 :(得分:0)

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

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

然后在你的其他功能中使用相同的想法。