- 締切済み
Accessの更新後処理で特定の条件を満たしている場合、フォーカスを移動させない方法
テキストボックスの更新後処理で下記のような記述をし、 テキストボックスに1が入力された場合、エラーメッセージを表示した上で、 フォーカスを一度ボタンに移動した後、テキストボックスに移動しております。 SetFocusを二回記述している理由ですが、 フォーカス移動を抑止する為に、Me.テキストボックス.SetFocus のみを記述した所、次の場所にフォーカスが移動してしまい、 下記のように書くと元の場所にフォーカスが戻ってくる為です。 フォーカス喪失時(Exit)の場合、Cancelを使用すればフォーカスの移動を抑止できたのですが、 更新後処理(AfterUpdate)でSetFocusを2回書く以外に フォーカスを移動させない方法をご存知の方がいらっしゃいましたら アドバイスいただければと思います。 ★クラスモジュール Private Sub テキストボックス_AfterUpdate() Call CHECK_TEXT(Me, Me.テキストボックス.Value) End Sub ★標準モジュール Function CHECK_TEXT(MeForm As Form, text As String) If text = 1 Then MsgBox "エラー" MeForm.ボタン.SetFocus MeForm.テキストボックス.SetFocus End If End Function 以上、よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- bonaron
- ベストアンサー率64% (482/745)
テキストボックスが連結コントロールという条件つきですが。 Private Sub テキストボックス_BeforeUpdate(Cancel As Integer) Cancel = CHECK_TEXT(Me.テキストボックス) End Sub Function CHECK_TEXT(ctl As Control) As Boolean If ctl = 1 Then MsgBox "エラー" ctl.Undo CHECK_TEXT = True End If End Function 好みの問題もありますが、 自分は、各コントロールではチェックせず 最後にまとめてチェックするようにしています。 ユーザーさんが、テキストボックスで 身動き出来なくなる自体が起こることを避けるためです。
- bonaron
- ベストアンサー率64% (482/745)
「更新後処理」で と限定されると他に方法は無いと思いますが、 通常、このようなチェック処理は、「更新前処理」で行います。 Private Sub テキストボックス_BeforeUpdate(Cancel As Integer) Cancel = CHECK_TEXT(Me.テキストボックス.Text) End Sub Function CHECK_TEXT(txt As String) As Boolean If txt = 1 Then MsgBox "エラー" CHECK_TEXT = True End If End Function
お礼
ありがとうございます。 更新後処理で記述している理由ですが、エラーの場合入力値を初期化したいと思っているためです。 更新前で記述するとなると下記のような感じになると思いますが、 「"BeforeUpdate/更新前処理"プロパティまたは このフィールドの"ValidationRule/入力規則"プロパティに設定したマクロまたは関数のために、 このフィールドのデータを保存できません。」 といわれてしまいました。 Private Sub テキストボックス_BeforeUpdate(Cancel As Integer) Cancel = CHECK_TEXT(Me.テキストボックス.text) If Cancel = True Then Me.テキストボックス = "" End If End Sub Function CHECK_TEXT(txt As String) As Boolean If txt = 1 Then MsgBox "エラー" CHECK_TEXT = True End If End Function なお更新後であれば、エラーの場合入力値を初期化できました。 Private Sub テキストボックス_AfterUpdate() Call CHECK_TEXT(Me, Me.テキストボックス.Value) End Sub Function CHECK_TEXT(MeForm As Form, text As String) If text = 1 Then MsgBox "エラー" MeForm.ボタン.SetFocus MeForm.テキストボックス.SetFocus MeForm.テキストボックス = "" End If End Function ただSetFocusを2回書くのはやっぱり変かなという気がするので、 更新前でチェックをしつつ、入力欄を初期化できれば良いのですが。 以上、よろしくお願いします。
そのテキストボックスの「タブストップ」を「いいえ」に設定してもダメですか? フォーカスの移動は、当然VBAで行うことになりますが....
お礼
ありがとうございます。 私が試してみた限りでは、駄目でした。 エラーメッセージが表示された後、次のテキストボックスに移動してしまいます。 ソースは下記となります。 ・テキスト0でTABを押下すると、更新後処理で入力チェックを行うテキストボックスに移動するようにソースで記述しています。 ・エラーメッセージ表示時はそのまま現在の位置にとどまってほしいのですが、 下記のソースでは質問時のソースから二つのSetFocusを削除している為、 次のテキストボックスに移動してしまいます。 ★クラスモジュール Private Sub テキスト0_Exit(Cancel As Integer) Me.テキストボックス.SetFocus End Sub Private Sub テキストボックス_AfterUpdate() Call CHECK_TEXT(Me.テキストボックス.Value) End Sub ★標準モジュール Function CHECK_TEXT(text As String) If text = 1 Then MsgBox "エラー" End If End Function 以上、よろしくお願いします。
お礼
ありがとうございます。 今回作っているものは非連結の為そのまま使うことは出来なさそうですが、今後の参考にさせていただきます。 また最後にまとめてチェックするという組み方についても今後検討させていただこうと思います。 今回はとりあえず現状どおりSetFocus2回で回避する事にいたします。 どうもありがとうございました。