今回はAccessで複数(3つ)のチェックボックスのTrue/Falseの組み合わせによってデータの抽出条件を変えるプログラムを作成しました。
IF文やCASE文などでずらっと書くこともできますが、今回は選択状態を数字に換算することによって短いコードで記述することができました。
抽出条件(要件)
検索条件を入力する画面内に以下のような変化の状態を選択するチェックボックスを用意します。
枠囲みしていますがオプショングループでありません。それぞれが独立したチェックボックスです。(複数選択可)
検索対象のデータは体重で、見ての通り増加にチェックがあれば体重増加者を抽出。
変化なしにチェックがあれば体重に変化のない人を抽出。
減少にチェックがあれば体重が減少した人を抽出します。
簡単な実装方法
深く考えずに抽出条件を書くならば以下のように、各条件をOR句で連結する方法も可能です。
'条件句文字列 Dim strCriteria As String strCriteria = "" '増加にチェックあり If Me.chk増加 = True Then strCriteria = "体重変化 > 0" End If '変化なしにチェックあり If Me.chk変化なし = True Then If strCriteria <> "" Then strCriteria = strCriteria & " OR " strCriteria = strCriteria & "体重変化 = 0 " End If '減少にチェックあり If Me.chk減少 = True Then If strCriteria <> "" Then strCriteria = strCriteria & " OR " strCriteria = strCriteria & "体重変化 < 0 " End If
この書き方をすると、すべてにチェックがあったとき、以下のような条件文になってしまいます。
体重>0 OR 体重=0 OR 体重<0
これはもはや愚の骨頂です。
3つチェックは極端な例ですが2つチェックの場合も結構無駄です。本来『体重>=0』で済むべきところが以下のような記述になってしまいます。
体重>0 OR 体重=0
複数の選択値の組み合わせを数値に変換して条件記述
先ほどのプログラムはもう少し作りこんで条件分岐させてあげれば『体重>=0』のように記述することも可能ですが、かなりIF文のステップ数が多くなってしまって面倒でした。
そこで、もう少ししっかり考えることにします。
組み合わせによって指定したい条件は決まります。(組み合わせの数は8通りです)
増加 | 変化なし | 減少 | 条件 |
✔ | ✔ | ✔ | 指定不要 |
✔ | ✔ | ― | 体重>=0 |
✔ | ― | ― | 体重>0 |
✔ | ― | ✔ | 体重<>0 |
― | ✔ | ✔ | 体重<=0 |
― | ✔ | ― | 体重=0 |
― | ― | ✔ | 体重 |
― | ― | ― | 指定不要 |
増加と変化なしと減少をそれぞれ、1、2、4の数字に置き換えて合計を計算してみます。
3つの組み合わせなので1・2・4を使って合算すれば必ずユニークな数字になります。
(ファイルのパーミッションはrwxを124で表しますよね。1,2,3では1と2が指定されたのか3が指定されたのか分かりませんね。)
増加 | 変化なし | 減少 | 合計 |
1 | 2 | 4 | 7 |
1 | 2 | ― | 3 |
1 | ― | ― | 1 |
1 | ― | 4 | 5 |
― | 2 | 4 | 6 |
― | 2 | ― | 2 |
― | ― | 4 | 4 |
― | ― | ― | 0 |
i = 0 If Me.chk増加 = True Then i = 1 If Me.chk変化なし = True Then i = i + 2 If Me.chk減少 = True Then i = i + 4 Select Case i Case 0, 7: Case 1: strCriteria = strCriteria & " AND 体重変化 > 0" Case 2: strCriteria = strCriteria & " AND 体重変化 = 0" Case 3: strCriteria = strCriteria & " AND 体重変化 >= 0" Case 4: strCriteria = strCriteria & " AND 体重変化 < 0" Case 5: strCriteria = strCriteria & " AND 体重変化 <> 0" Case 6: strCriteria = strCriteria & " AND 体重変化 <= 0" End Select
IF文ですべて記述しても良いのですが、ちょっと一捻りしたら楽しかったので共有します!
あとからコードを読む方の可読性を上げるためにもコメントはしっかり書いておきましょう。