Accessフォームの登録データ保存について

このQ&Aのポイント
  • Access2003にて登録フォームを作成しています。このフォームは入力したデータを保存するかどうかを確認するメッセージを表示します。しかし、保存せずにフォームを閉じる場合には正常に動作し、保存してフォームを閉じる場合にも問題ありませんが、保存せずにフォームに戻る場合には保存されてしまいます。
  • 質問の内容は、Access2003で作成したフォームでデータ登録を行う際に、保存せずにフォームに戻る場合にデータが保存されてしまうという問題が発生しているというものです。
  • この問題は、フォームのイベントハンドラであるBeforeUpdateイベントで行っている処理に原因があると考えられます。イベントハンドラ内で表示されるメッセージボックスの結果に応じて、保存せずに閉じる、保存せずにフォームに戻る、保存して閉じるといった処理を行っていますが、保存せずにフォームに戻る場合にも保存されてしまうという現象が発生しています。
回答を見る
  • ベストアンサー

access フォームについて

access2003にて登録フォームを作成しています。 このフォーム内に入力したデータを登録ボタンを押し、「登録しますか」のメッセージに 「いいえ」とすれば保存せずにこのフォームを閉じる。 「キャンセル」とすれば保存せずにフォームに戻る。 「はい」とすれば保存して閉じたいです。 しかし、以下の式を実行すると 「いいえ」はバッチリ希望通りに動くのですが、 「キャンセル」をすると保存されてフォームに戻り、 「はい」とすると保存されずにフォームが閉じられてしまいます。 何がまずいのでしょうか・・・。 ----- Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Ret As Integer Ret = MsgBox("登録しますか?" & vbCrLf & " " & vbCrLf & "「いいえ」を選択すると保存せず閉じます", vbYesNoCancel) '「いいえ」を選択したら、保存せずに閉じる If Ret = vbNo Then DoCmd.Close acForm, "振返りデータ", acSaveNo '「キャンセル」を選択したら、保存せずにフォームに戻る Else If Ret = vbCancel Then Else DoCmd.Close acForm, "振返りデータ", acSaveYes End If End If End Sub

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

  • ベストアンサー
noname#208392
noname#208392
回答No.1

acSaveYes の意味は、フォームの変更をメッセージ無しで保存する、ということですよ。 入力したデータを登録するのとは、全然関係ないオプションです。 典型的には、並べ替えの順序を保存しておくとか、フィルターを保存しておくとか、そんなことに使うのではないでしょうか。 このコードでは BeforeUpdate イベントでフォームを閉じることになっていますから、レコードが保存される前に、フォームが閉じるのは、正常にコードが走っていることになると思います。 入力したデータを保存するなら、私なら、非連結のフォームを作って、「登録する」を押したら、そのフォームに記入された数値をVBAのプロシージャで所定のテーブルに書き写していく、というふうにします。

関連するQ&A

  • ACCESSでフォームのUnloadでデータベースを閉じる様にしたら・・・

    ACCESS97でフォームのUnloadを使ってフォームを閉じた後、データベースも閉じるプログラムを作って実行させました。思った通りに動いたのですが、フォームをデザインビューにしようとすると、おそらく上記のプログラムが実行される為、データベースが閉じてしまうので編集できなくなってしまいました。 Pribate Sub cmdClose_Click() DoCmd.Close acForm,Me.Name End Sub -------------------------------- Private Sub Form_Unload(Cancel As Integer) Application.CloseCurrentDatabase End Sub 多分この様なプログラムでした。 解決方法を教えてください。 宜しくお願いします。

  • アクセス2002 VBA

    フォームを保存せずに閉じたいのですが、 当該フォームの「閉じる時」プロパティーにイベントプロシージャを設定し、 Private Sub Form_Close() DoCmd.Close acForm, "フォーム1", acSaveNo End Sub と記述しました。  ところが、実行すると 「Close アクションの実行はキャンセルされました。」とエラーになってしまいました。  間違いの指摘をお願いします。

  • チェックボックスを利用してフォームを開く

    帳票フォームでデータを出している画面の一番左にチェックボックスを配置しました。 第一にチェックボックスを1つづつ選択できるように下記を記載しました。 Private Sub 選択_Click() If Me!選択 Then CurrentDb.Execute "UPDATE テーブル名 SET 選択 = False;" Me.Refresh End If End Sub チェックボックスにチェックを入れると一連のデータが新しいフォームに移る様に 下記のように記載しましたが、全く受け付けません。 Private Sub 編集_Click() If 選択 = False Then DoCmd.OpenForm "編集F" DoCmd.Close acForm, "メインフォーム名" End If 何が問題なのかわかりません。 ご助言いただきたく、宜しくお願い致します。

  • フォームを閉じる時に保存するには?

    アクセスなのですが、右上のバツボタンでフォームを閉じる時に保存する方法はないのでしょうか? Private Sub Form_Close() DoCmd.Close acForm, Me.Name, acSaveYes End Sub これだとどうやらエラーになってしまいます。

  • アクセス フォームをリクエリしたい

    フォームAを閉じて、フォームBのテーブルに基づいたデータをリクエリ(更新)したいのですが DoCmd.Close acForm, "フォームA" DoCmd.Requery "フォームB" 実行時エラー2109 「カレントレコードには、フォームBという名前のフィールドはありません。」となってしまいます。 フィールド名ではなくフォームB全体を更新したいのですが、どうすればいいでしょうか? フォームBは開いている状態です。

  • access2000 メッセージボックスについて

    access2000のvbaでつまづいています。 フォームを閉じるために設定したvbaです。 以下のように入力し、メッセージボックスで「いいえ」を選んだときは何もさせたくないのですが、「はい」でも「いいえ」でもフォームを閉じてしまいます。「いいえ」のときは何もさせないためにはどこを訂正すればよろしいでしょうか?ご教示ください。 Select Case KeyCode Case vbKeyF9 '閉じる response = MsgBox("フォームを閉じますか?", vbYesNo + vbQuestion + vbDefaultButton1, "メインフォーム") If response <> vbYes Then DoCmd.Close acForm, "メインフォーム", acSavePrompt Else End If .........(以下case構文がいくつか続きます)

  • アクセスVBAにて登録ボタン押下時の動作記述

    顧客登録フォームで登録ボタンの押下時、更新前処理にて「はい/いいえ」の選択をしています。 ×ボタンでも更新前処理が実行されるため処理の記述に困っています。 下記が希望動作です。 -----登録ボタン はい  → レコードを保存する  顧客登録フォームを閉じる 顧客照会フォームを開く    いいえ → レコードを保存しない 顧客登録フォームに留まる -----×ボタン はい  → レコードを保存する  顧客登録フォームを閉じる いいえ → レコードを保存しない 顧客登録フォームを閉じる -----現在のソース Private Sub Form_BeforeUpdate(Cancel As Integer)   Ret = MsgBox("登録しますか", vbYesNo)   Select Case Ret     Case vbNo     Me.Undo   End Select End Sub Private Sub 登録_Click()   DoCmd.RunCommand acCmdSaveRecord End Sub どのように記述したらよいのでしょうか。 以上宜しくお願いします。

  • access VBA処理がうまくいかない

    お世話になります。 T_請求に追加する追加クエリQ_家賃請求Tがあります。 どの物件を更新するかをチェックボックスで指定し、追加クエリの抽出条件にしています。 月に1度のみの操作ですが、数人でこのデータベースを触り、 何度も追加されると困るので2度目以降はエラー処理をさせたいと思っています。 Private Sub 更新_Click() Dim ret As Integer ret = MsgBox("チェック物件を請求更新します。" & vbCrLf & "よろしいですか?", _ vbYesNo + vbQuestion, "請求月次更新") If ret = vbYes Then If DCount("[契約者CD]", "[T_請求]", "[物件CD] = " & Me!物件CD & _ " AND [T_請求]![請求年月] > #" & DateSerial(Year(Date), Month(Me![処理日]) + 1, 1) & "#") _ <> 0 Then MsgBox "すでに指定物件の請求は更新されています" & vbCrLf & _ "同じ月に請求を2度更新できません" Else DoCmd.SetWarnings False DoCmd.OpenQuery "Q_家賃請求用T" MsgBox "更新されました" DoCmd.SetWarnings True End If Else If MsgBox("処理を中止しました", vbOKOnly + vbDefaultButton1 + vbExclamation) = vbOK Then Me.Undo Cancel = True End If End If End Sub 以上のようなコードを書きました。 処理が正しくできているか確認のために、動作を調べたのですが、 まったく同じ請求年月で同じ物件CDのものが保存先のテーブルに処理されてしまいます。 どの部分を直せばいいのでしょうか? 足りない情報があれば提示しますので、よろしくお願いいたします。

  • Accessでフォームの検索結果をレポートで表示

    いつもお世話になっています。 前回の質問に続いて製品分析表を作成しています。 ベースは出来て、最後は必要な情報を印刷するのみとなりました。 情報の検索は、F_検索フォームから複数の条件から絞込みを行い、 それをボタンから指定したフォームで開いて再編集する操作は上手くいっています。 Private Sub 編集_Update() If Me.編集 Then DoCmd.OpenForm "F_製品分析" Set Forms!F_製品分析.Recordset = Me.Recordset Else DoCmd.Close acForm, "F_検索" End If End Sub ただこれをレポートに置き換えると「変数」がないとエラーが表示されてしまいます。 どうか解決策をご指示ください。 よろしくお願いいたします。

  • 現在開いている全てのフォームを閉じるVBA

    どうして、サンプル2じゃダメなのか教えていただけますか? ------------------------------------------------------------- Sub サンプル1() 'フォームがひとつも開いてない時に実行してもエラーにならない。 Dim intCnt As Integer '全ての開いているフォームのループ For intCnt = Forms.Count - 1 To 0 Step -1 'コレクションの intCnt番目のフォームを閉じる DoCmd.Close acForm, Forms(intCnt).Name Next intCnt End Sub Sub サンプル2() 'フォームがひとつも開いてない時に実行してもエラーにならない。 Dim intCnt As Integer For intCnt = 1 To Forms.Count DoCmd.Close acForm, Forms(intCnt).Name Next End Sub ------------------------------------------------------------- サンプル1を実行すると、問題なく全てのフォームを閉じる事が出来ますが、 サンプル2だと、二つ開いているフォームのうち、1つ目は閉じる事が出来るのですが 2つ目のフォームを閉じようとすると、 実行時エラー 2456 "フォームを参照するときに使っている番号が正しくありません" となってしまいます。 私としては、サンプル1もサンプル2も同じ動きをするものだと思ってるのですが どうやら違うようです。 どうして、サンプル2じゃダメなのか教えていただけますか?

専門家に質問してみよう