ExcelとAccessのスキルアップをサポートするサイトです

ExcelとAccessの学習室

【Access VBA】サブフォームをコンボボックスで切り替える方法

Accessデータベースを構築するとき、必要以上にフォームが増えてしまうのが意外と悩ましい問題です。
今回は、増えすぎたフォームの数を減らすための効果的な方法を解説します。

データベースを構築するためには、データの正規化は必須です。
データの正規化をしっかりと行うことでテーブルが分割され、結果データ入力や編集を行うためのフォームの数も増加します。

高機能なフォームであれば、もちろん増やしても問題ないです。
あまり高度な機能を実装できないマスタデータなどは、フォームの数が増えすぎることで、却って操作性やメンテナンス性を低下させてしまいます。

本記事では、コンボボックスを使ってサブフォームを切り替える方法を解説します。
サブフォームを切り替えることにより、フォームの数を減らせるだけでなく、画面遷移の手間も省けます
Accessデータベースに実装しておくととても便利なので、ぜひ習得しておきましょう。

また、今回もサンプルデータベースを準備していますので活用してください。

≫ サンプルデータベース「Mst_Swtch_Example.accdb」

完成品の動作

サンプルデータベースのフォーム「F00基本マスタM_Combo」を開きます。

サブフォームとコンボボックスが配置されています。
デフォルトで表示されているのは大分類のマスタデータです。

コンボボックスで中分類を選びます。

サブフォームが中分類のマスタデータに切り替わりました。

このようにコンボボックスを使ってサブフォームを切り替えることで、Accessファイル内のフォーム数を減らし、画面遷移の操作性を上げることができます。

フォーム起動後に作動するコード

以下はフォーム起動時に作動するコードです。

Private Sub Form_Load()

    Me.RecordSelectors = False ' レコードセレクタを非表示にする
    Me.NavigationButtons = False ' 移動ボタンを非表示にする

    'データシートフォームの範囲設定
    Me.F00基本マスタDS.SourceObject = "F00大分類マスタDS"
    
    Me.マスタ選択.RowSourceType = "Value List"
    Me.マスタ選択.RowSource = ""
    Me.マスタ選択.AddItem "大分類"
    Me.マスタ選択.AddItem "中分類"
    Me.マスタ選択.AddItem "小分類"
    Me.マスタ選択.AddItem "発注先"
    Me.マスタ選択.AddItem "発注者"
    Me.マスタ選択.Value = "大分類"
    
End Sub

フォームに配置されているサブフォームコントロールは「F00基本マスタDS」、コンボボックスは「マスタ選択」です。
サブフォームのSourceObjectを設定することで、表示させるサブフォームを切り替えることが可能です。

「F00基本マスタDS」の初期値は「F00大分類マスタDS」、「マスタ選択」は「大分類」を設定しています。

コンボボックスのLowSourceTypeは「Value List」を指定し、AddItemでリストを直接入力しています。
項目数が少なく、わざわざテーブルを作る必要が低い場合は、このように値を直接設定する方法も有効です。

また、リストを全クリアするための以下の一文を入れているのも大事なポイントです。

Me.マスタ選択.RowSource = ""

リストをクリアしておかないと、次回以降フォームを開いたとき、下の画像のようにリストが追加入力されてしまうことがあります。

実際にプログラムを動かして、どんな悪さが影響するかを導入前に必ず把握し、手直しを済ませておきましょう

コンボボックスの操作後に作動するコード

以下はマスタデータを切り替えるコードです。

Private Sub マスタ選択_BeforeUpdate(Cancel As Integer)

    Select Case Me.マスタ選択.Value
        Case "大分類"
            Me.F00基本マスタDS.SourceObject = "F00大分類マスタDS"
        Case "中分類"
            Me.F00基本マスタDS.SourceObject = "F00中分類マスタDS"
        Case "小分類"
            Me.F00基本マスタDS.SourceObject = "F00小分類マスタDS"
        Case "発注先"
            Me.F00基本マスタDS.SourceObject = "F01発注先マスタDS"
        Case "発注者"
            Me.F00基本マスタDS.SourceObject = "F00発注者マスタDS"
    End Select

End Sub

Select文でシンプルにSourceObjectを切り替える方法です。
コンボボックスの値をそのまま参照するときは、IF文よりは可読性の高いSELECT文を使うことをおすすめします。

まとめ

今回は、サブフォームをコンボボックスで切り替える方法を解説しました。

この方法を使えるようになれば、シンプルなマスタデータなどは画面遷移せず切り替えられるので、操作性とメンテナンス性ともにメリットが大きいです。

Accessの画面作りに慣れた方は、本記事で紹介したようなちょっとした工夫を試してみると良いでしょう。
Access作りがもっと楽しくなるはずです。