プロが教えるわが家の防犯対策術!

重複番号をチェックする機能を作っています。
重複番号が入力されると、エラーメッセージが出て、
OKを押すと番号を入れるテキストボックスにカーソルが移動し、空白にする、
という機能をつけましたが、
何度試してもカーソルが、隣のテキストボックスに移動してしまいます。
(エラーメッセージが出て、空白にするという動作は正常に行われます)

SetFocusとGoToControlで試したのですが、
どちらも駄目でした。
原因が分かりません。
どなたかお分かりになりましたら、教えてください。
コードは下記のとおりです。

Private Sub AMコード_AfterUpdate()
If DCount("AMコード", "Q_AM担当者登録チェック") >= 1 Then
MsgBox ("すでに存在する番号です。別の番号を振りなおしてください。"), vbCritical, "番号重複"
AMコード.SetFocus
AMコード = ""
End If
End Sub

A 回答 (4件)

入力チェックはAfterUpdateではなくBeforeUpdateで行います。



Private Sub AMコード_BeforeUpdate(Cancel As Integer)
  If DCount("AMコード", "AM担当者テーブル", "AMコード = '" & AMコード & "'") > 0 Then
    MsgBox ("すでに存在する番号です。別の番号を振りなおしてください。"), vbCritical, "番号重複"
    Cancel = True
    Me.Undo
  End If
End Sub

上記の例ではクエリで判定せず、直接、元のテーブルに対して直接判定を行っています。

なお、BeforeUpdateの中でヘタにSetFocusを使ったり値の代入を行うと、不測のエラーが出たり無限ループに陥るので、やってはいけません。

また、既存レコードを書き替えようとした場合「Cancel = True」で変更を無効にして元の値に戻しても、レコードは「変更あり」の状態なので、重複エラーの表示後にフォーカスの移動を行おうとすると、自分自身が「重複」として判定されて何も出来なくなってしまうので「Me.Undo」で、レコードの変更を取り消す必要があります。

この回答への補足

ヘルプなどを見て、(1)(2)とも意味が分かりました。
どうもありがとうございました☆

補足日時:2004/01/07 14:21
    • good
    • 1
この回答へのお礼

ありがとうございます!
見事、私の希望通りに動きました!ありがとうございます!

で、二三教えていただきたいのですが・・・
1)「Me.Undo」というのは、レコード全体の変更を取り消す、という命令なのでしょうか?
2)DCount関数の「"AMコード='"&AMコード&"'"」とはどういう意味を持っているのでしょうか?

よろしければ、教えてください!!

お礼日時:2004/01/07 13:39

>テーブルでフィールドの設定項目を見ても、


>そのような場所がなさそうなので。。。
[インデックス]プロパティで、「はい(重複なし)」を選択して下さい。

この回答への補足

あ、見つかりました。
ありがとうございます。
[インデックス]で「重複なし」を選択できるのは、
1つのテーブル対して1つのフィールドのみのようですね。。。

勉強になりました。ありがとうございます。

補足日時:2004/01/07 13:41
    • good
    • 0

こんにちは。

maruru01です。

重複チェックをAfterUpdateイベントに記述するのはおかしいと思います。
また、そもそも各コントロールの値は入力時点ではまだ連結したテーブルのフィールドには書き込まれません。
テーブルに書き込まれるのは、レコード自体を移動した時です。
したがって、データのチェックは、フォームのBeforeUpdateイベントに記述して、保存不可の場合は、CancelにTrueをセットして、再入力を促すコントロールにフォーカスを移動した方がいいと思います。
どうしても、各コントロールの入力直後にチェックしたいなら、各コントロールのExitイベントでチェックして、不可なら、CancelにTrueをセットして、フォーカスの移動をキャンセルすればいいと思います。
なお、テーブルのフィールド自体に「重複なし」の設定をしておけば、レコード保存時に自動で規定のメッセージが表示されます。

この回答への補足

>テーブルのフィールド自体に「重複なし」の設定をしておけば、レコード保存時に自動で規定のメッセージが表示されます。

というのは、どのようにしたら良いのでしょう?
テーブルでフィールドの設定項目を見ても、そのような場所がなさそうなので。。。
(ちなみに番号はテキスト型でふっています)
よろしければ、教えてください。

補足日時:2004/01/07 13:23
    • good
    • 0

Private Sub AMコード_BeforeUpdate(Cancel As Integer)


If DCount("AMコード", "Q_AM担当者登録チェック") >= 1 Then
MsgBox ("すでに存在する番号です。別の番号を振りなおしてください。"), vbCritical, "番号重複"
AMコード = ""
Canncel = True
End If
End Sub
これで、カーソルは移動しないはずですが。お試しください。

この回答への補足

ご回答、ありがとうございます。
教えていただいたとおりに書き直したところ、
「更新前処理プロパティまたはこのフィールドの入力規則プロパティに設定したマクロまたは関数のために、このフィールドのデータを保存できません。」
というエラーメッセージが返るようになってしまいました。
・・・どうしたらよいでしょう???
教えていただけると、助かります。

補足日時:2004/01/07 13:22
    • good
    • 0

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

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


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