ray88’s diary

お仕事で困ったとき用の自分用の覚書

コンボボックスで選んだ値に紐づいてテキストボックスの別カラムの値を表示させる方法②

VBAで実装する方法

Private Sub Form_Load()
'-----------------------------------------------
'フォーム読み込時にコンボボックスのソースを設定
'-----------------------------------------------
    With Me.cmb_Test
        'ソースのタイプを設定
    .RowSourceType = "Table/Query"
        'ソースを設定
        .RowSource = "T部署マスタ"
        '列数設定
        .ColumnCount = 2
        '各列の幅を設定
        .ColumnWidths = "1cm;2cm"
        '連結列の設定
        .BoundColumn = 1
        'リストボックスの幅を設定
        '1cm=567twipなので設定したいcmの数に567を掛ける
        .ListWidth = 3 * 567
    End With
End Sub

f:id:ray88:20201126205447p:plain
※コンボボックスのソースがテーブルやクエリで、ソースとなるテーブルの別カラムを反映させる場合は以下のコードで表示させる方法が一番簡単

Private Sub cmb_Test_AfterUpdate()
'----------------------------------------------------------------
'コンボボックスの値に紐づいてテキストボックスに表示させる値を設定
'----------------------------------------------------------------
    Me.txb_DepartmentName = Me.cmb_Test.Column(1)
End Sub

※コンボボックスのコントロールソースがテーブルやクエリ以外、またはソースとなるテーブルやクエリ以外の値を関連付けて表示させる場合はDlookup関数を使用

Private Sub cmb_Test_AfterUpdate()
'----------------------------------------------------------------
'コンボボックスの値に紐づいてテキストボックスに表示させる値を設定
'----------------------------------------------------------------
    Me.txb_DepartmentName = DLookup("部署名", "T部署マスタ", "部署コード=" & "cmb_Test")
End Sub

f:id:ray88:20201126205517p:plain

Private Sub btn_Clear_Click()
'----------------------------------------------------------
'クリアボタンでテキストボックスとコンボボックスの値をクリア
'----------------------------------------------------------
    Dim c As Object
    For Each c In Me.Controls
        If c.ControlType = acTextBox Or c.ControlType = acComboBox Then
            c = Null
        End If
    Next
End Sub

f:id:ray88:20201126205550p:plain
■以下の様に参照先が同じコンボボックスが複数ある場合で
DlookUp関数使用する場合の部品化
※何度も言うが、コンボボックスと同じテーブル・クエリの別カラムを反映させる場合は「コンボボックス名.Column(カラム番号)」で転記するのが一番簡単。
 コントロールソース以外の値を引っ張ってくる際にDlookupを使用する

f:id:ray88:20201126234630p:plain
呼び出し元のイベントプロシージャ

Private Sub cmb_Test2_AfterUpdate()
    Me.txb_DepartmentName2 = fncGetDepartment("cmb_Test2")
End Sub
Private Sub cmb_Test3_AfterUpdate()
    Me.txb_DepartmentName3 = fncGetDepartment("cmb_Test3")
End Sub
Private Sub cmb_Test4_AfterUpdate()
    Me.txb_DepartmentName4 = fncGetDepartment("cmb_Test4")
End Sub

部品化したコード

Function fncGetDepartment(cmbName As String) As String
'----------------------------------------------------------
'コンボボックスの値を元にテキストボックスの値を反映させる
'引数1:対象コンボボックスの名前
'戻り値:テキストボックスに表示させる値
'----------------------------------------------------------
    'Null値チェック
    If IsNull(Forms("テスト用").Controls(cmbName)) Then
        fncGetDepartment = ""
        Exit Function
    End If
    'コンボボックスで選択された値を取得
    Dim strCode As String
    strCode = Forms("テスト用").Controls(cmbName)
    '取得した値を条件式に部署名を抽出
    fncGetDepartment = DLookup("部署名", "T部署マスタ", "部署コード=" & Chr(34) & strCode & Chr(34))
End Function