
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
s_husky です。
↓でドロップダウンが解除される不具合対策について回答します。
犬の散歩をしながら考えました。
1、フォームでキーイベント取得=Yes にして下さい。
2、Form_KeyDownイベントに次のコードを書いて下さい。
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim ctl As Control
If (KeyCode = vbKeyDown Or KeyCode = vbKeyUp) And Screen.ActiveControl.ControlType = 119 Then
Set ctl = Screen.ActiveControl
ctl.SetFocus
KeyCode = 0
End If
End Sub
・↓でコンボボックスは更新されます。
・後は、カーソルの移動を阻止する。
・↓のコードを無効化する。
これで不具合は解消されます。
※単なるスーツのデザイナーに過ぎない素人プログラマを振り回す発端である三角問題の理由をチョコット聞きたいです。
s_huskyさん、お手間をとらせてしまって本当に申し訳ありません。
もともと、今回のコンボボックスの変更は、できるだけ表示を大きくしたいというニーズがあってのことです。
今つくっているシステムを利用される方は、視覚障害者の方です。そういう私もその一人ですが、その方がされているマッサージの治療院の予約管理システムをパソコンでしたいという要望からスタートしました。市販のパッケージではやはり見づらく、使いづらいということで、素人同然の私がつくることとなりました。
始めの提案は、標準的な表示・レイアウトのものでしたが、やはり見づらいというご意見と、操作はほとんどキーボードで行いたいということで、今回の問題が発生しました。(多少はマウスも使うので▼も大きくしたいとのことでした)
出来るだけ要望に沿うようにしたいと思ってはいるのですが、私自身がACCESS、VBAはそれほど経験が無いので、いろいろ皆様に助けていただいております。
s_husky さんには、丁寧にご指導いただき、本当に感謝しております。これに懲りずに、またアドバイスをお願いできれば幸いです。
No.5
- 回答日時:
s_husky です。
1、3を先行回答します。
・SetComboBoX関数では、連結列を先頭に移動しています。
・これで、選択時も通常になります。
・列数、列幅はリストボックスより1つ増やして下さい。
・連結列を二重表示したくない場合は0PXで消して下さい。
<フォームのリストボックスの値集合をAX-コンボボックスへコピーするコード>
Private Sub コマンド3_Click()
SetComboBox Me, "ComboBox", "ListBox", 2 ' 連結列=2
End Sub
Option Compare Database
Option Explicit
Public Function SetComboBox(ByVal frm As Form, _
ByVal cmbBox As String, _
ByVal lstBox As String, _
ByVal LinkColumn As Integer) As Boolean
frm.Controls(cmbBox).Clear
frm.Controls(cmbBox).List = XferRowSource(frm.Controls(lstBox).RowSource, _
frm.Controls(lstBox).ColumnCount, _
frm.Controls(lstBox).ListCount, _
LinkColumn)
End Function
Public Function XferRowSource(ByVal strRowSource As String, _
ByVal ColumnCount As Integer, _
ByVal ListCount As Integer, _
ByVal LinkCulumn As Integer) As String()
Dim I As Integer
Dim J As Integer
Dim P As Integer
Dim strData As String
ReDim Datas(ListCount - 1, ColumnCount + 1) As String
For I = 1 To ListCount
P = (I - 1) * ColumnCount
For J = 1 To ColumnCount
strData = CutStr(strRowSource, ";", P + J)
If Left$(strData, 1) = """" Then
Datas(I - 1, J) = CutStr(strData, """", 2)
Else
Datas(I - 1, J) = strData
End If
Next J
Datas(I - 1, 0) = Datas(I - 1, LinkCulumn)
Next I
XferRowSource = Datas()
End Function
Public Function CutStr(ByVal Text As String, _
ByVal Separator As String, _
ByVal N As Integer) As String
Dim strDatas() As String
strDatas = Split("" & Separator & Text, Separator, , 0)
CutStr = strDatas(N * Abs((N <= UBound(strDatas))))
End Function
※XferRowSourceは、最適化していません。
※I - 1はKに置き換えるべきです。(この場合、格段に動作が速くなります。)
※ただし、質問者の理解し難いコードになると思い中止した次第です。
No.4
- 回答日時:
s_husky です。
補足を拝見しました。
複数列とのこと、また、選択とキー操作に問題あり!
うーん!
解決出来ます。
が、複数列に対応しない SetComboBox関数の改良が先決のようです。
大体の方向性のみ示唆しておきます
1、SetComboBox関数---ListBox のRowSource を解析し ComboBox を更新するようにすべきです。
2、キー操作---ScreenオブジェクトでComboBox操作を感知して↓を{Shift}{Down}に変更すればOKです。
3、ComboBox.List(Select行, Select列)を利用することになります。
再回答しますのでお待ち下さい。
No.3
- 回答日時:
s_husky です。
<別案>
AxtiveX コントロールの ComboBox を利用した場合、<値集合ソース>が利用出来ないことが難点です。
ですから、ListBox を配置して利用する手もあります。
Private Sub Form_Load()
Me.ListBox.Requery
SetComboBox Me, "ComboBox", "ListBox"
End Sub
Public Function SetComboBox(ByVal frm As Form, _
ByVal cmbBox As String, _
ByVal lstBox As String) As Boolean
Dim I As Integer
Dim N As Integer
N = frm.Controls(lstBox).ListCount
frm.Controls(cmbBox).Clear
For I = 1 To N
frm.Controls(cmbBox).AddItem frm.Controls(lstBox).ItemData(I - 1)
Next I
End Function
これで、事実上、従来通りに<値集合ソース>を利用してAxtiveX コントロールの ComboBox の値を設定することが可能です。
※参考になれば幸いです。
具体的な例を有り難うございました。このことで少し悩んでいました。
このソースでうまく動作しましたが、実行時にコンボボックスを[F4]キーで開いて↓キーを押して選択しようとすると、一回だけ↓キーを押しただけで、その行が選択されたようにメニューが閉じてしまいます。
また、現在は1行に2列の表示をさせており、選択行の2列目の値を取得して、他で使うような仕組みになっています。この方法も、もし分かるようでしたらご教授いただければ助かります。調べてはいるのですが、なかなか見つかりません。
では、よろしくお願い致します。
No.2
- 回答日時:
s_husky です。
Private Sub ComboBox_Change()
MsgBox ComboBox.Text
End Sub
Private Sub コマンド0_Click()
'
' AddItem
'
Me.ComboBox.AddItem "AAAA"
Me.ComboBox.AddItem "BBBB"
Me.ComboBox.AddItem "CCCC"
'
' ListIndex
'
Me.ComboBox.ListIndex = 0 ' 0=AAAA、1=BBBB
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel コンボボックス バックカラー 1 2023/02/18 08:06
- Access(アクセス) Accessにインポートした複数のテーブルを表示させる方法が分かりません。 1 2023/01/30 20:22
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
- Visual Basic(VBA) VB.net 1 2022/08/18 19:21
- Visual Basic(VBA) VB.net 1 2022/08/17 19:28
- Visual Basic(VBA) Excel VBA ユーザーフォーム1のコンボボックスに別ブックの値を反映させたいです。 6 2023/03/21 16:12
- Access(アクセス) Accessの参照フィールドの列がずれてしまいます 1 2023/07/19 15:00
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Visual Basic(VBA) ExcelVBA ドロップボックスで月を選択するとそれ以降のデータが残るようにしたい。 3 2022/12/16 14:53
- HTML・CSS VB.net コンボボックス 2 2022/06/30 20:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
OracleのSQL*PLUSで、デー...
-
GROUP BYを使ったSELECT文の総...
-
Excelでセルの書式設定を使用し...
-
日本語の表名、列名の利用について
-
Excelで、改行がある場合の条件...
-
COBOLソースに記述するホスト変...
-
行全体を、決まった文字列があ...
-
エクセルの集計(縦横での集計)
-
No.2 oracleのテーブルデータの...
-
GROUP BYを行った後に結合した...
-
Oracleでの文字列連結サイズの上限
-
実績累計の求め方と意味を教え...
-
サブフォームに新規レコードを...
-
select句副問い合わせ 値の個...
-
最新の日付とその金額をクエリ...
-
ADO VBA 実行時エラー3021
-
クラスモジュールを使ったレコ...
-
レコードが存在しなかった場合
-
データセットのレコード更新が...
-
カレントレコードが無い事を判...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
OracleのSQL*PLUSで、デー...
-
Excelでセルの書式設定を使用し...
-
Excelで、改行がある場合の条件...
-
GROUP BYを使ったSELECT文の総...
-
日本語の表名、列名の利用について
-
主キーに重複があるレコードの...
-
ADOのRecordCountプロパティに...
-
cursor.getString
-
ACCESSのコンボボックスの右側...
-
LOAD DATE INFILE で Bit(1)型...
-
クエリビルダで列名を変数にし...
-
MS-ACCESS2000で数万件のデータ...
-
1列について重複している行を除...
-
一括でINSERTする方法(PL/SQL)
-
エクセルでのマッチング(ちょ...
-
列別名に二重引用符があった場合?
-
DB2で UNION ALL と GROUP BY ...
-
別のテーブルの値でUPDATEした...
-
No.2 oracleのテーブルデータの...
-
image型のInsertについて
おすすめ情報