タイムマシーンがあったら、過去と未来どちらに行く?

テキストボックスの更新後処理で下記のような記述をし、
テキストボックスに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

以上、よろしくお願いします。

A 回答 (3件)

「更新後処理」で


と限定されると他に方法は無いと思いますが、
通常、このようなチェック処理は、「更新前処理」で行います。

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
    • good
    • 1
この回答へのお礼

ありがとうございます。

更新後処理で記述している理由ですが、エラーの場合入力値を初期化したいと思っているためです。

更新前で記述するとなると下記のような感じになると思いますが、
「"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回書くのはやっぱり変かなという気がするので、
更新前でチェックをしつつ、入力欄を初期化できれば良いのですが。

以上、よろしくお願いします。

お礼日時:2008/10/07 20:51

テキストボックスが連結コントロールという条件つきですが。



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

好みの問題もありますが、
自分は、各コントロールではチェックせず
最後にまとめてチェックするようにしています。
ユーザーさんが、テキストボックスで
身動き出来なくなる自体が起こることを避けるためです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
今回作っているものは非連結の為そのまま使うことは出来なさそうですが、今後の参考にさせていただきます。

また最後にまとめてチェックするという組み方についても今後検討させていただこうと思います。
今回はとりあえず現状どおりSetFocus2回で回避する事にいたします。

どうもありがとうございました。

お礼日時:2008/10/09 01:40

そのテキストボックスの「タブストップ」を「いいえ」に設定してもダメですか?


フォーカスの移動は、当然VBAで行うことになりますが....
    • good
    • 0
この回答へのお礼

ありがとうございます。

私が試してみた限りでは、駄目でした。
エラーメッセージが表示された後、次のテキストボックスに移動してしまいます。

ソースは下記となります。
・テキスト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

以上、よろしくお願いします。

お礼日時:2008/10/06 17:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A