Microsoft Access のコンボ ボックスの選択から特定のレコードに移動する方法

中程度: 基本的なマクロ、コーディング、相互運用性のスキルが必要です。

この記事は、Microsoft Access データベース (.mdb) ファイルまたは Microsoft Access データベース (.accdb) ファイルに適用されます。

概要

この記事では、コンボ ボックスからの選択に基づいて特定のレコードに移動する 4 つの方法について説明します。 メソッドは次のとおりです。

  • コンボ ボックスの AfterUpdate イベントで、FindFirst メソッドを使用するコードを実行します。
  • コンボ ボックスの AfterUpdate イベントで、フォームの Filter プロパティを再クエリするマクロを呼び出します。
  • フォーム/サブフォームは、メイン フォームのコンボ ボックスと、サブフォームコントロールの LinkMasterFields プロパティと LinkChildFields プロパティによってバインドされたサブフォーム内のデータと共に使用します。
  • 2 つのテーブルを結合するクエリに基づいてフォームを作成し、AutoLookup 手法を使用して、結合を制御するフィールドにコンボ ボックスをバインドします。

これら 4 つの方法については、この記事の「詳細情報」セクションで説明し、Northwind サンプル データベースに基づいています。

詳細

Microsoft は、例示のみを目的としてプログラミング例を提供しており、明示または黙示にかかわらず、いかなる責任も負わないものとします。 これには、市販性または特定の目的との適合性についての黙示の保証も含まれますが、これに限定はされません。 この記事は、説明されているプログラミング言語、手順を作成およびデバッグするために使用されているツールに読者が精通していることを前提にしています。 マイクロソフト サポート窓口では、特定のプロシージャの機能説明に関するご質問に対して支援いたしますが、本例を特定の目的を満たすために機能を追加したり、プロシージャを構築することは行いません。

注意

この例の手順に従う場合は、サンプル データベースのNorthwind.mdbを変更します。 Northwind.mdb ファイルをバックアップし、データベースのコピーに関する次の手順に従います。

次の表は、4 つの方法の特徴 (利点と欠点) を比較しています。

メソッド 1 2 3 4
コード/マクロは必要ありません x
サブフォームは必要ありません x x
他のレコードまでスクロールできます x x
クエリは必要ありません x x x x
レコードを編集できます x x x x
他のモードでフォームを開く x

注:

これらのメソッドは、テキスト ボックスにも適用できます。

方法 1

  1. ProductID フィールドと ProductName フィールドを持つ Products という名前のテーブルを作成します。

  2. AutoForm: Columnar ウィザードを使用して、Products テーブルに基づく新しいフォームを作成し、フォームを frmComboTest として保存します。

    Microsoft Office Access 2003 以前のバージョンの Access でこれを行うには、次の手順に従います。

    1. [データベース] ウィンドウで、[オブジェクト] の [フォーム] をクリックします。
    2. [データベース] ウィンドウ のツール バーの [ 新規 ] をクリックします。
    3. [ 新しいフォーム ] ダイアログ ボックスで、[ AutoForm: Columnar] をクリックし、ドロップダウン リストで [製品] テーブルを選択し、[OK] をクリック します
    4. フォームを frmComboTest として保存します。

    Microsoft Office Access 2007 以降のバージョンでこれを行うには、次の手順に従います。

    1. [作成] タブで、[フォーム] グループの [フォーム ウィザード] をクリックします。
    2. [ ウィザードから ] ダイアログ ボックスで、ドロップダウン リストの [製品] テーブルを選択します。
    3. 新しいフォームに表示するフィールドを選択し、[ 次へ] をクリックします。
    4. [ 縦棒 ] オプションを選択してフォームのレイアウトを設定し、[ 次へ] をクリックします。
    5. フォーム タイトルとして 「frmComboTest 」と入力し、[ 完了] をクリックします。
  3. コンボ ボックス ウィザードを使用して、バインドされていないコンボ ボックスを追加します。 これを行うには、次の手順を実行します。

    1. デザイン ビューで frmComboTest フォームを開きます。
    2. ツール バーで、 コントロール ウィザード が選択されていることを確認します。

    注:

    Access 2007 以降のバージョンでは、[デザイン] タブの [コントロール] グループで [コントロール ウィザード使用] が選択されていることを確認します。

    1. frmComboTest フォームにコンボ ボックスを作成します。

    注:

    Access 2007 以降のバージョンで、[デザイン] タブの [コントロール] グループで [コンボ ボックス] をクリックし、frmComboTest フォームをクリックします。 [ ビルダーの選択 ] ダイアログ ボックスで、[ コンボ ボックス ウィザード] をクリックし、[OK] をクリック します

    1. [コンボ ボックス ウィザード] ダイアログ ボックスで、[コンボ ボックスで選択した値に基づいてフォーム上のレコードを検索する] オプションを選択し、[次へ] をクリックします。
    2. [ProductID] フィールドと [ProductName] フィールドを選択し、[ 次へ] をクリックします。
    3. [完了] をクリックします。

    コンボ ボックス ウィザードでは、次のようなイベント プロシージャが作成されます。

    Private Sub Combo0_AfterUpdate()
         ' Find the record that matches the control.
         Dim rs As Object
    
     Set rs = Me.Recordset.Clone
         rs.FindFirst "[ProductID] = " & Str(Nz(Me![Combo20], 0))
         If Not rs.EOF Then Me.Bookmark = rs.Bookmark
    End Sub
    
  4. フォーム ビューで frmComboTest フォームを表示します。

    コンボ ボックスで製品名を選択すると、選択した製品のレコードに移動します。

方法 2

  1. メソッド 1 の手順 2 で説明されているように 、AutoForm: Columnar Wizard を使用して Products テーブルに基づいて新しいフォームを作成し、フォームを frmComboTest2 として保存します。

  2. frmComboTest2 フォームの [プロパティ シート] ページで、[データ] タブの Filter プロパティを に[ProductName] = Forms![frmComboTest2]![cboLookup]設定します。

  3. cboLookup という名前のバインドされていないコンボ ボックスを追加し、コントロールのプロパティを次のように設定します。

    Combo Box
    -----------------------------------------------------
    ControlName: cboLookup
    ControlSource: <leave blank>
    RowSourceType: Table/Query
    RowSource: Select [ProductName] from Products;
    BoundColumn: 1
    ColumnWidths: 1"
    AfterUpdate: mcrLocateProduct
    
  4. mcrLocateProduct という名前の次のマクロを作成します。

    Action
    --------------------------------------
    SetValue
    Requery
    
    mcrLocateProduct Actions
    --------------------------------------
    SetValue
    Item: Forms![frmComboTest2].FilterOn
    Expression: True
    

    frmComboTest2 フォームを開き、cboLookup コンボ ボックスから製品名を選択すると、フィルターはその値に設定されます。

方法 3

  1. メソッド 1 の手順 2 で説明されているように 、AutoForm: Columnar Wizard を使用して Products テーブルに基づいて新しいフォームを作成し、フォームを frmSub として保存します。

  2. frmSub フォームの [プロパティ シート] ページで、[書式] タブの [既定のビュー] プロパティを [単一フォーム] に設定します。

  3. (テーブルまたはクエリに基づいていない) 新しいフォームを作成し、frmMain として保存します。 次に、コンボ ボックスを追加し、そのプロパティを次のように設定します。

    Combo Box
    ----------------------------
    ControlName: cboLookup
    ControlSource: <leave blank>
    RowSourceType: Table/Query
    RowSource: Products
    ColumnCount: 4
    ColumnWidths: 0";2"
    BoundColumn: 1
    
  4. frmSub フォームのサブフォーム コントロールを挿入します。

    • [サブフォーム/サブレポートデザイン>] に移動し、サブフォーム ウィザードを取り消します。
    • ナビゲーション ウィンドウから frmMain フォームに frmSub をドラッグ アンド ドロップします。
  5. サブフォーム コントロールのプロパティを次のように設定します。

    Subform
    ----------------------------
    LinkChildFields: [ProductID]
    LinkMasterFields: cboLookup
    

    cboLookup コントロールの値を変更することで、サブフォーム内のレコードがコンボ ボックスと一致するようにします。

    Northwind サンプル データベースの Orders フォームは、このメソッドを示しています。 Order Details サブフォームは、 LinkMasterFields プロパティと LinkChildFields プロパティによって関連付けられます。

方法 4: WHERE 句で OpenForm マクロ アクションを使用する

  1. メソッド 1 の手順 2 で説明されているように 、AutoForm: Columnar Wizard を使用して Products テーブルに基づいて新しいフォームを作成し、フォームを frmComboTest5 として保存します。

  2. cboLookup という名前のバインドされていないコンボ ボックスを追加し、コントロールのプロパティを次のように設定します。

    Combo Box
    -----------------------------------------------------
    ControlName: cboLookup
    ControlSource: <leave blank>
    RowSourceType: Table/Query
    RowSource: SELECT [ProductID], [ProductName] FROM Products ORDER BY [ProductName];
    BoundColumn: 1
    ColumnCount: 2
    ColumnWidths: 0";1"
    
  3. マクロ ビルダーで、cboLookup コンボ ボックスのイベントに AfterUpdate 新しい埋め込みマクロを作成します。

  4. [ 新しいアクションの追加] ドロップダウン リストで、[ OpenForm] を選択し、次のプロパティを設定します。

    Form Name:   frmComboTest5
    View:        Form
    Filter Name: <leave as empty>
    Where Condition: [ID] = [Forms]![frmComboTest5]![cboLookup].value
    Data Mode: <optional>
    Window Mode: <optional>
    
  5. マクロを保存して閉じます。

  6. フォームを保存して実行します。

コンボ ボックスの値を変更すると、フォームは閉じられ、フィルターが適用された状態で再度開かれます。