
テーブルは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
No.1ベストアンサー
- 回答日時:
そういった用途には 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
No.4
- 回答日時:
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様
なんて几帳面な方なのか本当に脱帽です。
非常にご丁寧に教えて頂きありがとうございます。
非常にわかりやすいです。
ありがとうございました。
No.3
- 回答日時:
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
も意味不明です。
もし、お付き合い頂けるのでしたらご教授願います。
よろしくお願いいたします。
No.2
- 回答日時:
#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週間時間を費やした事が解決できました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ArrayListの要素数の上限
-
選択したチェックボックスの値...
-
このプログラミング誰か教えて...
-
VBAで処理しようとしているので...
-
VB6,論理演算子Orの使い方がわ...
-
matchesを否定文として使う方法...
-
JavaScript内で得た値をVBScrip...
-
ファイルを開く際に規定のexeを...
-
日付や時刻の"01"を" 1"に変換...
-
線形合同法(乗算型)による乱...
-
インクリメント/デクリメント演...
-
コンボボックスの値取得について
-
JSPでHashMap・配列の変数の値...
-
変数使わない場合の言語プログ...
-
wsprintf関数の使い方について
-
パラメータを利用するには…
-
VB.NET+Javascriptで、VB.NETで...
-
String型の値が大文字か小文字...
-
(Javaで)第1コマンドライン...
-
空の場合を含む選択肢からのラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
ArrayListの要素数の上限
-
Stringクラスの変数の格納アド...
-
javaのCSVデータ読込についてです
-
PSQLExceptionが発生する
-
excel vba 時間計算と条件分岐...
-
wsprintf関数の使い方について
-
BCD形式で時刻を!
-
C言語の変数(LSB)の合わせ込...
-
DOSバッチで変数の値を変数名に...
-
JSPでの計算結果表示
-
DateTimePickerに値を入れたい...
-
JSPでHashMap・配列の変数の値...
-
StringBufferクラスについて
-
char型での演算子
-
結合した文字列をファイル名に...
-
String str = "a\\\\b\\\\c";
-
Evaluate()に文字列の形式の数...
-
getParameterの値変更
-
matchesを否定文として使う方法...
おすすめ情報