txt_IDというテキストボックスにIDを入力して、
そのIDがデータベースに存在した場合、txt_IDを無効化したいと思います。
下記にソースコードを記載しましたが、下記では
Me.txt_ID.Enabled = False
まで遷移した後、下記のエラーメッセージが表示されてしまいました。
「実行時エラー '2164':
コントロールがフォーカスを取得しているときは、コントロールを無効にすることはできません。」
【ソースコード】
Private Sub txt_ID_BeforeUpdate(Cancel As Integer)
Dim record_Existence As Boolean
' 本来はDBにアクセスして入力したIDが存在するかチェックしています。
record_Existence = True
If record_Existence = True Then
Me.txt_ID.Enabled = False
End If
End Sub
その為、上記のような場合、どのようにすればコントロールを無効化できるか、
ご存知の方がいらっしゃいましたら、ご教示いただければと思います。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
横レス失礼致します。
> 下記のソースで試してみた所、下記のエラーが表示され駄目でした。
更新前(BeforeUpdate)イベントは、フィールドやレコードの更新前に
発生するイベントで、そのイベント内で更新を完了させることはできません。
ですので、コントロールを移動させる(=フィールド(=コントロール)の更新を
確定させる)場合は、更新後(AfterUpdate)イベントで行う必要があります。
【更新前/更新後イベントの大雑把な使い分け】
更新前イベント:
イベントのキャンセルを可能にしたい場合に使用
(指定した条件が満たされない場合、Escキーなどで入力を取り消さない限り、
そのコントロール(またはそのレコード)からの移動を許可しない)
更新後イベント:
上記以外で、入力値に対する対応を行う場合に使用
(上述した通り、こちらではコントロールの移動やレコードの(強制)保存が
できます。また、値の代入(例えば値を削除(=Nullを入力)した場合に
強制的に代替値を入力するなど)も行えます)
なお、このイベントは、対応する更新前イベント(→同じコントロールの
更新前/後、フォームの更新前/後)でCancel=Trueにされた場合は
発生しません。
今回のように、フォーカスの移動などが必要になる場合は、
a)値のチェックのみを更新前イベントで行い、フォーカス移動などは更新後
イベントで実行、と分割して対応するか、
b)全てを更新後イベントで行う形にして、条件を満たさなかった場合は
更新前イベントの「Cancel=True」の代わりに、OldValueプロパティを
使用して、更新前の値に戻す(→コントロールの更新前イベントの場合)
※コントロールソースがないコントロール(=非連結コントロール)では、
OldValueプロパティでは更新前の値は取得できません。
(変更後と同じ値が返されます)
のどちらかを選択することになります。
以下は、全てを更新後イベントで対応した場合のサンプルです:
Private Sub txt_ID_AfterUpdate()
Dim Record_Existence As Boolean
Record_Existence = True
If Record_Existence Then
'→If文での「= True」は省略可なので私は省略しています
Me.txt_Name.Enabled = True
Me.txt_Name.SetFocus
Me.txt_ID.Enabled = False
Else
'OldValueプロパティにより、直前の更新を行う前の値に戻します。
Me.txt_ID = Me.txt_ID.OldValue
'他のフィールドの編集は有効とした上で、「ID」のみ取り消す場合は、
'レコードを保存し直します。
'(レコード全体の編集を取り消す場合は、提示のコード(=Escキーの
' 送信でもOkです)
DoCmd.RunCommand acCmdSaveRecord
'SendKeys "{Esc}"
End If
End Sub
ご回答ありがとうございます。
ご提示いただいたソースで意図した動作が行われる事を確認しました。
また、更新前イベント、更新後イベントの解説をしていただき、ありがとうございます。
なお、よく考えたら「txt_ID」は下記の感じの動作でいいのかなと思ったので、
Else内のソースを変更させていただきました。
【動作】
1. 異常時は、入力欄を空白にして問題なさそうでした
(入力エラーの内容はメッセージボックスでポップアップ表示するようにしました)。
2. 異常時は、txt_IDにフォーカスがとどまっていた方が良いと思いました。
【変更後のソース】
' ------------------------------------------------------------------------------
Me.txt_ID = ""
' 一度適当な生きているコントロールにフォーカスを飛ばした後、フォーカスを戻す
Me.preview.SetFocus
Me.txt_ID.SetFocus
' ------------------------------------------------------------------------------
このたびはどうもありがとうございました。
以上、よろしくお願いします。
No.1
- 回答日時:
>コントロールがフォーカスを取得しているときは、コントロールを無効にすることはできません。
」これがネックであればif文のあとにフォーカスを移動させてから
無効化は駄目でしたか?
ご回答ありがとうございます。
下記のソースで試してみた所、下記のエラーが表示され駄目でした。
【エラー内容】
「実行時エラー '2108':
"GoToControl/コントロールの移動"アクション、GoToControl メソッド、または
SetFocus メソッドを実行する前に、フィールドを保存する必要があります。」
【ソースコード】
Private Sub Form_Open(Cancel As Integer)
Me.txt_name.Enabled = False
End Sub
Private Sub txt_ID_BeforeUpdate(Cancel As Integer)
Dim record_Existence As Boolean
' 本来はDBにアクセスして入力したIDが存在するかチェックしています。
record_Existence = True
If record_Existence = True Then
Me.txt_name.Enabled = True
Me.txt_name.SetFocus
Me.txt_ID.Enabled = False
Else
Cancel = True
SendKeys "{Esc}"
End If
End Sub
動作としては、起動時はtxt_nameを無効化しておき、txt_IDの入力値が正常の場合、txt_nameを有効化した上で、txt_IDを無効化したいと思います。
以上、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Access(アクセス) アクセス IDが空白の時、メッセージボックスがでるようにするには 1 2022/08/04 11:06
- Access(アクセス) アクセス レポートを開いたときにパラメーターの自動入力がしたい 4 2022/11/30 11:21
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
アクセスでレコードの内容が変更されたかどうかを調べるには
Access(アクセス)
-
MS Accessでフォームの「開く時」と「読込み時」のイベントの違い
Access(アクセス)
-
Accessのレポート上のテキストボックス値を設定したい
その他(データベース)
-
-
4
サブフォームに対してGoToRecordするには?
その他(Microsoft Office)
-
5
Access サブフォームでの選択行の取得
その他(データベース)
-
6
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
7
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
8
Access レポート印刷するときに1ページに収める方法
Access(アクセス)
-
9
Accessのサブフォームから値を参照する方法について
その他(データベース)
-
10
【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには
Access(アクセス)
-
11
アクセスVBAのMe!と[ ]
Access(アクセス)
-
12
Accessのフォーマット時イベント
その他(データベース)
-
13
フォームを開くときに、コンボボックスの値を選択(アクセスVBA)
Visual Basic(VBA)
-
14
アクセスで#エラーを表示させない方法は?
Access(アクセス)
-
15
access vbaにてテンポラリーテーブルが作りたいです。
Access(アクセス)
-
16
YES/NO型の値
Excel(エクセル)
-
17
Accessのフォームにて、詳細行のボタンを行の内容により、表示/非表
その他(Microsoft Office)
-
18
サブフォームの新規レコードに移動したい アクセス
Access(アクセス)
-
19
Access2000 サブフォームのRecordSet取得法
Access(アクセス)
-
20
ACCESSでVBAから選択クエリの抽出条件を指定したい
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
至急!尿検査前日にオナニーし...
-
首吊りどこ締めるの
-
尿検査の前日は自慰控えたほう...
-
尿検査前日に自慰行為した時の...
-
1日前の検尿
-
今朝、毎朝の習慣でオナニーし...
-
変な話しになります。尿検査で...
-
射精をして1週間以内に尿検査を...
-
検便についてです。 便は取れた...
-
腕を見たら黄色くなってる部分...
-
2つの数値のうち、数値が小さい...
-
彼女のことが好きすぎて彼女の...
-
EXCELで条件付き書式で空白セル...
-
口の中に黒い血の塊
-
値が入っているときだけ計算結...
-
男です。昨日の午後3時くらいに...
-
白血球が多いとどんな心配があ...
-
Excelで""で囲む方法
-
リンク先のファイルを開かなく...
-
小数点以下を繰り上げたものを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
中出しをするとお腹が痛い・・・。
-
麻疹風疹の抗体検査結果につい...
-
エクセルでエラーが出て困って...
-
白血球が多いとどんな心配があ...
-
彼女のことが好きすぎて彼女の...
-
検便についてです。 便は取れた...
-
勃起する時って痛いんですか? ...
-
至急!尿検査前日にオナニーし...
-
納豆食べた後の尿の納豆臭は何故?
-
これって喉仏ですか? 私は女性...
-
EXCELで条件付き書式で空白セル...
-
精子が黄色?
-
小数点以下を繰り上げたものを...
-
値が入っているときだけ計算結...
-
口の中に黒い血の塊
-
健否~書類の書き方~
-
甲状腺が腫れているが血液検査...
-
はしかの抗体検査は何科の病院...
-
テスターで断線を調べる方法教...
おすすめ情報