<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 MS-Access97大魔法陳列棚>コンボ・リストボックスセット



【仕 様 な ど】MS-Access97で作成。Windows95でのみ動作確認。

【ダウンロード】←Zip形式
            (解凍後、mdb初期状態:およそ192KB)

【主 な 機 能】

コントロールの利用サンプルです。


【作 り 方 等】

コンボボックスから、他のテキストボックスなどのコントロールに値を代入する処理のサンプルです。
コンボボックスのプロパティと、マクロやプロシージャの動きをうまく組み合わせて作ります。

このサンプルでは、左端のコンボボックスから商品コードを選ぶと、右のテキストボックスに商品名、単価、発売元、昨年の実績数が代入され、注文数を入力すれば注文が完了するというものです。

あらかじめ、商品コード、商品名、単価、発売元、実績、分類という6つのフィールドを持ったテーブルがあるものとします。

フォーム上にコンボボックスをひとつ作り、プロパティに注目します。

値集合ソースのビルドボタンをクリックします。クエリーのデザイングリッド画面のような画面が出て、コンボボックスの中の値をカンタンに調節できるようになっています。

コンボボックスの中には、商品コードと商品名しか表示させないつもりですが、単価や製造元、昨年実績も一緒に横に並べます。
左からColumn(0),Column(1),Column(2),Column(3),Column(4)という呼び方になります。

このウィンドウは保存せず閉じます。閉じるときメッセージが出たら、[はい]ボタンをクリックします。

次に、コンボボックスの書式プロパティを見ます。列数、列幅、リスト幅、というところが関係してくると思います。
列幅は、上のフィールドを何センチくらいの幅で表示させるか、;(半角のセミコロン)で区切って数値を入力します。cmという単位は自動的につきますので入力は要りません。

ここで、ゼロと指定したカラムは、値はあるけど表示されないという状態になります。
上のグリッドをもう一度見て、商品コードと商品名だけを表示し、他は非表示に・・・という場合は、全部半角で

1.5;5;0;0;0

と入力していきます。幅はチョットずつ調節しましょう。あれ、なんか下のサンプル、ちょっとカラムの数が多いような・・・。スイマセン、まちがいデス。

そして、忘れちゃならないのがその上の列数。ここは通常1になってます。
1のままだと、商品コードしか扱われないことになりますので、ここをカラムの数分増やします。えーと、上のサンプルは6になってますけど、さっき5でしたよね・・・。
まちがいです。スイマセン。

リスト幅は、コンボボックスの幅はあまり広げたくないけど、商品名が長いから・・・というとき使います。普通は自動になってます。

後は、このコンボボックスの「更新後処理イベント」で、こんな感じの処理が働くようにします。

Private Sub 商品コード_AfterUpdate()
Me!商品名 = Me!商品コード.Column(1)
Me!単価 = Me!商品コード.Column(2)
Me!発売元 = Me!商品コード.Column(3)
Me!昨年実績 = Me!商品コード.Column(4)
Me!金額 = Me!単価 * Me!注文数
DoCmd.GoToControl "注文数"
End Sub

モジュールはちょっと・・・という方は、マクロで値の代入アクションを4回行ってください。

コンボボックスの中にあって、幅ゼロで非表示にしている値を、テキストボックスに移しています。この時のやり方は、

=Forms![フォーム名]![コンボボックス名].Column(順番)

です。商品名はさっき確認したところColumnの(1)でしたから、上のような記述になります。
Me!はクラスモジュールで使用できる、フォーム名の省略形みたいなもんです。

こうしておくと、コンボボックスを利用することで、入力テーブルと参照テーブルを使い分けることができるので、ちょっと便利です。


この他にも、リストボックスの活用についてもサンプルをご紹介しています。
リストボックスは複数選択をすることができるので、それを利用しています。

左側のリストボックスのプロパティを見てください。その他のプロパティの中に「複数選択」というプロパティがあります。ここを「標準」に変更します。

仮に、左のリストボックスの名前はリスト0、右はリスト2とします。

左のリストボックスは、「資格テーブル」を参照しています。社員がどんな資格を所有しているか、一覧になっているテーブルであればどんなものでもOKです。資格はいろいろありますけれど、同じ資格を持っている人が何人もいたら、リストボックスの中の表示がダブってしまいますよね。多分普通免許なんて大勢の人が持ってますから、同じ資格名はダブって表示されないようにしたいです。そんな時は、値集合ソースの設定を変更します。

リストボックスの値集合ソースプロパティを変更します。ビルドボタンをクリックして、クエリーのデザイングリッドみたいな画面にします。
クエリーのプロパティを出します。ツールボタンに「プロパティ」というのがありますから、これをクリックすれば出てくると思います。中に「固有の値」というプロパティがありますので、これを「はい」にすると、ダブった値は表示されなくなります。

で、後はフォーム上に適当にボタンを作って、右に選択結果を表示するようにします。
ちょっと記述が面倒なんですが、たまには・・SQLを使ってみました。緑色のところは、これで1行です。

Private Sub どれも_Click()
Dim AAA As Variant
Dim BBB As String
BBB= " "
For Each AAA In Me!リスト0.ItemsSelected
If BBB= " " Then
BBB = "SELECT * FROM 社員マスタ WHERE 社員番号 IN (SELECT 社員番号 FROM 資格テーブル WHERE 資格 ='" & Me!リスト0.ItemData(AAA) & "';)"
Else
strSQL = strSQL & " AND 社員番号 in (SELECT 社員番号 FROM 資格テーブル WHERE 資格='" & Me!リスト0.ItemData(AAA) & "';)"
End If
Next SSS
BBB = BBB & ";"
Me!リスト2.RowSource = BBB
End Sub


Private Sub どれかClick()
Dim AAA As Variant
Dim BBBAs String
Dim CCCAs String
BBB = " "
For Each AAA In Me!リスト0.ItemsSelected
If BBB= " " Then
BBB = "資格='" & Me!リスト0.ItemData(AAA) & "'"
Else
BBB = BBB& " or 資格 ='" & Me!リスト0.ItemData(AAA) & "'"
End If
Next AAA
CCC = "SELECT *FROM 社員マスタ WHERE 社員番号 IN(SELECT 社員番号 FROM 資格テーブル WHERE " & BBB& ";);"
Me!リスト2.RowSource = CCC
End Sub


Private Sub 解除_Click()
Dim AAA Variant
For Each AAA In Me!リスト0.ItemsSelected
Me!リスト0.Selected(AAA) = False
Next AAA
Me!リスト2.RowSource = " "
End Sub


解除ボタンをクリックしたときは、値集合ソースにブランクを代入するようにしました。

宣言した変数の中に(AAAとかBBBとか)、組み合わせて作ったSQL文を代入し、それを最終的にリスト2(右のリストボックス)の値集合ソースプロパティに代入しています。

SQLは記述が面倒そうだし、デバッグができないので実行してみないと結果が分かりません。
でも、多分、データの検索や並べ替えはクエリーより速いんじゃないかと思います(データ件数が多い場合なんか特に)。