重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

テーブルはAccess2003で作成
VBは6を使用しています。
Access2003で作成したテーブル(t_KEN)の県名をコンボボックス(cmbKen)に表示させ、選択したひとつの県名とその県コードを
テキストボックス(txtKENMEI.text、txtKenCode.text)に格納したいと思います。

以下の様にコンボボックスに県名を表示する所までは
できたのですが、そこから選択した県名と県コードをそれぞれの
テキストボックスに格納する所がわかりません。

初歩的過ぎるのかもしれませんが、初心者であり何卒ご教授頂けます様
お願いいたします。

テーブル(t_KEN)
KENCODEKENMEI
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

A 回答 (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 )
といった具合で出来ますよ

この回答への補足

redfox63様
ありがとうございました。お陰様でできました。
1週間悩み続けたのが解決できました。
よろしければ、もう少し教えて頂けませんでしょうか。

取り出したいフィールド値が2つ以上有る場合です。
先程はフィールドが
KENCODE KENMEI だけでしたが
KENCODE KENMEI CHIHOUの3つがあった場合に
コンボボックスで県名を選択した際にKENCODEとCHIHOUの2つの
情報を取り出す場合に困りました。

<以下の2点について困りました>
1、コンボボックスで県名を選択した際に
  「txtKENCODE.text」と「txtCHIHOU.text」等複数のテキストボックス
  にそれぞれの県コードと地方コードを格納したい。

2、取り出す情報がコード(数字)でなくテキスト(「東北地方」等)
  の場合にエラーがでます。
  「型が一致しません」とエラーがでます。  

テーブル(t_KEN)
KENCODEKENMEICHIHOU
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

補足日時:2009/06/24 10:03
    • good
    • 0

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と言う演算です
    • good
    • 0
この回答へのお礼

redfox63様
なんて几帳面な方なのか本当に脱帽です。
非常にご丁寧に教えて頂きありがとうございます。
非常にわかりやすいです。
ありがとうございました。

お礼日時:2009/07/02 18:13

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
といった具合にします

『東北地方』などを格納することは出来ませんので別の手立てを考えなければいけません
    • good
    • 0
この回答へのお礼

何度もスミマセン。ありがとうございます。
コンボボックスをクリックした際に、いつもワンテンポ遅れるのが
気になってました。FormのLoadイベントでしておくと
毎回毎回AddItemしなくてすむので、スムーズ、スマートになりました。考え方の基本まで教えて頂き助かります。

コンボボックスの件ですが、以下の数式の意味が
わかりません、16bitでこの数字がでてきたのはかろうじて
わかったのですが、この計算の意味がまったく理解できません。
nData = nKen * 65536! + nChihou
  cmbKen.ItemData( cmbKen.NewIndex ) = nData

又、クリックイベントで取り出す際の
  nKen = nData / 65536!
  nChihou = nData And &HFFFF
も意味不明です。
もし、お付き合い頂けるのでしたらご教授願います。
よろしくお願いいたします。

お礼日時:2009/06/25 01:20

#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すると要素内の値が変わる気がして、確かでないのでデバッグしてみてください。
    • good
    • 0
この回答へのお礼

kazuhisa01様ありがとうございます。
区切り文字で連結してとは、思いもつきませんでした。
1週間時間を費やした事が解決できました。
ありがとうございました。

お礼日時:2009/06/24 13:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!