広告

フォームのプルダウンに表示する選択肢を、Access内にあるデータに基づきインポート毎に更新する

インポートによりAccess内のデータが更新された時、その時点でテーブル上にある値だけを、プルダウンの選択肢として表示する機能をご紹介します。
結構簡単に追加できて、ツールの使い勝手が良くなるのでオススメ!です。

この機能のメリット

  1. 選択肢が減れば、プルダウンが短くなりユーザーが選びやすくなる。
  2. 該当レコードが存在しない場合は、そもそもプルダウンに表示されないので、「抽出実行してみたら、結果0件、残念!」という事態が起きない。
  3. 内部の蓄積データが段々と増えていくAccessに抽出機能を付ける場合に、データが増える度にプルダウンを手作業更新せずに済む。

手順概要

  1. プルダウン表示用のテーブルを、ネタ元のテーブルをグループ化したテーブル作成クエリで作成する
  2. 1のテーブル作成クエリを、追加クエリに変えて保存しておく。
  3. 1のプルダウン表示用テーブルの全レコードを削除する、削除クエリを作成する。
  4. フォームにコンボボックスを設置して、値集合ソースに1のプルダウン表示用テーブルを設定する。
  5. コンボボックスのプロパティを調整。
  6. データのインポート完了後、1のプルダウン表示用テーブルを、3の削除クエリ&2の追加クエリで更新し、その後にフォームをRecalcメソッドで更新するコードを作成する。
  • 左図のような「T_取引データ」テーブルにおいて、「現存するレコードに含まれている[商品コード]の値」だけを、プルダウンに表示させる場合の手順を解説して行くよ!

ポイントは2つあって、
①プルダウン表示用のテーブルの更新は、テーブル作成クエリによる再作成ではNGで(プルダウンの設定が死亡する)、テーブルは生かしたまま、削除クエリ→追加クエリの2段階で行う必要があること。
②フォームの更新は「Requery」ではなく「Recalc」メソッドで行うことです。

プルダウンに表示させる選択肢のテーブルを、テーブル作成クエリで作成する

  1. [商品コード]フィールドをグループ化してユニークな値を取り出すテーブル作成クエリを作る。
  2. すぐに実行して、プルダウン表示用のテーブルを作成しておく。この例では作成されるテーブル名を「t_商品C_プルダウン」としています。

上記のテーブル作成クエリを、追加クエリに変えて保存する

  1. 「クエリの種類」のところで「追加」をクリックして、追加クエリに変更する。
  2. 追加先のテーブル名は、テーブル作成クエリから引き継がれるので、そのままで「OK」。
  3. このクエリを命名保存しておく。(この例では「Q_商品C_プルダウン追加」クエリとしました。)

プルダウン用テーブルの全レコード削除用クエリを作成する

  1. プルダウン用のテーブルの全レコードを削除する削除クエリを作る
  2. この削除クエリを命名保存しておく。(この例では「Q_商品C_プルダウン削除」クエリとしました。)

フォームにコンボボックスを設置して、プルダウン用のテーブルを「値集合ソース」プロパティに設定する

コンボボックスをウィザードで作成(小さくてごめんよ、拡大して見て!)

見た目を調整して、例えばこんな感じ

コンボボックスのプロパティを調整する

  • ユーザー操作でプルダウンリストが改変されないように、以下の設定を追加するのをお勧めします。
  • 「入力チェック」→「はい」
  • 「値リストの編集の許可」→「いいえ」
  • 「値集合ソースの値のみの表示」→「はい」

フォームモジュールに、プルダウン更新用のコードを追加する

※ コードの記入先はプルダウン設置先フォームの、フォームモジュールになります。

Option Compare Database
Option Explicit

Private Sub btn_データインポート更新_Click()
Dim Q As Long

'◆ユーザーに実行意思を確認
Q = MsgBox("データインポートと「商品コード」のプルダウンの更新を実施しますか?", _
            vbYesNo + vbQuestion, "<確認>")
    If Q = vbNo Then
        MsgBox "キャンセルされました。"
        Exit Sub
    End If

'◆インポート処理を行う「データインポート」プロシージャーを実行
'(割愛するけどコチラのページのサンプルコードなども参考にしてね!)
Call データインポート

'◆インポート後にプルダウンを更新する
DoCmd.SetWarnings False
    DoCmd.OpenQuery "Q_商品C_プルダウン削除"
    DoCmd.OpenQuery "Q_商品C_プルダウン追加"
DoCmd.SetWarnings True

'◆フォームの再計算(プルダウンの更新)を実行
Me.Recalc

MsgBox "データインポートを実施し「商品コード」のプルダウンを最新状態に更新しました。"

End Sub