• ベストアンサー

AccessVBA  SetFocusとGoToControlが正常に作動しない

重複番号をチェックする機能を作っています。 重複番号が入力されると、エラーメッセージが出て、 OKを押すと番号を入れるテキストボックスにカーソルが移動し、空白にする、 という機能をつけましたが、 何度試してもカーソルが、隣のテキストボックスに移動してしまいます。 (エラーメッセージが出て、空白にするという動作は正常に行われます) SetFocusとGoToControlで試したのですが、 どちらも駄目でした。 原因が分かりません。 どなたかお分かりになりましたら、教えてください。 コードは下記のとおりです。 Private Sub AMコード_AfterUpdate() If DCount("AMコード", "Q_AM担当者登録チェック") >= 1 Then MsgBox ("すでに存在する番号です。別の番号を振りなおしてください。"), vbCritical, "番号重複" AMコード.SetFocus AMコード = "" End If End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

入力チェックは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」で、レコードの変更を取り消す必要があります。

kumikoara
質問者

お礼

ありがとうございます! 見事、私の希望通りに動きました!ありがとうございます! で、二三教えていただきたいのですが・・・ 1)「Me.Undo」というのは、レコード全体の変更を取り消す、という命令なのでしょうか? 2)DCount関数の「"AMコード='"&AMコード&"'"」とはどういう意味を持っているのでしょうか? よろしければ、教えてください!!

kumikoara
質問者

補足

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

その他の回答 (3)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.4

>テーブルでフィールドの設定項目を見ても、 >そのような場所がなさそうなので。。。 [インデックス]プロパティで、「はい(重複なし)」を選択して下さい。

kumikoara
質問者

補足

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

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

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

kumikoara
質問者

補足

>テーブルのフィールド自体に「重複なし」の設定をしておけば、レコード保存時に自動で規定のメッセージが表示されます。 というのは、どのようにしたら良いのでしょう? テーブルでフィールドの設定項目を見ても、そのような場所がなさそうなので。。。 (ちなみに番号はテキスト型でふっています) よろしければ、教えてください。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

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

kumikoara
質問者

補足

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

関連するQ&A

  • access setfocusについて

    いつもお世話になっております。 いろいろ調べたのですが行き詰っておりまして ご教授お願いします。 下記記述でsetfocusでエラーになってしまいます。 Private Sub コマンド_Click() If IsNull(Me.テキストボックスコントロール名) Then MsgBox "未入力です" Me.テキストボックスコントロール名.SetFocus End If テキストボックスの処理記述 End Sub https://www.moug.net/tech/acvba/0030005.html こちらを参考にしました。 よろしくお願いします。

  • VB6 テキストとSetfocus

    今テキストボックスからテキストボックスへ focusを写すのをやっていたのですが、 TEXT1 から TEXT2へ入力した後エンターキーを押したらfocusを写すというのを設定したところ ちゃんとカーソルは移動するのですが どうしてもエラー音が出てしまいます。 現在KEYPRESSに If KeyAscii = 13 Then Text2.SetFocus End If このように書いているのですがなにか間違ってるのでしょうか? エラー音を出さない方法をどなたかご教授ください

  • Setfocus について

    お世話になります。 Access2000でVBAを書いています。 ユーザがテキスト1に商品番号を入れます。ここで商品番号が8桁指定なので Dim Keta As Intger Keta = Len(テキスト1) If Keta <> 8 Then Msgbox"???" テキスト1.SetFocus End If と書きました。 しかし、SetFocusが効きません。他のテキスト(例えば、テキスト2)などにフォーカスを飛ばすことは テキスト2.SetFocus でいくのですが、自分のところに フォーカスを戻すのはなにか特別なコマンドがあるのですか? ご指導、お願いします。

  • Access2010 SetFocusが当たらない

    Access2010です。 VBAにて、あるフォームの、デザイン上、「詳細」の中に存在しているテキストボックスにSetFocusでフォーカスを当てようと思ってます。 1 フォームロード時、フォームの「詳細」は非表示(当然、テキストボックスも非表示) 2 ボタンクリック時、フォームの「詳細」を表示し、テキストボックスにフォーカスを当てる という動作をしているのですが、2でテキストボックスにフォーカスがフォーカスが当たりません。どうしたらフォーカスが当たるのでしょうか? 以下、コードです。 Private Sub Form_Open(Cancel As Integer) Me.詳細.Visible = False End Sub Private Sub cmdボタン_Click() Me.詳細.Visible = True 'テキストボックスにフォーカスを当てる Me.txtテキスト.SetFocus End Sub よろしくお願いいたします。

  • EXCEL VBA SetFocus について教え

    ComboBox3 で郵便番号 住所 を選択して TextBox8 に表示 その後番地等を記入するため Private Sub ComboBox3_AfterUpdate() '郵便番号 住所 Workbooks("*****.xls").Activate Worksheets("**").Activate With UserForm7 No = .TextBox1.Value .TextBox7.Value = Mid(.ComboBox3.Text, 1, 8) Cells(No + 1, 7).Value = Mid(.ComboBox3.Text, 1, 8) '郵便番号 .TextBox8.Value = Mid(.ComboBox3.Text, 10) '住所 Cells(No + 1, 8).Value = .TextBox8.Value .ComboBox3.Visible = False .TextBox8.SetFocus .TextBox8.TabIndex = 4 .TextBox8.Text = Mid(.TextBox8.Text, 1) End With End Sub 上のコードで TextBox8 の テキストの最後にカーソルを移動したいのですが TextBox8 に カーソルは現れません。(UserForm7の最初のTextBox1にフォーカスが移る) UserForm8 にも 同様なコードが有りますがこちらは期待どうり動作します。 タブオーダーとかの違いは有りますが関係するのでしょうか  よろしくお願いします。

  • サブフォームのsetfocus

    ac2000/win2000 こんにちは。 以下のようにサブフォームのテキストボックスにsetfocusしようと思いコードを書きました。 Me.SF1.Form.コード.SetFocus Forms!コード更新F!SF1.Form!コード.SetFocus 2つ書いたんですが、2つともエラーはでないものの 移動することが出来ません。 どなたか宜しくお願いします。

  • AccessVBA で月を2桁で入力させたい。

    質問します。 Access2000で日付をフォームから入力させます。 日付は月と日に別れています。その月フォームで「8」と入力するのではなく「08」と入力させたいのです。 (月はテキストボックスです。) そこで以下のようなVBAを書きました。 Private Sub 月_Exit Dim MM As Variant MM = Len(Me!月) If MM = Not 2 Then Msgbox "2桁で入力してください。" Docmd.GotoControl ("月") End if そうしたら、「8」といれても、「08」と入れても メッセージが表示されてしまいます。 さらにGotoControlが効いておらず、次の日付テキスト ボックスにフォーカスが移動してしまうのです。トホホ・・ こんな初歩的な質問でお恥ずかしいのですが・・・ 回答お待ちしております。

  • クエリーから入力フォームの作成

    access2000を使って簡単な注文用のフォームを作っています。VBAは初心しゃです。 テーブルとしては、納品伝票(伝票番号、顧客コード)、顧客管理(顧客コード)を作り( )ないのものでリレーション組んでます。 クエリーでリレーションを組み、それを元にフォームを作りました。 希望としては(1)伝票番号の重複がないようにする。 (2)顧客コードから住所を表示させる、顧客コードが登録されていないときにはメッセージを出し、正しい顧客コード(顧客コードのみ)を入力させる。 (1)はクエリーでテキストのデータを条件にし、フォームのVBAで Private Sub 伝票番号_AfterUpdate() If DCount("伝票番号", "Q_納品伝票") >= 1 Then MsgBox "すでに登録されています" Me.Undo DoCmd.GoToControl "顧客名" DoCmd.GoToControl "伝票番号" End If End Sub で上手くできましたが、同じクエリーで(2)も(1)と同様なVBAを組んだところ(顧客デーブルの顧客コードに重複があるときをチェックさせる)、(1)の重複をチェックしなくなってしましまいました。 うまく説明できたが心配ですが、根本的に何か違っていますでしょうか?

  • 「Form_フォーム1.テキスト1.Value = "" 」がうまくいかない。

    VBAについての質問です。(オフィス2003) フォーム1にテキストボックス1を作成しました。 Module1に Sub test() If Form_フォーム1.テキスト1.Value = "" Then MsgBox "空白です" End If End Sub とコードを書き、テキストボックス1を空白の状態でtestを実行しても何も起こりません。 F8で一行づつ実行してみてみたら Form_フォーム1.テキスト1.Valueのところにカーソルを当てると Form_フォーム1.テキスト1.Value=Nullとなります。 どうすればテキストボックス1が空白なら「空白です」と表示させることが可能でしょうか? よろしくお願いします。

  • Accessでのvbaについての質問

    Accessでのvbaを使用したプログラムについてお聞きしたいです。前にも似たようなことを質問していましたが、まだうまくいってません。マスタメンテナンス画面を作成しているのですがテキストボックスの入力チェック が上手くいきません。テキストボックス はコードという名前をつけています。 以下のコードでコーディングしています。 未入力チェック関数 Public Function EmptyCheck(Koumoku As Variant) As Boolean '引数で渡された項目が入力されているかチェック If Koumoku = ""Then EmptyCheck = True Else EmptyCheck = False End If End Function 桁数チェック関数 Public Function NumberCheck(Koumoku As Variant, Number As Integer) As Boolean If Len(Koumoku) <>Number Then NumberCheck = True Else NumberCheck = False End If End Function 半角英数字チェック関数 Public Function ZokuseiCheck(Koumoku As Variant) As Boolean If IsNumeric(Koumoku) = False And Not Koumoku Like "[a-z]*"And Len(Koumoku) <>6 Then ZokuseiCheck = True Else ZokuseiCheck = False End If End Function コード処理 Private Sub コード_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then ' If EmptyCheck(コード) = True Then MsgBox "コードを入力してください。" コード.SetFocus KeyCode = 0 Exit Sub ElseIf NumberCheck(コード, 6) = True Then MsgBox "コードの桁数が不正です。" コード.SetFocus KeyCode = 0 Exit Sub ElseIf ZokuseiCheck(コード) = True Then MsgBox "コードの属性が不正です。" コード.SetFocus KeyCode = 0 Exit Sub Else コード.Locked = True End If End If 上手くいかない点は以下の通りです。 1、テキストボックス(コード)の未入力チェックが上手く行きません。テキストボックスが空白の時も""になったりNullになったり変わるのでIf Koumoku = ""ThenにしてしまうとNullになった時処理されずそのまま次のテキストボックスにカーソルが移ってしまう時があります。なんでNullになったり""になったりで変わるのかも謎です。あと空白の時、Koumoku=""で一致しているにも関わらず、Falseで返されてしまい、未入力処理がされません。IsNullを使ってNull値判定してもKoumoku=Nullで一致してるのにFalseで返されました。 2、桁数チェックも上手く行きません。コード処理の方で桁数チェック関数に6という数字を渡して6桁入力としているのですが6桁でもエラーになってしまう時があります。LEN関数でどのように文字数を測っているのかも よくわからないです。 3.これは単純に半角英数字の判定の仕方が間違っているんだと思いますが、やり方がよく分からず、上手く判定できません。 4.これは入力チェックに当てはまるのですがEnterキーを押した時に処理するようにコードを書いていましたが変な結果が出ます。最初にテキストボックスでEnterキーを押して未入力の時に、「コードを入力してください。」とメッセージが出るのはいいのですがその後入力してもまた同じメッセージが出てきます。ほかのテキストボックスをクリックしてカーソルを移さないと同じメッセージが出続けます。桁数や半角英数字チェックの時も同じです。他のカーソルをクリックしないと次の項目のチェックにいかず、同じエラーメッセージが出続けます。何とかほかのカーソルに移さずに修正したら正しく処理が通るようにできないでしょうか。 5、最後に何も問題なかったらテキストボックスにロックかけるよう処理をしているのですが「コントロールの変更を保存していないときはコントロールをロックできません」というエラーメッセージが出てくる時があります。意味が分からず調べても出てこなかったので意味のわかる方何が悪くてエラーになっているのか教えて下さい。 調べてもデバッグしても原因が分からないものばかりです。 長文になってしまいましたがわかる方よろしくお願いします。

専門家に質問してみよう