2016-11-04 6 views
0

フォームにチェックボックスに関する動作が表示されていますが、他の誰かがそれを見つけて説明できるかどうかは疑問です。MS Accessチェックボックスにブール値1または0以外の値があります

ここFrequencyCodesと呼ばれるテーブルにバインドされたフォーム、です:

Image of form with checkboxes

フォームが結合しているものの、チェックボックスが結合していないですが。フォームのロードイベントでは、1から7までの数字のカンマ区切り文字列(「CleaningDays」列内)を読み取り、ボックスを適切にチェックするプロシージャによってデータが読み込まれます。ここではそのコードは次のとおりです。

 
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 

アイデアは、「1週間に1回以上」のパターンが選択された場合、特定の日は、次に選択することができるということです。上のオプションボタン(洗浄パターン用)との視覚的な一貫性の理由から、チェックボックスを視覚的にグループ化するオプショングループコントロールを追加しました。チェックボックスを追加して複数のオプションを選択できるようにしました(オプショングループに含まれていれば明らかに不可能ですが、フォームからチェックボックスを切り取り、フォームの他の場所に貼り付けた後、オプショングループに含まれていたオプションの値ではなく、真または偽の可能な値を持つ "標準"チェックボックスのセットが生成されました。

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
?CHK2
-1
?chk3
-1
?chk4
? chk5
-1
?chk6
?chk7

は今、私はゼロ以外の値がtrueに相当し、そしてそれは、したがって、これらの値が動作する必要があることを知っています。しかし、彼らはそうではなかった。 OKをクリックすると、変更された値だけが正しく記録されることがわかりました。つまり、フォームがロードされたときに月曜日から金曜日にチェックを入れ、土曜日にOKをクリックする前にchk7(土曜日)選択されたものとして。

誰でもこの動作を私に説明できますか?これらのチェックボックスがまだオプショングループの一部であった場合、私は期待していたOptionValueプロパティを見ることができませんが、これは返される値のようです。

ありがとうございました!

+0

オプショングループは完全に機能します。 – Gustav

答えて

0

チェックボックスの値を設定すると、InStr()が文字列の位置を返すため、TrueまたはFalseを設定しません。

私はboolean型に結果を変換するために、このことをお勧め:安全のために、

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

し、それらを読んで:

If (ctl.Value <> False) Then 
は削除する_Rectangle_に_Option GROUP_を変更
+0

うーん - よく見えます。ありがとう。私の理論では、instrは0を返します.0はfalseの値、または0以外の値として解釈され、真の値と等しくなります。これは、ユーザーインターフェイスが実行され、必要に応じてチェックされ、アンティッキされていたものですが、trueではなく真であることをテストすると、私が想定したブール代数ではなく、ACTUAL値が割り当てられている。 – user1401286

関連する問題