派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【解説】Accessなぜ動かない?VBAコード内のSQLを修正せよ

この記事は、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」のソースを書き換えることができます。

いかがでしたか。動的な値で絞り込めましたか?

ダブルクォーテーションとシングルクォーテーションが並んでしまうと、慣れないと読み取りづらいのですが、覚えておくと便利なテクニックなので、ぜひ活用してみてくださいね。

【出題者】今村 ゆうこさん
Excel、Accessなどの書籍を執筆し、事務系プログラマー・ブロガー・ライターとして活動するワーキングマザー。著書のイラストや図解も手掛けている。著書には、『業務アプリ作成のための Access VBA 実践サンプル集~仕事の現場で即使える』『Excel & Access 連携実践ガイド ~仕事の現場で即使える』『Access 実践マスターガイド~仕事の現場で即使える』(以上、技術評論社)など多数。
ブログ https://ateitexe.com/
YouTubeチャンネル https://www.youtube.com/@ateitexe_yt

※本記事に記載されている会社名、製品名はそれぞれ各社の商標および登録商標です。

リクルートスタッフィング