テキストボックスの更新後処理で下記のような記述をし、
テキストボックスに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のフォームで次のレコードに移動しない方法を教えてください
その他(データベース)
-
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
-
4
どこにもフォーカスを当てたくない
Access(アクセス)
-
5
Accessで別テーブルの値をフォームに表示したい
その他(データベース)
-
6
Access:結果は出るがエラー
その他(プログラミング・Web制作)
-
7
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
8
Access サブフォームでの選択行の取得
その他(データベース)
-
9
Accessの条件付き書式設定で、複数の条件が一致した時の書式を設定したい
その他(Microsoft Office)
-
10
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
11
ACCESSでデータ読み取り専用を解除する方法
その他(データベース)
-
12
AccessのDAO.ExecuteとDoCmd.RunSqlの違いについて
その他(データベース)
-
13
アクセスで数値型のフィールドにNullをいれたい
その他(データベース)
-
14
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
15
Access レポート印刷するときに1ページに収める方法
Access(アクセス)
-
16
Access 最後のレコードに到達するまでループ処理を行う方法
Access(アクセス)
-
17
Accessのサブフォームから値を参照する方法について
その他(データベース)
-
18
アクセスでレコードの内容が変更されたかどうかを調べるには
Access(アクセス)
-
19
AccessのRefresh・Requery・Repaintの違い
Access(アクセス)
-
20
アクセスVBAのMe!と[ ]
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# ReadOnlyのTextBoxで
-
どこにもフォーカスを当てたくない
-
他の人には声だして挨拶してる...
-
ユーザーフォームのSetFocusが...
-
アンカータグで移動後のURLに含...
-
炊飯器のセットの音と出来上が...
-
エクセルVBA テキストボックス...
-
Private Sub内でSubをCallしたい
-
業務に差し支えのないテンキー...
-
中古本の店名ハンコの消し方
-
キーボードからのチェックの入れ方
-
池袋サンシャイン通りでキャッ...
-
油性マジックの消し方
-
F503iにSVって表示されてるんで...
-
MFCでコンボボックスを選択不可...
-
コマンドボタンのEnterイベント...
-
VB.NET ボタン押下で一つ前の...
-
タブコントロールのフォーカス...
-
UML アクティビティ図の書き方...
-
マイクラのマルチサーバーが起...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
どこにもフォーカスを当てたくない
-
業務に差し支えのないテンキー...
-
炊飯器のセットの音と出来上が...
-
エクセルVBA テキストボックス...
-
C# ReadOnlyのTextBoxで
-
コマンドボタンのEnterイベント...
-
矢印(左右)キーでイベントを...
-
ユーザーフォームのSetFocusが...
-
他の人には声だして挨拶してる...
-
油性マジックの消し方
-
池袋サンシャイン通りでキャッ...
-
OPPO A54 5Gを使っています。 ...
-
テキストボックス入力後、警告...
-
VBAでのユーザーフォーム上...
-
GridViewでハイライトを使用し...
-
『エッジの効いた○○』の意味。
-
テキストボックスの入力チェッ...
-
酸素ボンベのレギュレーターか...
-
MFCでコンボボックスを選択不可...
-
二台のノートパソコンを繋げて...
おすすめ情報