4章 カスタマイズ4-3フォーム

参照で指定範囲を表示する[Access]


コンボボックスで開く一覧の内容を限定することができます。
郵便番号を参照するコンボボックスを作成するには、下記サンプルを改良した「郵便番号参照コンボボックス作成[Access]」を参照してください。郵便番号参照が判りやすくなっています。
郵便番号テーブルのように11万件以上あるテーブルをコンボボックスですべて表示することができません。この場合、表示する範囲を限定して表示するか、テーブルを分割する必要があります。ここでは、表示する範囲を限定して表示する方法を郵便番号テーブルを例にとって説明します。
範囲を指定するコントロールが1つ追加されます。範囲を指定して参照を行うという操作になります。
[郵便番号参照]


<[郵便番号]テーブルの準備>
[郵便番号クエリー]
  1. Soraシステムでは、[郵便番号]テーブルをSoraYbn.mdbデータベースして提供します。(バージョン以降)
  2. ユーザシステムに郵便番号テーブルをリンクします。
    [メニューバー]-[ファイル]-[外部データの取り込み]-[テーブルのリンク]で行います。
  3. 参照用の[郵便番号クエリー]を作成します。
    SoraYbn.mdbデータベースの[郵便番号クエリー]をインポートします。

<フォームに範囲指定参照機能を追加>
既存の[顧客]フォームを元に説明します。 実際の作業は既存の[顧客]フォームのコントロールとイベントプロシージャをコピーしてください。
  1. 非連結の[郵便番号範囲]テキストボックスを作成します。
  2. [新郵便番号]テキストボックスをコンボボックスに変換します。
  3. [新郵便番号]コンボボックスを内容を表示せず一覧のみ開くように小さくします。
  4. 下記の[新郵便番号]の[更新後処理]イベントと[フォーカス取得時]イベントを追加します。
    Private Sub 新郵便番号_AfterUpdate()
    '更新後処理
        '[住所1]更新
        Dim ctlJyu1 As Control
        Set ctlJyu1 = Me![住所1]
        Dim ctlMe As Control
        Set ctlMe = Me![新郵便番号]
        If IsNull(ctlJyu1) Then
            ctlJyu1 = ctlMe.Column(1)
        Else
            If Not (ctlJyu1 Like ctlMe.Column(1) & "*") Then
                ctlJyu1 = ctlMe.Column(1)
            End If
        End If
        '[郵便番号範囲]更新
        Me![郵便番号範囲] = Me![新郵便番号]
    End Sub
    
    Private Sub 新郵便番号_Enter()
    'フォーカス取得時
        Dim ctlMe As Control
        Dim strBuf As String
        Set ctlMe = Me![新郵便番号]
        If Not IsNull(ctlMe.Text) Then
            If Not IsNull(Me![郵便番号範囲]) Then
                strBuf = Me![郵便番号範囲]    '郵便番号範囲取得
            Else
                strBuf = "0000000"
            End If
            With ctlMe
            .RowSourceType = "Table/Query"  '値集合タイプ
            .RowSource = "SELECT * FROM 郵便番号クエリー WHERE 郵便番号7桁 Like '" & strBuf & "*';"
            .ColumnCount = 2                '列数
            .ColumnHeads = True             '列見出し
            .ColumnWidths = "2cm;7cm"    '列幅
            .BoundColumn = 1                '連結列
            .ListRows = 8                   'リスト行数
            .AutoExpand = False             '自動拡張
            .Requery        '再クエリー(上記設定を実行)
            End With
        End If
    End Sub
    
  5. フォームの[レコード移動時]イベントに下記内容を追加します。
        If Not IsNull(Me![新郵便番号]) Then     '
            Me![郵便番号範囲] = Me![新郵便番号]
        End If
    
    <追加後の内容>
    Private Sub Form_Current()
    'レコード移動時
        apFrmCurrent Me
        If Not IsNull(Me![新郵便番号]) Then     '
            Me![郵便番号範囲] = Me![新郵便番号]
        End If
        Me![顧客名].SetFocus        'フォームを開いたときのカーソルの位置
    End Sub
    

<参照>
  1. 書籍「できるAccess97」
    28特定のフィールドだけ表示するには(p84)