![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
テキストボックスの更新後処理で下記のような記述をし、
テキストボックスに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
以上、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
「更新後処理」で
と限定されると他に方法は無いと思いますが、
通常、このようなチェック処理は、「更新前処理」で行います。
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回書くのはやっぱり変かなという気がするので、
更新前でチェックをしつつ、入力欄を初期化できれば良いのですが。
以上、よろしくお願いします。
No.3
- 回答日時:
テキストボックスが連結コントロールという条件つきですが。
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
好みの問題もありますが、
自分は、各コントロールではチェックせず
最後にまとめてチェックするようにしています。
ユーザーさんが、テキストボックスで
身動き出来なくなる自体が起こることを避けるためです。
ありがとうございます。
今回作っているものは非連結の為そのまま使うことは出来なさそうですが、今後の参考にさせていただきます。
また最後にまとめてチェックするという組み方についても今後検討させていただこうと思います。
今回はとりあえず現状どおりSetFocus2回で回避する事にいたします。
どうもありがとうございました。
No.1
- 回答日時:
そのテキストボックスの「タブストップ」を「いいえ」に設定してもダメですか?
フォーカスの移動は、当然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
以上、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) ユーザーフォームで銀行に対応した支店コードの入力ができません Sheet1のA列に銀行名、B列に銀行 5 2022/07/28 17:50
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- Visual Basic(VBA) フレーム内のオプションボタンの選択結果をセルに書き出したい。 図のような預金種目というフレームにオプ 2 2022/07/29 11:12
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
このQ&Aを見た人はこんなQ&Aも見ています
-
賃貸で可能な古民家風レトロな部屋作りのコツ!改めて知る畳の高い機能性と魅力も紹介
畳の部屋を雰囲気のよい部屋に仕上げたい!賃貸住宅でもできる古民家風のレトロな部屋作りのコツを伺った。
-
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
Accessの条件付き書式設定で、複数の条件が一致した時の書式を設定したい
その他(Microsoft Office)
-
ACCESSのフォームで次のレコードに移動しない方法を教えてください
その他(データベース)
-
-
4
Access:結果は出るがエラー
その他(プログラミング・Web制作)
-
5
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
6
Access サブフォームでの選択行の取得
その他(データベース)
-
7
どこにもフォーカスを当てたくない
Access(アクセス)
-
8
ACCESS──メインフォームでサブフォームのレコード件数をカウントしたい
Access(アクセス)
-
9
アクセスでレコードの内容が変更されたかどうかを調べるには
Access(アクセス)
-
10
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
11
【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには
Access(アクセス)
-
12
フォームを開くときに、コンボボックスの値を選択(アクセスVBA)
Visual Basic(VBA)
-
13
Accessで別テーブルの値をフォームに表示したい
その他(データベース)
-
14
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
15
新規レコード行を非表示にしたい
Access(アクセス)
-
16
選択したチェックボックスのみチェックを入れたいのですが
その他(データベース)
-
17
Accessのマクロでモジュールを実行させたい。
Access(アクセス)
-
18
Accessフォームを開くときに決まった順番で表示
Access(アクセス)
-
19
アクセスVBAのMe!と[ ]
Access(アクセス)
-
20
Accessの「Form_AfterUpdate」イベントが実行されないんですが...
Firefox(ファイヤーフォックス)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どこにもフォーカスを当てたくない
-
C# ReadOnlyのTextBoxで
-
業務に差し支えのないテンキー...
-
コマンドボタンのEnterイベント...
-
他の人には声だして挨拶してる...
-
矢印(左右)キーでイベントを...
-
MFCでコンボボックスを選択不可...
-
VBAのExitイベントについて
-
ユーザーフォームのSetFocusが...
-
エクセルVBA テキストボックス...
-
Private Sub内でSubをCallしたい
-
メロディーについて。意見を聞...
-
テキストボックス入力後、警告...
-
フォーカスを奪わない
-
VB.NET ボタン押下で一つ前の...
-
テキストボックス 空白確認
-
『エッジの効いた○○』の意味。
-
3SK22というFETはデュアルゲー...
-
酸素ボンベのレギュレーターか...
-
Accessの更新後処理で特定の条...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
どこにもフォーカスを当てたくない
-
C# ReadOnlyのTextBoxで
-
業務に差し支えのないテンキー...
-
エクセルVBA テキストボックス...
-
他の人には声だして挨拶してる...
-
ユーザーフォームのSetFocusが...
-
矢印(左右)キーでイベントを...
-
コマンドボタンのEnterイベント...
-
GridViewでハイライトを使用し...
-
テキストボックス入力後、警告...
-
VBAでのユーザーフォーム上...
-
Private Sub内でSubをCallしたい
-
フォーカスを移動させない方法
-
小学校で遊ぶてんかのルールに...
-
炊飯器のセットの音と出来上が...
-
Accessの更新後処理で特定の条...
-
VB.NET ボタン押下で一つ前の...
-
『エッジの効いた○○』の意味。
-
油性マジックの消し方
-
タブコントロールのフォーカス...
おすすめ情報