【ACCESS コントロール】リストボックス
リストボックスとは
Access データベースのフォームにデータを入力する場合
一覧から値を選ぶ方が 値を覚えて入力するよりも早くて簡単です
選択肢の一覧があれば 確実に適切な値がフィールドに入力されます
リスト コントロールは 既存のデータに結び付けることも コントロール作成時に入力した固定値を表示することもできます
リストボックス【動画で紹介】
リストボックス使用例 ①
動作の流れ
上のリストボックスには 3種類のマスタが一覧で表示されています
社員マスタを選ぶと下のリストボックスには 社員マスタの 社員コード 社員氏名が表示されます
そのリストから誰かを選ぶとその社員のメールアドレスが下のテキストボックスに表示します
同様に上部のリストボックスから車両マスタを選ぶと
下のリストボックスには車両マスタのデータが表示されます
そのリストからどれかを選ぶとその車両のプレートナンバーが
下のテキストボックスに表示されます
同様に
部署マスタを選ぶと
下のリストボックスには
部署マスタのデータが表示されます
そのリストからどれかを選ぶと
その部署の部署名が下のテキストボックスに表示します
お気づきでしょうか
上部のリストから選んだ項目によって
下のリストやテキストボックスの横幅が変化しています
フォームに設置したコントロールの設定
上部リストボックスの設定
名前:lst_01
値集合ソース:"社員マスタ";"車両マスタ";"部署マスタ"
値集合タイプ:値リスト
連結列:1
値リストの編集の許可:いいえ
真ん中リストボックスの設定
名前:lst_02
下部テキストボックスの設定
名前:txt_output
VBAコード
lst_01 の更新後処理
Private Sub lst_01_AfterUpdate()
Me.txt_output = ""
Select Case Me.lst_01
Case "社員マスタ"
With Me.lst_02
.RowSourceType = "Table/Query"
.RowSource = "M_staff"
.ColumnCount = 12
.ColumnWidths = "2cm;4cm"
.Width = 6 * 567
End With
Case "車両マスタ"
With Me.lst_02
.RowSourceType = "Table/Query"
.RowSource = "M_sharyo"
.ColumnCount = 3
.ColumnWidths = "2cm;0cm;8cm"
.Width = 10 * 567
End With
Case "部署マスタ"
With Me.lst_02
.RowSourceType = "Table/Query"
.RowSource = "M_busho"
.ColumnCount = 2
.ColumnWidths = "2cm;3cm"
.Width = 5 * 567
End With
End Select
End Sub
Select case 文でリストボックスの値により処理を分岐しています
Select case 文
Select Case 変数
Case 値1
変数=値1の場合に処理される
Case 値2
変数=値2の場合に処理される
Case Else
変数=値1、変数=値2を満たさなかった場合に処理される
End Select
リストボックス lst_01 の値が
社員マスタの場合
リストボックス lst_02 に 次のように設定を行います
With Me.lst_02
.RowSourceType = "Table/Query"
.RowSource = "M_staff"
.ColumnCount = 12
.ColumnWidths = "2cm;4cm"
.Width = 6 * 567
End With
値集合タイプを「テーブル/クエリ」にします
値集合ソースを M_staff(社員マスタ)にします
表示列を12列とします
列幅を1列目を2cm 2列目を4cm にします
リストボックスの幅を 6cm にします
リストボックス lst_01 の値が
車両マスタの場合
リストボックス lst_02 に 次のように設定を行います
With Me.lst_02
.RowSourceType = "Table/Query"
.RowSource = "M_sharyo"
.ColumnCount = 3
.ColumnWidths = "2cm;0cm;8cm"
.Width = 10 * 567
End With
値集合タイプを「テーブル/クエリ」にします
値集合ソースを M_sharyo(車両マスタ)にします
表示列を3列とします
列幅を1列目を2cm 2列目を0cm 3列目を8cm にします
リストボックスの幅を 10cm にします
リストボックス lst_01 の値が
部署マスタの場合
リストボックス lst_02 に 次のように設定を行います
With Me.lst_02
.RowSourceType = "Table/Query"
.RowSource = "M_busho"
.ColumnCount = 2
.ColumnWidths = "2cm;3cm"
.Width = 5 * 567
End With
値集合タイプを「テーブル/クエリ」にします
値集合ソースを M_busho(部署マスタ)にします
表示列を2列とします
列幅を1列目を2cm 2列目を3cm にします
リストボックスの幅を 5cm にします
リストから選んだ値によって
次のリストボックスの設定を変えています
幅を変え テキストボックスに表示する項目によって
幅や表示列数を設定します
社員マスタのテキストボックスの表示は
フィールド順が12番目(0から始まる)にあるため
表示は2列ですが
テキストボックスに表示する値を取得するため
.ColumnCount = 12
としています
lst_02の更新後処理
Private Sub lst_02_AfterUpdate()
Select Case Me.lst_01
Case "社員マスタ"
Me.txt_output = Me.lst_02.Column(12, Me.lst_02.ListIndex)
Me.txt_output.Width = 10 * 567
Case "車両マスタ"
Me.txt_output = Me.lst_02.Column(3, Me.lst_02.ListIndex)
Me.txt_output.Width = 8 * 567
Case "部署マスタ"
Me.txt_output = Me.lst_02.Column(1, Me.lst_02.ListIndex)
Me.txt_output.Width = 5 * 567
End Select
End Sub
Select case 文でリストボックスの値により処理を分岐します
リストボックス lst_01 の値が
社員マスタの場合
テキストボックス txt_output に次のように設定します
Me.txt_output = Me.lst_02.Column(12, Me.lst_02.ListIndex)
Me.txt_output.Width = 10 * 567
lst_02 リストボックスで選択された値をテキストボックスに転記します
ListBox.Column プロパティ
複数列リストボックス内の特定の列または列と行の組み合わせを参照します
Columnプロパティのカッコには
最初に「列番号」
次に「行番号」で「列・行」の順に指定します
列は
M_staff の13番目にメールアドレスがあります 項目は0から始まりますので
13-1 の12番目としています
行は
選択したlst_02の値となります
車両マスタ 部署マスタを選んだ時の
lst_02リストボックスの更新後処理も同様です
リストボックス使用例 ②
動作の流れ
リストボックスの中にはいろんなグループの名前があります
その中から 選んで実行ボタンを押すと
選んだグループの名前がメッセージで表示されます
解除ボタンを押すと リストボックスの選択が解除されます
リストボックスの左下にある「リスト項目の編集」をクリックすると
このようにリストボックスに表示されるリストを編集できます
グループ名を追加 編集などができます
フォームに設置したコントロールの設定
リストボックス
名前:lst_J
値集合ソース:"Travis Japan";"なにわ男子";"Snow Man";"SixTONES";"King & Prince";"ジャニーズWEST";"A.B.C.Z";"Sexy Zone";"Kis-My-Ft2";"Hey! Say! JUMP";"KAT-TUN";"関ジャニ∞";"NEWS";"嵐";"KinKi Kids";"V6";"TOKIO";"SMAP";"少年隊"
値集合タイプ:値リスト
連結列:1
値リストの編集の許可:はい
「はい」にすることで リストボックスの項目を編集できるようになります
コマンドボタン①
名前:cmd_01
標題:実行
コマンドボタン②
名前:cmd_02
標題:解除
VBAコード
実行コマンドボタン(cmd_01)クリック時
Private Sub cmd_01_Click()
Dim strJ As String
Dim vD As Variant
With Me.lst_J
If .ItemsSelected.Count = 0 Then
Exit Sub
Else
For Each vD In .ItemsSelected
strJ = strJ & .ItemData(vD) & vbCrLf
Next
End If
End With
MsgBox strJ
End Sub
Dim strJ As String
リストボックスで選択された値を代入する変数を宣言します
Dim vD As Variant
繰り返し用の変数を宣言します
With Me.lst_J
…
End With
リストオブジェクトに対して処理をおこないます
If .ItemsSelected.Count = 0 Then
Exit Sub
データが選択されているか判定し
選択されていなければ 処理を終了します
Else
For Each vD In .ItemsSelected
strJ = strJ & .ItemData(vD) & vbCrLf
Next
End If
選択されているすべてのデータに対して処理をおこないます
選択されているデータを取得し 変数 strJ に順次追加していきます
MsgBox strJ
取得したデータをメッセージとして表示します
複数項目が選択可能なリストボックスで
選択されたすべてのデータを取得するために
ItemsSelectedプロパティとItemDataプロパティを使用します
ItemsSelected プロパティ
リストボックスで選択されている項目
ItemData プロパティ
選択された値のうち 引数に指定したインデックスの値を取得
ItemsSelected プロパティの Count プロパティ
選択されているレコードがあるかどうかを判定
Count プロパティで項目数を返し何も選択されていない場合は「0」
いずれもインデックス番号は「0」から始まります
解除コマンドボタン(cmd_02)クリック時
Private Sub cmd_02_Click()
Dim vD As Variant
For Each vD In Me.lst_J.ItemsSelected
Me.lst_J.Selected(vD) = False
Next
End Sub
Dim vD As Variant
繰り返し処理用の変数を宣言します
For Each vD In Me.lst_J.ItemsSelected
…
Next
リストボックスで選択されているデータに対して処理をおこないます
Me.lst_J.Selected(vD) = False
選択を解除します
まとめ
Access のコントロールの中では
コンボボックスと同様
複数の項目のなかから選択することができる
リストボックスはよく使われます
特性を深掘りし
いろんな使い方ができるようにしたいですね