- ベストアンサー
コンボボックスの値取得について
テーブルはAccess2003で作成 VBは6を使用しています。 Access2003で作成したテーブル(t_KEN)の県名をコンボボックス(cmbKen)に表示させ、選択したひとつの県名とその県コードを テキストボックス(txtKENMEI.text、txtKenCode.text)に格納したいと思います。 以下の様にコンボボックスに県名を表示する所までは できたのですが、そこから選択した県名と県コードをそれぞれの テキストボックスに格納する所がわかりません。 初歩的過ぎるのかもしれませんが、初心者であり何卒ご教授頂けます様 お願いいたします。 テーブル(t_KEN) KENCODE KENMEI 1 北海道 2 青森県 3 岩手県 4 秋田県 ・ ・ ・ ・ ・ ・ Private Sub cmbKen_GotFocus() Dim DB As Database Dim RS As Recordset Set DB = OpenDatabase("c:\TEST\jdb.mdb") Set RS = DB.OpenRecordset("t_KEN") Do Until RS.EOF Me.cmbKen.AddItem RS.Fields("KENMEI") RS.MoveNext Loop 'ここ以降の記述が困ってます。 txtKENMEI.Text=・・・ txtKenCode.Text=・・・ RS.Close Set RS = Nothing DB.Close Set DB = Nothing End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
そういった用途には ItemDataプロパティを活用しましょう Do Until RS.EOF Me.cmbKen.AddItem RS.Fields("KENMEI") ' この行を追加 cmbKen.NewIndexは上のAddItemで追加した行を ' 参照するためのプロパティ cmbKen.ItemData( cmbKen.NewIndex ) = RS.Fields("KENKODE") RS.MoveNext Loop といった具合でデータをコンボボックスに登録します コンボボックスのClickイベントで txtKENMEI.Text = cmbKen.List( cmbKen.ListIndex ) txtKenCode.Text = cmbKen.ItemData( cmbKen.ListIndex ) といった具合で出来ますよ
その他の回答 (3)
- redfox63
- ベストアンサー率71% (1325/1856)
nData = nKen * 65536! + nChihou に関して VB6のLong型は32ビット長の整数を格納で来ます 65536という定数は 16進表現すると &H10000です 上記の式は nKenの内容を16進で10000倍して nChihouを加算ということになります nKenが26 nChihouが4だった場合 nDataは 26*65536+4 = 1703940 = &h001A0004 となります 最後の 001A0004を眺めてみると 001A と 0004 がそれぞれ nKenとnChihouと関連していることがわかると思います もっと単純にするなら 10進で下駄を履かせてみることです nData = nKen * 10000! + nChihou これなら 26 * 10000 + 4 = 260004 となりますよね これを16進化しただけなんです 取り出すほうですが nDataの上位16ビットがほしい場合 65536!で除算する nDataの下位16ビットがほしい場合 65535!(&hFFFF)でAndマスクをするか nData Mod 65536!(&H10000)で 剰余(余り)を求める 10進で考えた場合 260004から26を取り出したい場合 10000で除算しますよね 16進の場合 1A0004 を 1/16 にすれば 1A000 ... 16 = &H10 1A0004 を 1/256 にすれば 1A00 ... 256 = &h100 1A0004 を 1/4096 にすれば 1A0 ... 4096 = &h1000 1A0004 を 1/65536 にすれば 1A ...65536 = &h10000 下位ビットの場合 10進だとMod演算で取得になります 16進なら And演算またはMod演算どちらかが使えます 私は ModよりAndの方を好んで使いますので 下駄を履かせる際には 16,256,4096,65536などをよく使います And演算は 1110(14) And 1001(9) ですと 1000(8) を返します ... 2進表現()内が10進 つまり 1110 1001 ---- 1000 各ビット位置で 両方が1の場合は1 それ以外は0と言う演算です
お礼
redfox63様 なんて几帳面な方なのか本当に脱帽です。 非常にご丁寧に教えて頂きありがとうございます。 非常にわかりやすいです。 ありがとうございました。
- redfox63
- ベストアンサー率71% (1325/1856)
GotFocusイベントでコンボボックスにAddItemするのは変な気がします FormのLoadイベントなど複数回起きないイベントにしないと同じ内容を重複して登録してしまいます ItemDataは整数しか受け付けませんので文字列の登録には不向きです Long型で収まる数値であれば可能です 格納する場合、取り出す場合に多少の工夫は必要ですが ・・・ お示しのデータなら 上位16ビットを県コード、下位16ビットを地方コードとするならば dim nKen as Integer, nChihou as Integer dim nData as Long Do Until RS.EOF Me.cmbKen.AddItem RS.Fields("KENMEI") ' この行を追加 cmbKen.NewIndexは上のAddItemで追加した行を ' 参照するためのプロパティ nKen = RS.Fields("KENKODE") nChihou = RS.Fields("CHIHOU") nData = nKen * 65536! + nChihou cmbKen.ItemData( cmbKen.NewIndex ) = nData RS.MoveNext Loop といった具合にします 取り出すほうは Private Sub cmbKen_Click() dim nKen as Integer, nChihou as Integer dim nData as Long txtKENMEI.Text = cmbKen.List(cmbKen.ListIndex) nData = cmbKen.ItemData(cmbKen.ListIndex) nKen = nData / 65536! nChihou = nData And &HFFFF txtKenCode.Text = nKen txtChihou.Text = nChihou End Sub といった具合にします 『東北地方』などを格納することは出来ませんので別の手立てを考えなければいけません
お礼
何度もスミマセン。ありがとうございます。 コンボボックスをクリックした際に、いつもワンテンポ遅れるのが 気になってました。FormのLoadイベントでしておくと 毎回毎回AddItemしなくてすむので、スムーズ、スマートになりました。考え方の基本まで教えて頂き助かります。 コンボボックスの件ですが、以下の数式の意味が わかりません、16bitでこの数字がでてきたのはかろうじて わかったのですが、この計算の意味がまったく理解できません。 nData = nKen * 65536! + nChihou cmbKen.ItemData( cmbKen.NewIndex ) = nData 又、クリックイベントで取り出す際の nKen = nData / 65536! nChihou = nData And &HFFFF も意味不明です。 もし、お付き合い頂けるのでしたらご教授願います。 よろしくお願いいたします。
- kazuhisa01
- ベストアンサー率32% (158/487)
#1の方のコードをそのまま利用する場合の1案を書きます。 VB6から遠ざかっているので確かな答えにはならないかもしれません。 先に誤っておきます。 ----------------------------------------------------------------- ItemDataにデータを格納する際にある特定の区切り文字でデータを連結する。 Dim strWk As String strWk = strWk + RS.Fields("KENCODE") strWk = strWk + ";"←区切り文字 strWk = strWk + RS.Fields("CHIHOU") cmbKen.ItemData(cmbKen.NewIndex) = strWk ※RecodeSetを格納してもいいかも? こうする事でItemDataには"111;1111"と入った状態になります。 なので、クリックイベントでTextに格納する際に cmbKen.ItemData(cmbKen.ListIndex) の中身を区切り文字で分割すればできます。 ----------------------------------------------------------------- ItemDataがObject型なのか忘れた為、使用できない可能性があります。 Dim strWkList(1) As String strWkList(0) = RS.Fields("KENCODE") strWkList(1) = RS.Fields("CHIHOU") cmbKen.ItemData(cmbKen.NewIndex) = strWkList と配列化できるなら配列の方が楽ですね。 ----------------------------------------------------------------- ※RecodeSetをItemDataに入れることが出来てもNextすると要素内の値が変わる気がして、確かでないのでデバッグしてみてください。
お礼
kazuhisa01様ありがとうございます。 区切り文字で連結してとは、思いもつきませんでした。 1週間時間を費やした事が解決できました。 ありがとうございました。
補足
redfox63様 ありがとうございました。お陰様でできました。 1週間悩み続けたのが解決できました。 よろしければ、もう少し教えて頂けませんでしょうか。 取り出したいフィールド値が2つ以上有る場合です。 先程はフィールドが KENCODE KENMEI だけでしたが KENCODE KENMEI CHIHOUの3つがあった場合に コンボボックスで県名を選択した際にKENCODEとCHIHOUの2つの 情報を取り出す場合に困りました。 <以下の2点について困りました> 1、コンボボックスで県名を選択した際に 「txtKENCODE.text」と「txtCHIHOU.text」等複数のテキストボックス にそれぞれの県コードと地方コードを格納したい。 2、取り出す情報がコード(数字)でなくテキスト(「東北地方」等) の場合にエラーがでます。 「型が一致しません」とエラーがでます。 テーブル(t_KEN) KENCODE KENMEI CHIHOU 11 北海道 111 12 岩手県 222 13 東京都 333 14 愛知県 444 ・ ・ ・ ・ ・ ・ ・ ・ ・ Private Sub cmbKen_GotFocus() Dim DB As Database Dim RS As Recordset Set DB = OpenDatabase("c:\TEST\jdb.mdb") Set RS = DB.OpenRecordset("t_KEN") Do Until RS.EOF Me.cmbKen.AddItem RS.Fields("KENMEI") cmbKen.ItemData(cmbKen.NewIndex) = RS.Fields("KENCODE") RS.MoveNext Loop RS.Close Set RS = Nothing DB.Close Set DB = Nothing End Sub Private Sub cmbKen_Click() txtKENMEI.Text = cmbKen.List(cmbKen.ListIndex) txtKenCode.Text = cmbKen.ItemData(cmbKen.ListIndex) End Sub