AccessのエラーチェックでFキーcmdボタンから反映されない

このQ&Aのポイント
  • Accessの入力フォームでエラーチェックをかけていますが、Fキーcmdボタンからエラーが反映されません。
  • エラー個所を修正した状態でも、Fキーcmdボタンの「更新」ボタンを押すとテキストボックスにエラーが出ます。
  • Me.txtMsgが未入力の場合や郵便番号が10文字でない場合にエラーメッセージを表示し、フォーカスを設定します。
回答を見る
  • ベストアンサー

AccessのエラーチェックでFキーcmdボタンから反映されない

こんにちは! 質問なのですが、Accessの入力フォームでエラーチェックをかけてます。 「txtMsg」って名前のテキストボックスを1つ用意してエラーの内容を 反映させてます。チェックの内容ですが、Nullチェックと文字数チェック ・禁止文字チェックをかけてます。 >エラーはちゃんと反映します。SetFocusでカーソルをエラー個所に立て て修正します。ここからが問題なのですが、エラー個所を修正したママの 状態(修正個所にFocusがある状態)でFキーcmdボタンの「更新」ボタン を押してもテキストボックスにエラーが出たママなんです。 ちなみにFキーを使用できるようにcmdボタンを12個並べて使っております。 >状況 ・Fキーを使用して更新した場合のみエラー表示が消えない。 >たぶんfocusが移動してないからかな? >Me.事項.SetFocusのような作業が出来ない状況(現状の >txtBOXの「Enterキー入力動作」を「行を追加」にして >いる為)で、Fキーを使用しつつ更新出来るようにするには? ・クリックで「更新」ボタンを押すとちゃんと更新される。 ってわけで困ってます。 何かいい方法を知っていらしゃいましたらご教授願います。 '------------------必須項目の未入力チェック------------------- Me.txtMsg = "" If IsNull(Me.郵便番号) Or Me.郵便番号 = "" Then Me.txtMsg = "郵便番号データが未入力です。( ̄▽ ̄;)!!" Me.郵便番号.SetFocus Exit Sub End If '--------------------図版CD文字数チェック-------------------- strYbn = Len(Me.郵便番号) If strYbn <> 10 Then Me.txtMsg = "『〒000-0000』形式にして下さい! (´∞`)" Me.郵便番号.SetFocus Exit Sub End If

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

  • ベストアンサー
  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.4

cmdTxtF5クリック前にcmdTxtF5.SetFocus・・・一緒かな? 確認ですが、 F5キー若しくはcmdTxtF5(コマンドボタン名)を直接クリックすることによりcmdTxtF5keydown()を実行したいということですよね。 ということは、 cmdTxtF5クリック時のイベント↓ Private Sub cmdTxtF5_Click()   cmdTxtF5keydown End Sub かつ、フォームの「キーボードイベント取得」→「はい」 そして、 Formのキークリック時のイベント↓ Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)   If KeyCode = vbKeyF5 Then     Me.cmdTxtF5.SetFocus 'ここでFocusを移す     cmdTxtF5keydown   End If End Sub 必要最低限の以上のような設定でテストしてみましたが、当方ではうまく作動しました。(cmdTxtF5keydownはNo.3の回答のものを使用しました。) 再確認ですが、コマンドボタンの名前は「cmdTxtF5」で間違いないですよね。 ・・・あっ、一回目の更新は実行できたのだから間違いないか (^ ^;

pooh_200x
質問者

お礼

やっぱり失礼だと思い会社にリモートアクセスでFileを転送して テストしてみました。OKぇぇぇぇぇです。チョット涙が出そうでした。 順調に動作してます。下記の記述で完璧でした。 Select Case KeyCode Case vbKeyF1 cmd前頁keydown KeyCode = 0 Case vbKeyF2 KeyCode = 0 Case vbKeyF3 KeyCode = 0 Case vbKeyF4 KeyCode = 0 Case vbKeyF5 If KeyCode = vbKeyF5 Then Me.cmdTxtF5.SetFocus 'ここでFocusを移す cmdTxtF5keydown End If KeyCode = 0 Case vbKeyF6 本当にありがとうございました。 有料でも教えて頂きたい知識をここまで丁寧に解説して 頂き本当に感謝しております。また利用する機会がありましたら よろしくお願い致します。 では失礼します。

pooh_200x
質問者

補足

こんばんわ!こんな夜遅くまで本当にスミマセン。 私はメールチェックして寝ようかと思っていた所だったので びっくりです。早速会社で試して結果を報告させて頂きます。 私のような初心者に丁寧かつわかり易いご指導をして頂き本当に ありがとうございました。

その他の回答 (3)

  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.3

>実行時エラー'cmdF5'にフォーカスを移動することはできません。 >*ラベルなど、フォーカスを取得できないコントロールです。 >*コントロールの"Visible/可視"プロパティが[No/いいえ]に設定されています。 >*コントロールの"Enabled/使用可能"プロパティが[No/いいえ]に設定されています。 >ちなみに上記指摘のプロパティは全て[Yes/はい]に設定してます。 うぅ~ん・・・ かなり自信ありませんが、SetFocusの前に Me.Repaint と、一行入れてみて下さい・・・ダメかな(; ;)

pooh_200x
質問者

お礼

何度も何度もごめんなさい! やっぱり駄目みたいです。 実行時エラー'2110': コントロール'cmdF5'にフォーカスを移動することはできません。 *ラベルなど、フォーカスを取得できないコントロールです。 *コントロールの"Visible/可視"プロパティが[No/いいえ]に設定されています。 *コントロールの"Enabled/使用可能"プロパティが[No/いいえ]に設定されています。 ↑が出てしまいました。記述の仕方が悪いのでしょうか? cmdTxtF5はコマンドボタン(更新)です。 txtMsgはエラー内容を表示するテキストボックスです。 Private Sub cmdTxtF5keydown() Dim intKsn As Integer Dim lngID As Long Dim intEnd As Integer Dim errMoji As String   Me.Repaint Me.cmdTxtF5.SetFocus ’エラーチェック '未入力チェック Me.txtMsg = "" If IsNull(Me.募集内容) Or Me.募集内容 = "" Then Me.txtMsg = "募集内容データが未入力です。" Me.募集内容.SetFocus Exit Sub End If '入力禁止文字チェック(全角空白)

  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.2

F○に更新を割り当てていると理解しましたが、 F○押下時に Me.更新ボタン.SetFocus にて「郵便番号」よりFocusを移動する事ができると思うのですが・・・ >更新後処理にMe.事項.SetFocus等の記述が不可能 何処の更新後なのか、「事項」とは何なのかが解らない為はずしているかもしれませんが・・・ また、いつの時点でエラーチェックをかけているのでしょうか。 もう少し詳細がわかれば、的確なアドバイスが出せるかも知れません・・・・かもですけど・・・(^ ^;

pooh_200x
質問者

お礼

説明不足ですみません。 郵便番号だとわかりにくいと思いますので本文で説明させていただきます。 txtHon(テキストボックス『メモ型』)に本文・cmdF5(コマンドボタン)に「更新」 としております。F5を押したタイミングで更新機能を作動させております。 「事項」とは次項目に移動の意味を込めたものですが自分以外わかりませんよね! (*_ _)人ゴメンナサイ >ご指摘通り更新ボタンの変数宣言後の記述をme.txtHon.setfocusから初めて見ました。 一度目の更新の際はエラーも無く動くのですが、修正を行ったあと二回目の更新 を行うと下記のエラーが起こりました。 実行時エラー'cmdF5'にフォーカスを移動することはできません。 *ラベルなど、フォーカスを取得できないコントロールです。 *コントロールの"Visible/可視"プロパティが[No/いいえ]に設定されています。 *コントロールの"Enabled/使用可能"プロパティが[No/いいえ]に設定されています。 ちなみに上記指摘のプロパティは全て[Yes/はい]に設定してます。 せっかく巧く動いたのに(>O<)

  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.1

>たぶんfocusが移動してないからかな? 本当にこれが原因ならば、単にFocusを移動すれば良いだけでは? 例えば、更新のcmdボタンに・・・ それと、Len("〒000-0000") = 9 ではないでしょうか(「〒,-」込みで) あと余計なお世話かもしれませんが、strYbnはintegerですよね? でしたらintYbnの方が後々一見して変数の型が判るので良いのではないでしょうか。stringと勘違いしそうで・・・(^ ^;

pooh_200x
質問者

お礼

お礼が遅くなりスミマセン ご返答ありがとうございます >>Me.事項.SetFocusのような作業が出来ない状況<< 現状txtBOXの「Enterキー入力動作」を「行を追加」にして いるので、更新後処理にMe.事項.SetFocus等の記述が不可能 なんです。どのように回避すればいいのか検討がつかない為、 途方に暮れました。 >>出来れば、更新ボタンに何かの記述を付け加えることで 回避したいのですが、おわかりになりますか? >それと・・・ まったくもってその通りです。Lenの方はカット&ペーストミス なんですけど、strYbnはおっしゃる通りinteger型です。 ご忠告ありがとうございます。

関連するQ&A

  • アクセスでのコマンドボタンでの上書き保存について。

    Private Sub cmd_修正_Click() Dim fname As String fname = "F_kihonn" '転送先のフォーム名 If SysCmd(acSysCmdGetObjectState, acForm, fname) = 0 Then DoCmd.OpenForm fname, acNormal '転送先フォームが開いてない場合は開く End If DoCmd.GoToRecord acDataForm, fname, acNewRec '転送先フォームの新規レコードをカレントにする '値の代入 Forms!F_kihonn!更新日 = Me!更新日 Forms!F_kihonn!コード = Me!コード Forms!F_kihonn!カナ = Me!カナ Forms!F_kihonn!発注者名 = Me!発注者名 Forms!F_kihonn!担当部署 = Me!担当部署 Forms!F_kihonn!郵便番号 = Me!郵便番号 Forms!F_kihonn!住所 = Me!住所 Forms!F_kihonn!ビル名等 = Me!ビル名等 Forms!F_kihonn!電話番号 = Me!電話番号 Forms!F_kihonn!FAX番号 = Me!FAX番号 Forms!F_kihonn!URL = Me!URL Forms!F_kihonn!特記事項 = Me!特記事項 End Sub というのを書きました。これだとコードにキーを持たせているので、転送先フォームでコード以外の内容を修正すると、「重複しているので変更できませんでした」とエラー表示が出ます。上書き保存ができればいいのでしょうけど。上書き保存のコマンドボタンとかを作ればいいのでしょうか??何かいい方法はありますか?わかる方いましたらご教示ください。初心者の質問ですみません。宜しくお願いします。

  • Accessテキストボックスの未入力チェック

    いつも参考にさせて頂いております。 Accessテキストボックスの未入力チェックで上手くいかず悩んでいます。過去の情報等調べましたが、わかりませんでした。 どなたか宜しくお願い致します。 フォーム1にテキストボックス1、ボタン1があります。 テキストボックスを何も入力せず、Enter等で移動する時にチェックをかけたいです。 もし、テキストボックスに何も入力がなかったら、メッセージを出し、フォーカスをテキストボックスに戻す。 何か入力があれば、ボタンにフォーカスが移動する。 If IsNull(Me.テキストボックス1) = "" Then msgbox "未入力です。" Me.テキストボックス1.SetFocus End If 宜しくお願い致します。

  • ACCESS重複のチェック

    ACCESSで重複チェックをしたいと思います。 現在は電話番号テーブルだけしかありません。 電話番号のテーブルを主キーを使って重複している場合エラーメッセージを出すというものです。保存ボタンもありません。 Private Sub text電話番号_BeforeUpdate(Cancel As Integer) If IsNumeric(text電話番号) = False Then '数字チェック。 MsgBox "電話番号は数字で入力して下さい。", vbCritical Cancel = True ' 処理を取り消します。 Me.Undo End If Dim strmsg As String strmsg = "重複しています" If Not IsNull(DLookup("[電話番号]", "ダブリチェックテーブル", "[電話番号] = [text電話番号]")) Then MsgBox strmsg, 16, "ダブリチェック" Cancel = True '処理を取り消します。 Me.Undo '元に戻します。 Else Cancel = False '処理を続行します。 End If End Sub これに、企業名と出発日という項目を増やしたいと思います。 ですが、何万とある電話番号を一気に入力して調べているので、一回一回企業名と出発日を入れていると生産性が落ちます。 ですので、企業名と出発日は最初の入力だけで次のレコードに移動してを継続させたいのです。そして電話番号以外にカーソルを行かないようにしたいです。 何か良い方法があればご教授お願いします。 ちなみにいろいろ自分なりに試したのですが、重複してエラーを出した場合に企業名にカーソルが飛んだししてうまくいきませんでした。

  • [Access97]フォーム上のボタン操作でチェックボックスにチェックが入るようにしたい

    Accessでテーブルを元にしていない単独のフォームを作っています。 クエリで抽出条件をパラメータで入力させるのと同様に、日付を入力してレポートをプレビュー表示させるためのフォームです。 集計表を作成するレポートの名前が入ったチェックボックスがフォームにあり、クリックひとつですべてのチェックボックスにチェックを入れるボタンを設置しています。 (画面図:例) (キャンセルなし集計ボタン)(キャンセルあり集計ボタン) □報告書集計 □キャンセルあり報告書集計 □記録集計  □キャンセルあり記録集計 (キャンセルボタン) (レポート出力ボタン) 上図の左のふたつにはデフォルトでチェックが入っています。 キャンセルあり集計ボタン ・クリックすると右の2つにもチェックが入る。 キャンセルなし集計ボタン ・クリックすると右の2つのチェックが取れる。 これら2つの処理はVBAで Me!報告書キャンセルチェック.Value = True 等としていますが、「プロパティクリック時でエラーが発生しました」となり、うんともすんとも動きません。 レポート出力ボタン ・クリックするとそのときにチェックが入っている集計レポートをプレビュー表示する。ただしキャンセルあり~にチェックがある場合はそのすぐ左の集計は出力しない。 これもVBAで If Me!報告書チェック.Value = True And Me!報告書キャンセルチェック.Value = True Then DoCmd.OpenReport "報告書集計表(キャンセルあり)" ElseIf Me!報告書チェック.Value = True Then DoCmd.OpenReport "報告書集計表" End If 等としてますが、やはりエラーが出ます。 VBが間違ってるのか、設定を変えてもそれをフォーム上に視覚的に反映させてないからか、それともソースとなるテーブルがないからでしょうか?

  • ACCESSで重複チェック後にフォーカスを移動したい

    Private Sub 会社名_AfterUpdate() ACCESS2003です。 フォーム上で入力後(更新後処理)に重複チェックをしています。 重複したときにエラーメッセージを出してフォーカスさせたいのです。 エラーメッセージまでは上手くいくのですが、フォーカスが移動してくれません。 どこが悪いのでしょうか? Private Sub 会社名_AfterUpdate() Dim i As Integer i = DCount("*", "tbl取引先", "会社名 ='" & Me.会社名 & "'") If i = 1 Then MsgBox [会社名] & " は登録済みです。" Me![会社名].SetFocus Cancel = True End If End Sub よろしくお願いします

  • 非連結のtxtBoxのデータをcmdボタンで検索

    非連結のtxtBoxのデータをcmdボタンで検索 いつもお世話になります。<m(__)m> 「T顧客管理」を基に「F顧客管理入力」を作成し「F顧客管理入力」 には非連結の「txtBox」と「cmd検索」があります。 「T顧客管理」に追加クエリにて「商品管理_ID・管理番号・商品名」 が入力済みになっております。 そこで「txtBox」に管理番号を入力して「cmd検索」を押して検索 されたレコードに顧客のデータを入力したいのですが、レコードが 検索されません。 「cmd検索」のイベントに Private Sub cmd検索_Click() DoCmd.SearchForRecord , , acFirst, "管理番号 Like '*" & Me!txt検索 & "*'" Me!txt検索 = Null End Sub としています。 追加クエリは INSERT INTO T顧客管理 ( 商品管理_ID, 管理番号, 商品名 ) SELECT T商品説明.商品管理_ID, T商品説明.管理番号, T商品説明.商品名 FROM T商品説明 WHERE (((T商品説明.商品名) Is Not Null)); として「T商品説明」には、他にフィールドがいくつかあります。 --「T顧客管理」-- 商品管理_ID ---- 数値型(主キー) 管理番号 ------- テキスト型 商品名 --------- テキスト型 販売日時 ------- 日付/時刻型 販売価格 ------- 通貨型 お名前 --------- テキスト型  ・  ・  ・ ----------------- コード等間違いがありますでしょうか? 初歩的な事と思いますが宜しくお願い致します。<m(__)m>

  • エラーのチェックについて

    1~10の数字以外が出たら、再入力を促すようにしたいのですが、上手くいかないので教えてください。 int main(void) { char buf[MAX], moji[MAX]; int n, num; printf("1から10の番号を入力してください:"); while (1) { fgets(buf, MAX, stdin); // 文字列の読み込み n = sscanf(buf, "%d%s", &num, moji); // 文字列から変換 if (num >= 1 && num <= 10 && n == 1) { // 範囲外のエラーチェック break; // 正なら終了 } else { // 間違っていたら入力し直し printf("1から10の番号を入力してください:"); } } 以上のようにして、aや11, ctrlキー+zを入力してEnterを押したときは良いのですが、aの後に続けてctrlキー+zを入力してEnterを押したらelseのprintfがずっと出力され続けてしまいます。それ以外に自分で試した入力の中にはエラーは出ませんでした。ctrlキー+zのことを良く理解していないということもあるのかもしれません。

  • ACCESS2000 ボタンメッセージについて

    ACCESS2000を使用しております。 フォームのボタンを押すとレポートが開くようになっています。 フォームのフィールド「終了日」がうるう年の2/28だったら、ボタンを押した時に警告のメッセージが出るようにしたいです。 現在は以下の通り、「終了日」を更新した時にメッセージが出るようにしています。 --- Private Sub 終了日_BeforeUpdate(Cancel As Integer) Const cMsg = "うるう年ですけど、2/29じゃなくて大丈夫ですか?" If Format(Me.終了日.Text, "mdd") = "228" And _ IsLeapYear(Year(Me.終了日.Text)) Then If MsgBox(cMsg, vbYesNo) = vbNo Then Cancel = True End If End If End Sub --- これをボタンの方にも流用しようと思い、(終了日を更新しない状態でもボタンを押すことがある為、その時点でもチェックを掛けたい) 以下を「マウスボタン解放時」に入れてみましたが、エラーが出てしまいました。 --- Private Sub Ctl_新_証書新規_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Const cMsg = "うるう年ですけど、2/29じゃなくて大丈夫ですか?" If Format(Me.終了日.Text, "mdd") = "228" And _ IsLeapYear(Year(Me.終了日.Text)) Then If MsgBox(cMsg, vbYesNo) = vbNo Then Cancel = True End If End If End Sub --- エラー内容は以下の通りです。 実行時エラー'2185' コントロールがフォーカスを取得していない時に、コントロールのプロパティまたはメソッドを参照することはできません。 そのままコピペしたので、値の更新をするとかしないとか、 ボタンを押した場合では関係ないので、その辺がエラーになっているのだと思うのですが、 どこを直したら良いのか分からず、お知恵をお貸し下さい。 要は、ボタンを押した時に警告メッセージを出し、「はい」であればレポートを開き(クリック時に開くマクロが入ってます)、「いいえ」であれば、開かずに元の画面のままが良いです。 宜しくお願いいたします。

    • ベストアンサー
    • Skype
  • Accessでエラーメッセージの表示を消したい

    いつもお世話になります。 また知恵をお貸し願えませんか。  テーブルのデータをキーを指定して呼び出し修正して更新するフォームを作成しました。 修正をしたあとの処理のため「更新」ボタンと「キャンセル」ボタンを設定しました。  修正を入力したあとに「キャンセル」ボタンをクリックした場合は正常に処理されるのですが、 何も修正入力せずに「キャンセル」ボタンをクリックすると(内容を確認したいだけ、違うレコードを 呼び出した等)   コマンドまたはアクション’元に戻す’は無効です というエラーメッセージが表示されます。 OKをクリックすれば処理は進められるのですが、できればエラーメッセージは表示させたくないと 思います。  「キャンセル」ボタンのプロパティでクリック時の[埋め込みマクロ]で下記のように指定しています。    条件        アクション        引数 エラー時        次、            コマンドの実行    元に戻す [MacroError]<>0 メッセージボックス  =[MacroError],[Description],はい,なし            閉じる         ,,確認 元に戻すがエラーになっているので 閉じる 以外を消去してところ エラーメッセージは表示されませんでしたが、修正を行ったあとに「キャンセル」ボタンを クリックしてもレコードの内容が変更されていたため元に戻しました。 どのように指定すればよいでしょうか

  • Accessフォームのボタンの二度押し禁止

    Access2000において、長い処理をさせる時、 ボタンを押した後に再びボタンを押してしまい処理が走ってしまうのを防ぐため、 以下のようなコードを考えましたが、エラーが発生します。 (以下のコードは簡略化しています) Private Sub cmd売上伝票変更_Click()   strMsg = MsgBox("更新します。よろしいですか?", vbYesNo)   If strMsg = vbNo Then     MsgBox "中止しました。", vbOKOnly     Exit Sub   End If   'ボタンを無効にしようとしましたがここでエラー   Me.cmd売上伝票変更.Enabled = False   Do Until 条件     ~ここに処理が入る~     'ステータスバーに進捗状況表示     Application.SysCmd acSysCmdSetStatus, lngCount & "件 / " & lngTotal & "件 完了"     DoEvents   Loop End Sub 進捗状況をステータスバーに表示させるために、DoEventsを入れていますが、 これがモトで再びボタンが押せてしまいます。 入れない場合、どこかクリックするだけで画面がフリーズしたようになってしまいます。 ボタンを押せなくする方法、またはボタンを押した後、画面だけ更新できる方法で、 何かよい方法は無いでしょうか?