実現したいこと
ここに実現したいことを箇条書きで書いてください。
- MicrosoftAccessのコンボボックスにデータの一部を入力すると、リストのデータがそれを含むものに制限されるようにする。
前提
MicroSoftAccessでデータベースを作成しています。
その中にデータを選択するコンボボックスがあるのですが、
そのコンボボックスのテキストボックス部にデータの一部を入力すると、
リストのデータがそれを含むものに制限されるようにしています。
また、上下キー操作で選択できるようにもしています。
ここで設定されたデータで、
レコードのフィルターを行っています。
FilterOn = Falseとしているときには、
コンボボックス内のデータを書き換えは問題なく動作します。
発生している問題・エラーメッセージ
FilterOn = Trueとしているときに、
コンボボックス内のデータを書き換えようとすると、
エラーが発生します。
エラーメッセージ 実行時エラー `2185': コントロールがフォーカスを取得していないときに、コントロールのプロパティまたはメソッドを参照することはできません。
該当のソースコード
VBA
1Option Compare Database 2Option Explicit 3 4Private WithEvents SelectName As Access.ComboBox '顧客名称 5Private WithEvents MyFrm As Access.Form 6Private SQL1 As String '検索フィールド用SQL 7Private SQL2 As String '並べ替え用SQL 8Dim blClick As Boolean 'クリックイベント用フラグ 9 10Public Sub Bind(strSQL_select As String, _ 11 strSQL_sort As String, _ 12 objSelectName As Access.ComboBox) 13 14 Set SelectName = objSelectName 15 Set MyFrm = objSelectName.Parent 16 SQL1 = strSQL_select 17 SQL2 = strSQL_sort 18 19 SelectName.OnChange = "[EVENT PROCEDURE]" 20 SelectName.OnClick = "[EVENT PROCEDURE]" 21 SelectName.OnKeyDown = "[EVENT PROCEDURE]" 22 23End Sub 24 25Private Sub SelectName_Change() 26' SelectName.SetFocus 27 SelectName.RowSource = SQL1 & SelectName.Text & SQL2 28' SelectName.RowSource = SelectName.Text 29 If blClick Then 30 blClick = False 31 Else 32 SelectName.Dropdown 33 End If 34End Sub 35 36Private Sub SelectName_Click() 37 blClick = True 38End Sub 39 40Private Sub SelectName_KeyDown(KeyCode As Integer, Shift As Integer) 41 Dim objSelectNametext As String 42 If KeyCode = vbKeyDown Then 43 If SelectName.OnChange <> "" Then 44 objSelectNametext = SelectName.Text 45 End If 46 SelectName.OnChange = "" 47 ElseIf KeyCode = vbKeyUp Then 48 If SelectName.ListIndex = 0 Then 49 SelectName.OnChange = "[イベント プロシージャ]" 50 SelectName.Text = objSelectNametext 51 SelectName.Dropdown 52 Else 53 SelectName.OnChange = "" 54 End If 55 Else 56 SelectName.OnChange = "[イベント プロシージャ]" 57 objSelectNametext = "" 58 End If 59End Sub 60
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
どのイベントのどのコードでそのエラーが出ていますか。
Private Sub SelectName_Change()
の
SelectName.RowSource = SQL1 & SelectName.Text & SQL2
で出ています。
エラーを「終了」したときにそのコンボボックスにカーソルがあるので、
間違いなくフォーカスはされているはずなのですが。
> ここで設定されたデータで、レコードのフィルターを行っています。
とのことですが、具体的にはどのようにしてますか。
コードがあるならそのコードも提示してください。
> エラーを「終了」したときにそのコンボボックスにカーソルがあるので、 間違いなくフォーカスはされているはずなのですが。
まずは、下記サイトを参考に、MsgboxやDebug.printでフォーカスの挙動をちまちま再確認してみませんか?その上で、現在のコードで解決を目指すのか、抜本的に仕様を変えるのか・・・。
T‘sWare…アクティブコントロールを取得するには?
https://tsware.jp/tips/tips_672.htm
hatena19さん。
ご回答ありがとうございます。
先ほどコメントしたのですが、表示が見えないので改めて書きます。
フィルターは、検索条件が多いので別でSQL文を生成しています。
SQL文は以下のように生成されていて、表示結果も問題ありません。
名称AAAA = "BBBB"
Private strFilter As String
Private Sub BtnFilter_Click()
strFilter = ""
strFilter = ComposeStrFilter(strFilter, "名称AAAA = ", Me.objBBBB.Value)
Me.Filter = strFilter
Me.FilterOn = True
End Sub
logres_Fanさん。
ご回答ありがとうございます。
フォーカスは確認しています。
エラーの出たコードの直前でdebug.printで確認したところ、対象のコンボボックスでした。
また、Chat-GPTに言われた下記のコードを上記に追加してもエラーが出ました。
そのため、「はず」という確信の持てない回答となっています。申し訳ない。
On Error Resume Next ' エラーが発生した場合、次の行に進む
SelectName.SetFocus
On Error GoTo 0 ' エラー処理を元に戻す