• ベストアンサー

Access 更新キャンセルするには?

Access2000で作成しています。 フォーム上でデータを書き換え後、更新をしない場合はどうしたらよいのでしょうか? 【希望する流れ】  1.データを変更  2.「更新」ボタンクリック     「データの更新をします。よろしいですか?」のメッセージ   (1)更新する場合:データを更新     「データが更新されました」のメッセージ   (2)更新しない場合:データを変更前に戻す     「データの更新がキャンセルされました」のメッセージ  3.フォームを閉じる  4.別のフォームを開く この動作をフォーム上にある「更新」ボタンのクリック時イベントにすることはできますか? とりあえず、現在は以下のようなものが作ってあります。 「VBA」  Private Sub Form_BeforeUpdate(Cancel As Integer)  '更新前確認   If MsgBox("更新します。よろしいですか?", vbYesNo, "更新確認") = vbNo Then   Cancel = True   Me.Undo   End If  End Sub 「更新」ボタンクリック時(こちらはマクロです)  ・フォームを閉じる  ・別のフォームを開く 今の状況では、更新する場合は問題ないのですが、更新しない場合、 「このレコードを保存することができません。  レコードを保存する時にエラーが発生しました。  ・・・・・・・・・・・」 というメッセージが出てきてしまいます。 どのようにVBAを作ればよいでしょうか? 説明不足の場合、補足いたします。よろしくお願いします。

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

  • ベストアンサー
  • arara0123
  • ベストアンサー率47% (8/17)
回答No.2

Private Sub Form_BeforeUpdate(Cancel As Integer)  '更新前確認   If MsgBox("更新します。よろしいですか?", vbYesNo, "更新確認") = vbNo Then Me.Undo MsgBox "データの更新がキャンセルされました"   End If End Sub でどうでしょう?

meganekko
質問者

お礼

回答ありがとうございます。お世話になります。 Cancel = Trueをとり、MsgBox追加した所・・・できました! 「Cancel = True」が何故必要ないのでしょう?(勉強します…) このデータベースを作るのが、初Access挑戦で、Accessのことも VBAのことも全くわからず、、、 本当にありがとうございました。助かりました。

その他の回答 (1)

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

こんにちは。maruru01です。 1つのやり方ですが。 フォームをテーブルと非連結で作ります。フォーム上の入力用テキストボックスなども全部自分で置きます。 フォームの下のほうにあるレコード移動関連のボタンも非表示にし、自分でコマンドボタンを作り、処理を書きます。 それで、データはレコードセットを作成してその都度表示させます。 そして、更新ボタンのイベントにレコードセットの更新処理を書きます。 全部自分で作るのが面倒ですが。 では。

meganekko
質問者

お礼

ご回答ありがとうございました。 まだまだ勉強不足でわからない事だらけです。 今後教えていただいた方法もできるように頑張りたいと思います。

meganekko
質問者

補足

こんにちは。お世話になります。 回答いただいた方法なのですが、一応、もう一つフォームを作り、 試したものがあるのですが、下記のようなことでよいのでしょうか? (更新のフォームを開くためにフィルタをかけています) Private Sub 更新_Click() On Error GoTo Err_更新_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "F_データ更新" stLinkCriteria = "[更新先]=" & "'" & Me![更新先名] & "'" DoCmd.OpenForm stDocName, , , stLinkCriteria Dim rec As New ADODB.Recordset rec.Open "Q_情報", CurrentProject.Connection, adOpenKeyset フォームのテキストボックスの名前 = rec.Fields.Item("フィールド名")     ・・・(テキストボックス分)    rec.Close ・・・(エラー時処理等) End Sub としたものを作ってあるのですが、 「指定した式で参照されている"|"フィールドが見つかりません」 というエラーが出てきてしまいます。 全くの初心者なのでHPや本を見ながら試しているのですが、 そもそも…が良くわかっていないのでどこがどう違うのか 見当がつきません。 やはり、質問の方法ではできないのでしょうか?

関連するQ&A

  • ACCESSキャンセル時の確認メッセージを非表示に

    顧客情報を入力する単票フォームを作成しています。 データが勝手に書き換わってしまわないように、 更新確認メッセージを表示させ、 キャンセルが押された場合は、編集を取り消す。ということがしたいのです。 現在、ある本の例を元に下記の記述をしています。 ------------------------------ Private Sub Form_BeforeUpdate(Cancel As Integer) Dim myans As Integer myans = MsgBox("レコードを更新します。よろしいですか?", vbOKCancel + vbQuestion, "更新確認") If myans = vbCancel Then Cancel = True Me.Undo End If End Sub ------------------------------ キャンセルを押したときに、 このレコードは保存できません。 オブジェクトを閉じてもよろしいですか?と確認メッセージが出てしまいます。 文頭に、DoCmd.SetWarnings Falseなどを入れてみたのですが、ダメでした。 本当は、「登録」というボタンを作成し、 登録が押されたときに上記の処理&レコード更新を行いたいのですが記述がわかりません。 登録ボタンに上記の記述をすると、閉じるを押したときに、 再度、同じ更新確認メッセージが表示されてしまいます。 (1)今の記述で、キャンセル時の確認メッセージを非表示にする (2)登録ボタンにこの動作をつける どちらでも構いません。 よろしくお願いいたします。

  • ACCESSのフォーム

    ACCESSのフォームでデータを入力しています。 既に入力したデータを誤って上書きしないように、更新前処理で下記のコードを入れました。 Private Sub 単価_BeforeUpdate(Cancel As Integer) If MsgBox("変更を保存しますか?", vbYesNo) = vbNo Then Me.Undo End If End Sub 入力済のデータを上書きする時はこの方法で良いのですが、新規に入力する時にも同じように確認メッセージが出てしまいます。 新規入力の時には確認メッセージを出さない方法があったら教えて下さい。 よろしくお願いします。

  • アクセスの登録について。(その2)

    先ほど質問したばかりなのですが、追加で質問です。 登録が自動でされないように下記のように記述するように教えてもらい登録のたびに確認がでるようになりまいた。でも、変更したらいけないところを間違って変更した場合、登録を「いいえ」にすると、登録はされないのですが、「指定したレコードに移動できません」のコメントがでます。登録しない場合は、元のデータのままにもどしたいのですが、元のデータにはもどれません。どのようにしたらよいでしょうか? 何度もすみません。 <フォームのイベントの中の、「更新前処理」に次のモジュールを書い<てみてください。 <Private Sub Form_BeforeUpdate(Cancel As Integer) <If MsgBox("登録しますか?", vbYesNo) = vbNo Then <Cancel = -1 <End If <End Sub <いいえを押した場合は、登録されません。

  • 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

  • Accessフォームで更新確認

    ACCESSで管理台帳を作成しています。 不用意なデータ上書きがないよう下記のようなプロシージャで確認を行っています。 Private Sub 更新確認() Dim ret, cancel Beep ret = MsgBox("変更内容を保存しますか?", vbYesNoCancel + vbQuestion, "現レコード更新保存") Select Case ret Case vbYes Case vbNo Me.Undo Case vbCancel cancel = True End Select End Sub このプロシージャはBeforeUpdateで動作させています。 メインフォームではうまく動作するのですが、サブフォーム(帳票形式)に記載すると 値が変わらなくても違うセル(レコード)を選択すると動作してしまいます。 なにかうまく動作させられないでしょうか? ご教授お願いします

  • 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
  • アクセス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 どのように記述したらよいのでしょうか。 以上宜しくお願いします。

  • Access2002 終了時の処理

    フォーム及びアクセスを誤って終了させることのないよう、フォーム内ボタンもしくは右上×をクリックした時、以下のモジュールで確認ボタンを表示させようとしています。 ======================== Private Sub Form_Close() '閉じるとき確認 2004/6/9 If MsgBox("システムを終了しますか?", vbYesNo + vbQuestion, _ "終了確認") = vbNo Then Cancel = False End If End Sub ======================== システムを終了しますか?のコメントとともにYes No ボタンも出ますが、Noを押しても終了してしまいます。終了しないようにするにはどのようにすればよいのでしょうか? いつもすみません。よろしくお願いします。

  • Access2000 Len関数 フォームで困っています

    最近Accessを始めた初心者です。 レポートで出力する際に文字が切れないように、フォームで入力文字数の制限をするため、Len関数でプロパティの入力規則に以下の設定をしました。 入力規則 Len([フィールド名])<51 エラーメッセージ 50文字以下に調整してください。 で、入力テストをしてみたところ、50文字まで入力可能、51文字からエラーメッセージが表示されるところまでは問題ないのですが、エラーの発生したテキストボックスを空にして、他のテキストボックスへ移動すると、また同じエラーメッセージが出てしまいます。 その後は何文字か入力しないと次のテキストボックスに移れなくなってしまい、入力する場所を間違えた場合にフォームを開きなおさねばならない状態です。 他には新しいレコードに移る際に、コードに以下のメッセージを設定していますが、他は何もしていません。 Private Sub Form_BeforeUpdate(Cancel As Integer) Beep If MsgBox("情報が変更されています! 変更されたデータを保存しますか?", _ vbYesNo + vbQuestion) = vbNo Then Me.Undo Cancel = True End If End Sub どなたかご教授いただけないでしょうか。

  • Access 「このレコードを保存することはできません」

    フォームのForm_BeforeUpdateイベントで、Cancel=Trueを設定し、更新を抑制しました。すると、フォームやAccess自体を×ボタンで閉じようとするときに「レコードを保存することはできません」というメッセージが出てしまいます。このメッセージを抑制する方法はありますか?

専門家に質問してみよう