MS Access复选框的值不是布尔值1或0

时间:2016-11-04 10:44:59

标签: ms-access checkbox access-vba

我看到表格上有关复选框的行为看起来很奇怪,而且我想知道是否有其他人遇到它并且可以解释它。

这是表单,绑定到名为FrequencyCodes的表:

Image of form with checkboxes

虽然表单已绑定,但复选框未绑定。在Form的加载事件中,它们由一个过程填充,该过程读​​取逗号分隔的字符串(在“CleaningDays”列中),数字来自1-7,相应地选中复选框。这是代码:

Dim ctl As Control
For Each ctl In Me.Controls
    If TypeOf ctl Is CheckBox Then
        ctl.Value = InStr(1, Me.CleaningDays & ",", Right(ctl.Name, 1) & ",")
    End If
Next ctl

这个想法是,如果选择“每周一次或多次”的模式,则可以选择特定的日期。出于与上面的选项按钮(对于清洁模式)视觉一致性的原因,我添加了一个选项组控件,以便可视化地将复选框组合在一起。我添加了复选框,然后我可以选择多个选项(如果它们是选项组的一部分,显然是不可能的,我从表单中剪切复选框,将它们粘贴到表单上的其他位置,然后将它们拖回到这导致了一组“标准”复选框,可能的值为true或false,而不是选项值1-7或其他任何值,如果它们是选项组的一部分。这是其中一个的属性表:

Properties sheet for checkbox

然后我创建了一些代码,在OK按钮的Click事件中循环显示复选框,并使用其名称的最后一个字符(它们称为chk1-chk7)构建逗号分隔的日期列表当清洁发生时。

以下是代码:

    Dim ctl As Control
Dim Output As String

For Each ctl In Me.Controls
    If TypeOf ctl Is CheckBox 
        If (ctl = True) Then
            Output = Output & Right(ctl.Name, 1) & ","
        End If
    End If
Next ctl

If Output <> vbNullString Then
    Debug.Print "String calculated was " & Left(Output, Len(Output) - 1)
    ReadCheckBoxes = Left(Output, Len(Output) - 1)
Else
    ReadCheckBoxes = vbNullString
End If

表单没有按预期工作,所以我做了一些测试。复选框似乎没有按预期返回布尔值(或1和0)。

你可以从上面的截图中看到,在这个特定的测试中,我选择了周一到周五的选项(chk2 - chk6的值应为true)。

然而,这是我在即时窗口中进行一些测试时发现的:

? CHK1
0
?CHK2
-1
?chk3
-1
?chk4
1
? chk5
-1
?chk6
3
?chk7
0

现在,我知道任何非零值都等于true,因此这些值应该有效。但他们不是。我发现点击OK后,只会更正值被记录 - 所以,如果,当表格被加载时,星期一到星期五被勾选,然后我点击星期六然后点击OK,只记录chk7(星期六)被选中。

任何人都可以向我解释这种行为吗?我看不到OptionValue属性,如果这些复选框仍然是选项组的一部分,我希望看到它,但这似乎是返回的值。

谢谢!

1 个答案:

答案 0 :(得分:0)

设置复选框值时,不要设置True或False,因为InStr()会返回字符串位置。

我建议将结果转换为布尔值:

ctl.Value = (InStr(1, Me.CleaningDays & ",", Right(ctl.Name, 1) & ",") > 0)

阅读它们时,为了安全起见:

If (ctl.Value <> False) Then