Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Access 2021)
ComboBoxが選択できない
投稿日時: 26/02/15 10:34:22
投稿者: mmiwa

教えて下さい
 
ユーザーフォーム上のListboxをComboboxへ変更しました
名称は以前のまま「リスト**」です
 
同じフォーム上にある他のコントロールから情報を取得して
ComboboxのRowSourceを動的に変更しています
Comboboxのボタンを押すと
プルダウンリストには希望するリストが表示されます
 
しかし、プルダウンリストからどの項目を選択しても
常にプルダウンリストの一番上に表示される項目のみが選択されます
 
まるで選択できないプルダウンリストがついたTextboxみたいです
 
どのように対応したら
一般的なComboboxにすることが出来るのでしょうか
 
.Enabled = True
.locked = False
も試しました(.lockedがLockedにならないのが気になりますが…)
 
対応方法を教えて下さい

回答
投稿日時: 26/02/16 22:07:12
投稿者: sk

引用:
ユーザーフォーム上のListboxをComboboxへ変更しました
名称は以前のまま「リスト**」です

・そのコントロールの種類をどのようにして変更したのか。
 (フォームのデザインビューでそのリストボックスを選択し、
  [コントロールの種類の変更]コマンドを実行した等)
 
・そのリストボックス/コンボボックスは連結コントロール、
 演算コントロール/非連結コントロールのどれに該当するのか。
 
引用:
しかし、プルダウンリストからどの項目を選択しても
常にプルダウンリストの一番上に表示される項目のみが選択されます

・その現象は「ListboxをComboboxへ変更」してから発生したのか。
 (コントロールの種類を変更する前は発生しなかったのか)
 
引用:
同じフォーム上にある他のコントロールから情報を取得して
ComboboxのRowSourceを動的に変更しています

・具体的にどのオブジェクト(フォーム/コントロール)のどのイベントの発生時において
 どのようなプロシージャを呼び出すことによってそれを実行しているのか。
 
・そのコンボボックスの[値集合タイプ]プロパティ、[連結列]プロパティ、
 [列数]プロパティ、[列幅]プロパティはどのように設定されているのか。
 
とりあえず、以上の点について明記されることをお奨めします。

投稿日時: 26/03/03 22:06:36
投稿者: mmiwa

skさん
メッセージありがとうございます
体調を崩していたので
返信が大変遅くなり本当に申し訳ありません
 
ご指摘いただいた件は以下の通りです
 
コントロールの変更は
フォームのデザインビューでそのリストボックスを選択し[コントロールの種類の変更]を利用しました
 
コントロールは非連結コントロールです
 
コントロールの種類を変更するまでは期待するように動いていました
(リストボックスで自由に選択できていました)
 
コードは下記のようなコードです
 
Private Sub コンボ0_Change()
 
Dim mySQL As String
 
    With Forms![フォーム1]
     
        buf = Left(![コンボ0].Column(0), 6)
         
        mySQL = "SELECT distinct '" & buf & "', 元帳.一般名, マスター.目的コード, 元帳.目的 " & _
        "FROM 元帳 INNER JOIN マスター ON 元帳.目的 = マスター.目的 " & _
        "WHERE (((元帳.商品名) like '*" & buf & "*'));"
         
        With ![リスト4]
            .RowSource = mySQL
            .Requery
        End With
     
    End With
 
End Sub
 
各プロパティは以下のようです
値集合タイプ テーブル/クエリ
連結列 1
列数 4
列幅 0cm;0cm;0cm;3cm
 
よろしくお願いいたします

回答
投稿日時: 26/03/05 09:50:26
投稿者: RIGEL

引用:
mySQL = "SELECT distinct '" & buf & "', 元帳.一般名, マスター.目的コード, 元帳.目的 " & _

これでは1列目はすべて同じ値になります。
旨味がありません。
 
お試しで、そのコンボボックスの
引用:
列幅 0cm;0cm;0cm;3cm

のところを空欄にして全列を見えるようにして実行するとわかります。
 
もしくは、もしかしたら
引用:
連結列 1

が、コンボボックスの Column の仕様と勘違いしていて(こっちは 0 から始まる)
本来は 2 とかいうことだったりでしょうか。

回答
投稿日時: 26/03/05 17:00:39
投稿者: sk

引用:
フォームのデザインビューでそのリストボックスを選択し[コントロールの種類の変更]を利用

引用:
非連結コントロール

元のリストボックス(後述のコードにおける[リスト4])の
[複数選択]プロパティの設定値が「しない」だったと仮定して、
 
引用:
連結列 1
列数 4
列幅 0cm;0cm;0cm;3cm

そのコンボボックスの各プロパティが上記のように設定されている場合、
ドロップダウンリストからいずれかのリスト行が選択された時の値は
選択されたリスト行の連結列 = 1 列目と同じ値に変更されます。
 
また、ドロップダウンリストが畳まれている状態において
実際に表示されるテキストは「連結列の値がコンボボックスの現在の値と
同じである最初のリスト行」の最も左の可視列 = 4 列目の値です。
 
引用:

        buf = Left(![コンボ0].Column(0), 6)
  
        mySQL = "SELECT distinct '" & buf & "', 元帳.一般名, マスター.目的コード, 元帳.目的 " & _
        "FROM 元帳 INNER JOIN マスター ON 元帳.目的 = マスター.目的 " & _
        "WHERE (((元帳.商品名) like '*" & buf & "*'));"
 
        With ![リスト4]
            .RowSource = mySQL
            .Requery
        End With

上記のプロシージャにより、[リスト4]の値集合ソースの全ての行において
[リスト4]の 1 列目が同一の文字列([コンボ0]において選択されたリスト行の
1 列目の値から、7 文字目以降の全ての文字を切り捨てた結果)となるように
設定されています。
 
リストボックスであれば、複数のリスト行/複数の列を一覧形式で表示し、
また[複数選択]プロパティの設定に応じて複数のリスト行を範囲選択することも出来るという関係上、
連結列の値が同一であるリスト行が複数件存在しても、リスト行の選択状態は維持されます。
 
しかしコンボボックスの場合、そのドロップダウンリストから選択できるリスト行は
常に 1 つだけです。
もし値集合ソースに「選択されたリスト行の連結列( 1 列目)と同じ値を持つ行」が
2 件以上存在した場合、非ドロップダウン状態のコンボボックスにおいて適用されるのは
それらのリスト行の先頭の 1 件のみとなります。
 
したがって、連結列の値が全てのリスト行において同一であるならば、
常に値集合ソースの最初の行が適用されるという結果となるでしょう。
 
引用:
リストボックスで自由に選択できていました

選択できる/できない以前に、「どのリスト行を選択しても常に同じ値になる」という状態に
なるように値集合ソース(の 1 列目)を操作していることが誤りであるように思います。
少なくともコンボボックスというコントロールの性質や用途には適していません。
 
そもそも[リスト4]が何のために設けられたコントロールなのか、
ドロップダウンリストにどのようなレイアウトのデータを表示したいのか、
ドロップダウンリストから任意のリスト行が選択された時に
コンボボックス自体の値がどのように変更されることが望ましいのか、
といったことについて再度振り返ってみることをお奨めします。

投稿日時: 26/03/05 21:34:55
投稿者: mmiwa

RIGELさん、SKさん
 
ご回答ありがとうございました
 

引用:
これでは1列目はすべて同じ値になります。
旨味がありません。

 
おっしゃるとおりです
こちらが期待しない抽出結果が返された場合
bufの文字列が受け渡しできているかを確認したかったので
(たまたまですが)1列目にbufを表示させました
 
引用:
そもそも[リスト4]が何のために設けられたコントロールなのか、

 
リスト4で選択したリスト行の3列目の目的コードを
以降のプロシージャで使用するためにリスト4が設置してあります
 
引用:
コンボボックスの Column の仕様と勘違いしていて(こっちは 0 から始まる)
本来は 2 とかいうことだったりでしょうか。

 
時々連結列とColumnの仕様を取り間違えるものですから
原則的に値を取得する場合は、コントロール.valueではなく
コントロール.Column(**)を使っています
ですから連結列は関係ないかなと思っていました
 
引用:
もし値集合ソースに「選択されたリスト行の連結列( 1 列目)と同じ値を持つ行」が
2 件以上存在した場合、非ドロップダウン状態のコンボボックスにおいて適用されるのは
それらのリスト行の先頭の 1 件のみとなります。

 
なるほど
コンボボックスの特性上
連結列のデータには、一意性が求められるのですね
全く知りませんでした
非常によく分かりました
 
勉強になりました
RIGELさん、SKさん
本当にありがとうございました