• ベストアンサー

コンボボックスの値取得について

テーブルは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

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答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 ) といった具合で出来ますよ

hirokaz200
質問者

補足

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

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答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と言う演算です

hirokaz200
質問者

お礼

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

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答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 といった具合にします 『東北地方』などを格納することは出来ませんので別の手立てを考えなければいけません

hirokaz200
質問者

お礼

何度もスミマセン。ありがとうございます。 コンボボックスをクリックした際に、いつもワンテンポ遅れるのが 気になってました。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すると要素内の値が変わる気がして、確かでないのでデバッグしてみてください。

hirokaz200
質問者

お礼

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

関連するQ&A

  • 変数に取得した値をテキストボックスやコンボボックスに表示させた

    アクセスで、変数に取得した値をテキストボックスやコンボボックスに表示させたいと思っています。例えば、まずクエリをひとつ作成します。そのクエリのレコードをループで配列変数に取得していきます。フィールド(IDと名前)レコード(件数は2件とします) public ID(2) as String public 名前(2) as String Sub temp() Dim Db As Database Dim rs As Recordset Dim I As Integer Set Db = CurrentDb Set rs = Db.OpenRecordset("Q_クエリ", dbOpenDynaset) rs.MoveFirst For I = 1 To 2 If IsNull(rs![ID]) = False Then ID(I) = rs![ID] If IsNull(rs![名前]) = False Then 名前(I) = rs![名前] rs.MoveNext Next I rs.Close Db.Close End Sub (この時点で変数に値は入っているようです。) フォームで作成したテキストボックスやコンボボックスに実行ボタンをクリックすると表示するというコードは下記のように記述してみました。 Private Sub 実行_Click() Call temp (標準モジュールを呼び出す) ID = ID(1)     名前 = 名前(1) (2)省略 End Sub すると、かならず「実行時エラー'13'; 型が一致しません。」とエラーが出ます。なにぶんVBA初心者になりますので、ご教授お願い致します。ちなみに同じような方法で、同一フォーム内に2つテキストボックスを用意し、片方に値を入力して実行するともう一方のテキストボックスにその値が表示すると言う実験は成功しています。もっと他に良いコードがあれば教えて下さい。お願いします。

  • テキストボックスとコンボボックス

    こんにちは、Accessのフォームにテキストボックスとコンボボックスを設置して、以下のような事ができないかと悩んでおります。 フォーム内には、テキストボックスとコンボボックスが設置してありまして、コンボボックス内にDB(会社名テーブル)から取得した全ての会社名が入っています。 しかし、そのレコード数が300件近くあるため、コンボボックス内から探し出すのに手間が掛かります。 そこで、コンボボックスの隣にテキストボックスを設置し、テキストボックス更新後に会社名テーブルの検索を行い、条件に合った会社名だけをコンボボックス内に入れることを考えているのですが、上手く行きません。 動作のイメージとしては下記のようになります。 (1)初期表示時はテキストボックス内に何も入力されていないので、全レコードがコンボボックス内に表示される。 (2)テキストボックスに「有限」と入力して、テキストボックスからフォーカスを移動させると、コンボボックス内に「有限」が会社名に含まれているレコードのみが入っている。 (3)テキストボックスを空白に戻すと、コンボボックス内には全レコードが表示 以上、どなたかご教授よろしくお願いします。

  • コンボボックスやリストボックスの値設定

    コンボボックスやリストボックスに データベースの値で設定するときについて疑問があります。 現システムでは JSP内でsqlタグを使ってレコードセットを取得し <core:forEach>でぐるぐるまわして値をセットしています。 ↓こんな感じです。 ----------------------------------------------------------- <sql:setDataSource var="db" dataSource="jdbc/xxxxx" /> <sql:query var="rs" dataSource="${db}" > SELECT * FROM XXXXX </sql:query> <select name="xxxxx"> <c:forEach var="row" items="${rs.rows}" > <option value="${row['xxxxx']}" <c:if test="${row['xxxxx'] == requestScope.xxxxx}" > selected </c:if> >${fn:escapeXml(row['xxxxx'])}</option> </c:forEach> </select> ----------------------------------------------------------- これでもちゃんと動いてるのですがMVCを考えるとJSP内でDB接続って疑問に感じます。 Sevletでコンボボックスに必要な値を取得しておいてリクエスト属性にセットし JSP内では変数をぐるぐる回すことも考えたのですが、 コンボボックスやリストボックスの数が増えたり面倒に思います。 コンボボックスやリストボックスに値を設定する場合は どういう方法がよいのでしょうか?

    • ベストアンサー
    • Java
  • アクセス コンボボックス値をレポートに反映

    アクセス初心者の為、やりたい事を検索しコードコピー等真似ることで どうにか作っている状態です。 現在あと一歩のところでつまずいてしまったのでお力添え頂けると助かります。 環境:アクセス2003 ------------------------------------------------------------------------------ フォームのコンボボックスで表示された値と一致するレコードを下にあるテキストボックスで表示  ⇒レポートにその値を反映させたい ------------------------------------------------------------------------------ フォーム上: 送付先:「A社」 (コンボボックスで選択) 担当者:「Aさん」 (コンボボックスで選択するとテキストボックスで表示) 現在の状況: フォーム上ではコンボボックスの値、その値と一致するレコードを該当テーブル(T_送付先)から テキストボックスに表示されている。 レポート上でだけ何故か送付先の部分が元テーブル(T_送付先) の送付先ではなく(フォームでは表示されてるのに) 数字が代わりに表示されてます。 担当者のテキストボックスにはフォームと同様に表示されてます。 ------------------------------------------------------------------------------ フォーム上にある送付先のコンボボックスには↓ Private Sub コンボ8_AfterUpdate() ' コントロールの値と一致するレコードを検索する Dim rs As Object Set rs = Me.Recordset.Clone rs.FindFirst "[ID] = " & Str(Nz(Me![コンボ8], 0)) If Not rs.EOF Then Me.Bookmark = rs.Bookmark End Sub ------------------------------------------------------------------------------ フォームの送付先を表示するテキストボックスには↓ =[Forms]![F_送付先]![コンボ8] ------------------------------------------------------------------------------ フォーム上のコンボボックス、コンボ8のプロパティ 値集合ソース: SELECT T_送付先.ID, T_送付先.送付先 FROM T_送付先; 連結列: 1 ------------------------------------------------------------------------------ テーブル(T_送付先)の一列目にID項目がありオートナンバー設定してあります。 その値が表示されてる気がします・・・ 他にもコンボボックスを使用してますが、全部レポートには表示されています。 コントロールの値と一致するレコードを検索するこのコンボボックスだけが 表示されない為コードが影響しているのかな・・と考えられますが お手上げ状態です・・・ どなたかアドバイス頂けると助かります。 よろしくお願いします。

  • ACCESSを用いたデータベースでのコンボボックスの連動について

    おせわになっております。 VBでデータベースを作っているのですが、 コンボボックスでの検索での絞込みがうまくいきません。 例えば、コンボボックス1で選ばれたファールドにより 絞込みが行われ、コンボボックス2で表示するレコードは コンボボックス1で選択されたレコードに該当するものしか表示しないようにするというとです。 どこかおかしい個所はありますでしょうか?? よろしくお願い致します。 Private Sub dbc1_Click(Area As Integer) '1つめのコンボボックス Dim criteria As String ' 検索条件 If dbc1.Text = "" Then Exit Sub End If criteria = "県名 = '" & dbc1.SelText & "'" rs.MoveFirst rs.Find criteria, , adSearchForward dbc2.SetFocus `dbc2にフォーカスを移す End Sub Private Sub dbc2_Click(Area As Integer) ’2つ目のコンボボックス Dim mySQL As String mySQL = "SELECT 市名 FROM 地名" _ & "where 県名 = '" & dbc1.SelText & "'" ’コンボボックス1で選択されたものを抽出条件とする。 Set rs = New ADODB.Recordset rs.Open mySQL, cn, adOpenStatic Set Dbc2.DataSource = rs End Sub

  • access テキストボックスへSetFocus

    QRコード読み込み後にDBに書込み、テキストボックスへ戻るプログラムを作成しているのですが、SetFocusが聞きません。 【実装したいこと】 QRコード内に、カンマ区切りのデータが入っており、QRスキャン後Sprit関数で区切りDBに登録しております。 でその際に、連続して読取出来るようにするために、「AfterUpdate」しております。 【処理】 1.txtsTiket(テキストボックス)にQR読取データを挿入 2.Sprit関数で、データを区切りDBへ書込み 3.txtsTiket(テキストボックス)へ戻る 2.までは問題ありませんが、3.のtxtsTiketへ自動で戻りません。 ○コード Private Sub txtsTiket_AfterUpdate() 'DB変数 Dim db As Database Dim rs As Recordset '変数定義 Dim tID As Integer Dim aly As Variant Dim t店舗CD As Integer Dim t開局日 As Date Set db = CurrentDb() '店舗ID取得 Set rs = db.OpenRecordset("T_ステータス", dbOpenDynaset) rs.Filter = "登録日 " = Date t店舗CD = rs("店舗CD") rs.Close: Set rs = Nothing 'チケットテーブルオープン Set rs = db.OpenRecordset("T_sTiket", dbOpenDynaset) 'チケットID生成 If rs.EOF Then tID = 1 Else tID = DMax("sTiketID", "T_sTiket") + 1 End If 'QRデータ分割 aly = Split(txtsTiket, ",") rs.AddNew rs("sTiketID") = tID rs("店舗CD") = t店舗CD rs("Day-S-No") = aly(0) rs("部門CD") = aly(1) rs("科目CD") = aly(2) rs("チケット名") = aly(3) rs("宿泊日") = aly(4) rs("予約通番") = aly(5) rs("登録日") = Date rs("登録時間") = Time rs.Update Me.txtsTiket.Value = Null ここから ' Me.txtsTiket.SetFocus ' DoCmd.GoToControl "txtsTiket" ここまで rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub 下記手法を試しましたが、両方ともうまくフォーカスが移動してくれません。 Me.txtsTiket.SetFocus DoCmd.GoToControl "txtsTiket" また、上記メソッドを、外部プロジージャーにしても動作しません。 DB書込み処理が終わった後、自動的にテキストボックスへ移動する方法はどうしてら良いでしょうかお教え頂けたら幸いです。

  • VBAでアクセスDBからデータの取得について

    DBからデータを取得する際、キー選択ボックス(コンボボックス)で選択した文字列をテーブル名に指定したいのですが、実行時エラー3709「この操作を実行するために接続を使用できません。このコンテキストで閉じているかあるいは無効です。」となってしまいます。 '***************************** 'DBからデータ取得 '***************************** If OptionButton1 = True Then myRS.Open Source:="SELECT" & キー選択Box.Text, ActiveConnection:=myConn2 Else myRS.Open Source:="テーブル1", ActiveConnection:=myConn Range("A2").CopyFromRecordset Data:=myRS myRS.Close: Set myRS = Nothing myConn.Close: Set myConn = Nothing myConn2.Close: Set myConn2 = Nothing End If End Sub 以上、よろしくお願いします。

  • ACCESSを用いたデータベースでのコンボボックスの連動

    おせわになっております。 VBでデータベースを作っているのですが、 コンボボックスでの検索での絞込みがうまくいきません。 (データベースはAccess2000) 例えば、コンボボックス1で選ばれたファールドにより 絞込みが行われ(例:県選択:千葉県) 、コンボボックス2で表示するレコードは コンボボックス1で選択されたレコードに該当するものしか表示しないようにするというとです。(例:市選択:市川市.船橋市.浦安市・・・と絞り込まれる) どこかおかしい個所はありますでしょうか?? (個人的にはdbc1が選択された時点でdbc2のクエリーが行われなければならないと思いますが、やり方がわかりません。 よろしくお願い致します。 adoデータコントロールのプロパティ ado1(県名選択) RecordSource:SELECT 県名 FROM 地名 ado2(市名選択) RecordSource:SELECT 市名 FROM 地名 WHERE 県名='dbc1.Text' Private Sub dbc1_Click(Area As Integer)'県を選択するコンボボックス Dim criteria As String ' 検索条件 If dbc1.Text = "" Then Exit Sub End If criteria = "県名 = '" & dbc1.SelText & "'" rs.MoveFirst rs.Find criteria, , adSearchForward End Sub Private Sub dbc2_Click(Area As Integer)'市を選択するためのコンボボックス Dim criteria2 As String ' 検索条件 If dbc2.Text = "" Then Exit Sub End If criteria2 = "メーカ = '" & dbc2.SelText & "'" rs.MoveFirst rs.Find criteria2, , adSearchForward End Sub

  • ACCESS2000 コンボボックス

    こんにちわ。 コンボボックスを教えて下さい。 テーブル T_分類(1) ・分類(1)  オートNo ・分類(1)名 テキスト テーブル T_分類(2) ・分類(2)  オートNo ・分類(1)  数値 ・分類(2)名 テキスト 2つのテーブルを作成して、フォームも作成しております。 入力する時、分類(1)も(2)テキストボックスで選ぶようにしています。 それで、分類(1)を選ぶと、分類(2)のテキストボックスに分類(1)の分しか表示しないようにしたいのですが・・。 どのようにすればよいでしょうか? 初心者な者で、分かりやすく教えていただければ有りがたいです。

  • ACCESSのコンボボックスで入力した値がTABLEに反映されずに数字がでます

    TABLE 県名、お客さまの2つを作成 お客さまのフォームの入力の県名のところを コンボボックスにして県名テーブルを参照し 選択したものをお客さまのレコードのところの 県名にはいるようにしたいのですが、 選択したID?数字がはいってしまいます。 (選択はできているようです) なにか設定が足りないのでしょうか? お分かりになる方、お知恵をお貸しください。 よろしくお願いします。

専門家に質問してみよう