- ベストアンサー
Excel VBA SetFocusでエラーが発生する問題の解決方法
- Excel VBAのUserForm1で、Flame5内のTextBox14とTextBox15のBeforeUpdateの後にFlame2内のTextBox1にSetFocusしようとすると、実行時エラーが発生します。エラーコードは2147467259(800004005)です。
- 異なるFlameでSetFocusする方法もありますが、解決方法としては、Flame5内でTextBox14とTextBox15のSetFocusを使用することができます。
- BeforeUpdateのプロシージャで、TextBox14が更新された場合にTextBox15を計算し、TextBox15が更新された場合にはTextBox14を計算しています。それぞれの計算結果をFlame2内のTextBox1に反映させるためにSetFocusを使用しているため、エラーが発生しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こちらでは解決しているようです。 http://www.moug.net/faq/viewtopic.php?t=65607 別解を。 質問者さんの図では、 フレームの本来の使い方(オプションボタン、チェックボックスなどの1個のみを選択する)をしていません。 見た目だけを、分かり易くグループ化しているのみです。 これなら、苦労してフレーム絡みのフォーカス移動を制御するより ラベルを、フレームのように見せかけて (SpecialEffect プロパティ を 3 に設定) (テキストボックスは最前面に表示) (見出し部分はラベルを重ねる) 等々 質問者さんのコードで動かすほうがずっと簡単かと思います。
その他の回答 (2)
- WindFaller
- ベストアンサー率57% (465/803)
分かっているとは思いますが、直接、TextBox1 とか名指しするから問題ですよね。 何のためのFrameかは分かりませんが、概ね、見栄えの問題だけだと思います。 そうなら、Frame自体へ飛ばせば(SetForcus)よいと思います。 例:Me.Frame2.SetFocus Frameの中の順番自体は、その中のコントーロールに、TabIndexで合理的な順序をつければよいと思います。常識的に、Frameから別のFrameとあっちに行ったり、こっちにいったりはしないものですから。 つまり、TextBox1 は、Frame2 の中で、TabIndex は、0になっているということです。
お礼
見栄えの問題だけでVBAを作ってはダメなことがよくわかりました
- KURUMITO
- ベストアンサー率42% (1835/4283)
Me.TextBox1.SetFocus を次のように変更してみてはいかがでしょう。 Me.SetDefaultTabOrder Me.TextBox1.SetFocus
お礼
早速回答いただきありがとうございました 残念ながらエラー現象は回避できませんでした 他の思案おもちでしたら教えてください
お礼
ご指摘の通り見た目だけを、分かり易くグループ化してました グリッドが使えてForm作成が簡単だったのです。 ラベルを、フレームのように見せかけて (SpecialEffect プロパティ を 3 に設定) (テキストボックスは最前面に表示) (見出し部分はラベルを重ねる) 等々 … は目からうろこでした。 この方法で作り直しました ありがとうございました