質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

2回答

2178閲覧

Accessでコントロールがアクティブなのに実行時エラー2185が表示される

Wittmann

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2023/06/26 05:32

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • 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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2023/06/26 05:46

どのイベントのどのコードでそのエラーが出ていますか。
Wittmann

2023/06/26 06:09

Private Sub SelectName_Change() の SelectName.RowSource = SQL1 & SelectName.Text & SQL2 で出ています。 エラーを「終了」したときにそのコンボボックスにカーソルがあるので、 間違いなくフォーカスはされているはずなのですが。
hatena19

2023/06/26 06:10

> ここで設定されたデータで、レコードのフィルターを行っています。 とのことですが、具体的にはどのようにしてますか。 コードがあるならそのコードも提示してください。
logres_Fan

2023/06/26 07:10

> エラーを「終了」したときにそのコンボボックスにカーソルがあるので、 間違いなくフォーカスはされているはずなのですが。 まずは、下記サイトを参考に、MsgboxやDebug.printでフォーカスの挙動をちまちま再確認してみませんか?その上で、現在のコードで解決を目指すのか、抜本的に仕様を変えるのか・・・。 T‘sWare…アクティブコントロールを取得するには? https://tsware.jp/tips/tips_672.htm
Wittmann

2023/06/26 07:32 編集

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
Wittmann

2023/06/26 07:38

logres_Fanさん。 ご回答ありがとうございます。 フォーカスは確認しています。 エラーの出たコードの直前でdebug.printで確認したところ、対象のコンボボックスでした。 また、Chat-GPTに言われた下記のコードを上記に追加してもエラーが出ました。 そのため、「はず」という確信の持てない回答となっています。申し訳ない。 On Error Resume Next ' エラーが発生した場合、次の行に進む SelectName.SetFocus On Error GoTo 0 ' エラー処理を元に戻す
guest

回答2

0

簡単なサンプルを作成して、質問のコードを設定して実験してみました。
コンボボックスの変更時のイベントプロシージャで、Filterプロパティでフォームのレコードを抽出コードを記述したら、FilterOn = True の時、同じエラーが発生しました。

WithEvents で設定で設定したイベントプロシージャと、コントロールに直接設定したイベントプロシージャの場合、
コントロールに直接設定したイベントプロシージャの方が先に設定されます。フォームにフィルターをかけると、レコード移動が発生しますので、その時点でフォーカスが外れます。

フィルターをかけるのを変更時ではなく、更新後処理にすればエラーなく実行できるのを確認しました。

一文字入力するたびに発生する変更時イベントで逐一フィルターをかける必要性はないように思いますが、いかがでしょうか。

投稿2023/06/26 07:28

hatena19

総合スコア33856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Wittmann

2023/06/26 07:56

hatena19さん。 いつもお世話になっております。 実行するイベントをSelectName_ChangeからSelectName_AfterUpdateにするということでしょうか。 そちらですと、「入力値でプルダウンの表示を制限する」という操作ができません。 プルダウンの選択肢がえげつなく多いので、入力で制限したいのです。 イベントの順番がその仕様だとすると、 フィルターをTrueにしたら、プルダウンに入力はさせないようにしないといけないのでしょうか。 一旦フィルターをFalseにして、条件変更してから改めてTrueにするとか…。
hatena19

2023/06/26 09:22

そうではなくて、もし、フォームのフィルター処理をコンボボックスの変更時に割り当てていたなら、それを更新後処理と変更いう意味です。あるいはコマンドボタンでフィルター処理をするのではいいでしょう。 コンボボックスのリスト制限のコードはSelectName_Changeで問題ないです。 こちらのサンプルではそれで正常動作しているので、実際のファイルがないこちらからは原因特定は難しそうです。
guest

0

この回答はGPT-4による自動生成回答です

このエラーは、コントロールがフォーカスを持っていないときに、そのコントロールのプロパティやメソッドを参照しようとしているために発生しています。この問題を解決するには、SelectNameコントロールにフォーカスを与える必要があります。

以下のように、SelectName_Changeイベント内でSelectName.SetFocusを使用してフォーカスを設定してみてください。

VBA

1Private Sub SelectName_Change() 2 On Error Resume Next ' エラーが発生した場合、次の行に進む 3 SelectName.SetFocus 4 On Error GoTo 0 ' エラー処理を元に戻す 5 6 SelectName.RowSource = SQL1 & SelectName.Text & SQL2 7 If blClick Then 8 blClick = False 9 Else 10 SelectName.Dropdown 11 End If 12End Sub

On Error Resume NextOn Error GoTo 0を使用して、SetFocusでエラーが発生した場合でもコードが次の行に進むようにしています。これにより、SelectNameコントロールがフォーカスを持っていない場合でも、エラーが発生せずに処理が続行されます。

投稿2023/06/26 05:32

teratail-ai

Powered by GPT-4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Wittmann

2023/06/26 05:41

上記の修正を加えると、解決することがあるのですが、 なぜか同じエラーが再び出ることがあります エラーが絶対に出ないように修正できますか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問