この記事は、2024年8月30日に掲載した「エンジニアへの挑戦状 Accessなぜ動かない?VBAコード内のSQLを修正せよ」の解説です。まだ問題を解いていない方は、こちらからご覧ください。
SQLとVBAの知識で解いていく問題でした。
迷わずに選択肢から解答を選べましたか?解説していきます。
正解は、選択肢3
問題は、「cmb1」(図上部のコンボボックス)で値が選択されたら、そのカテゴリー情報で「cmb2」(図下部のコンボボックス)の選択肢を絞り込み、以下のような表示にするためのイベントプロシージャの正しいコードを選ぶ、というものでした。
コンボボックスへのソースは「RowSource」プロパティにSELECT文を代入するだけなので、固定のSQLならば簡単なのですが、「ユーザーの操作によって変化するコンボボックスの値」を組み込むと、ちょっと複雑になります。
それでは、1つめの選択肢から見ていきましょう。
選択肢1の解説
Private Sub cmb1_AfterUpdate()
Form_F1.cmb2.RowSource = "SELECT * FROM T1 WHERE Category=Form_F1.cmb1.Value;"
End Sub
これは、不正解です。
「cmb1」の値を取得する「Form_F1.cmb1.Value」が文字列内に含まれてしまっているため、コントロールを認識することができません。わかりやすいように色を付けた図を見てみてください。改行も利用しています(VBAでは「 _(半角スペース+アンダースコア)」で1行の命令を改行することができます)。
「"(ダブルクォーテーション)」で囲まれている部分が文字列となるので、コントロールの値もその中に含まれてしまいます。このままではコンボボックスの値が取得できないので、固定部分と可変部分を分割する必要があります。
選択肢2の解説
Private Sub cmb1_AfterUpdate()
Form_F1.cmb2.RowSource = "SELECT * FROM T1 WHERE Category=" & Form_F1.cmb1.Value & ";"
End Sub
選択肢1の固定部分と可変部分に分割して、「&」で文字列結合したものが、選択肢2です。これで、図のようにコンボボックスの値が取得できるようになりました。
ですが、この状態では「あと一歩」です。
このコードで「cmb1」の値が「RED」だったときに得られるSQLは「SELECT * FROM T1 WHERE Category=RED;」です。
「Category」フィールドはテキスト型のため、識別子の「'(シングルクォーテーション)」を含めて、「SELECT * FROM T1 WHERE Category='RED';」の形にしなければなりません。
選択肢3の解説
Private Sub cmb1_AfterUpdate()
Form_F1.cmb2.RowSource = "SELECT * FROM T1 WHERE Category='" & Form_F1.cmb1.Value & "';"
End Sub
選択肢2に、テキスト型フィールドを識別するための「'(シングルクォーテーション)」を含めたコードが、選択肢3です。
このコードで、テキスト型フィールド識別子の「'(シングルクォーテーション)」を含めて、「SELECT * FROM T1 WHERE Category='RED';」の形になります。
これで、コンボボックス「cmb1」の値を変更するたびにイベントプロシージャが実行され、「cmb2」のソースを書き換えることができます。
いかがでしたか。動的な値で絞り込めましたか?
ダブルクォーテーションとシングルクォーテーションが並んでしまうと、慣れないと読み取りづらいのですが、覚えておくと便利なテクニックなので、ぜひ活用してみてくださいね。