• 締切済み

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で動作させています。 メインフォームではうまく動作するのですが、サブフォーム(帳票形式)に記載すると 値が変わらなくても違うセル(レコード)を選択すると動作してしまいます。 なにかうまく動作させられないでしょうか? ご教授お願いします

みんなの回答

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

たびたび、すみません。 No2でも動きますが、ロジックを見直して、というか 無駄な変数宣言をなくします。 No1の(2)については、サブフォームのコード表で、 '### Generalの部分 ### Option Compare Database Option Explicit Dim mycancel As Integer Private Sub 更新確認() Dim ret Beep ret = MsgBox("変更内容を保存しますか?", vbYesNoCancel + vbQuestion, "現レコード更新保存") Select Case ret Case vbYes DoCmd.RunCommand acCmdSaveRecord Case vbNo Me.Undo Case vbCancel mycancel = True End Select End Sub Private Sub Form_BeforeUpdate(cancel As Integer) mycancel = False Call 更新確認 If mycancel = True Then cancel = mycancel End If End Sub です。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

No1です。 プロシージャに引数を書き忘れていました。 (2)の Private Sub 更新確認() を Private Sub 更新確認(mycancel As Integer) のようにmycncelを引数に設定しておいてください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

>メインフォームではうまく動作するのですが、 これは、確認していないのでよく分かりませんが、 どのようにうまくいったのですか? それはさておき、 (1) サブフォームの更新前処理で、 Private Sub Form_BeforeUpdate(cancel As Integer) Dim ret Beep ret = MsgBox("変更内容を保存しますか?", vbYesNoCancel + vbQuestion, "現レコード更新保存") Select Case ret Case vbYes DoCmd.RunCommand acCmdSaveRecord Case vbNo Me.Undo Case vbCancel cancel = True End Select End Sub のように、直接更新前処理に書けばいいのでは? なお、「cancel」はBeforeUpdateの引数に出てくるので、 変数に「cancel」は登録しません。 (2) あるいは、どうしても「更新確認」を使用したいのであれば、 サブフォームの「General」のところに、 Dim mycancel As Integer と変数を登録し、「更新確認」は、 Private Sub 更新確認() Dim ret Beep ret = MsgBox("変更内容を保存しますか?", vbYesNoCancel + vbQuestion, "現レコード更新保存") Select Case ret Case vbYes DoCmd.RunCommand acCmdSaveRecord Case vbNo Me.Undo Case vbCancel mycancel = True End Select End Sub のようにし、サブフォームの更新前処理で、 Private Sub Form_BeforeUpdate(cancel As Integer) Dim mycan As Integer 'GeneralのmycancelをFalseに設定しておく mycancel = False Call 更新確認(mycan) If mycan = True Then cancel = mycan End If End Sub のように設定します。 (3) あるいは、標準モジュールを利用するかですね。 「更新確認は Sub 更新確認() 「mycancel」は 標準モジュールの「General」に変数登録します。

関連するQ&A

  • 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

  • アクセス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キャンセル時の確認メッセージを非表示に

    顧客情報を入力する単票フォームを作成しています。 データが勝手に書き換わってしまわないように、 更新確認メッセージを表示させ、 キャンセルが押された場合は、編集を取り消す。ということがしたいのです。 現在、ある本の例を元に下記の記述をしています。 ------------------------------ 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 更新キャンセルするには?

    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を作ればよいでしょうか? 説明不足の場合、補足いたします。よろしくお願いします。

  • ACCESSのフォーム

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

  • Access カレントレコードがありません

    フォーム社員情報からレコードを削除するボタンを作成してレコードの削除を行いたいのですが、全て削除をして1件もなくなった場合にデータベースを閉じる時に「カレントレコードがありません」というエラーが出てしまいます。OKをクリックすると閉じる事は閉じれるのでこのエラーが出ないようにしたいのですが。。。 よろしくお願いします。 'エラー開始 On Error GoTo err_RTN: '接続 Set cnADO = CurrentProject.Connection 'レコードセットを取得 Set rsADO = New ADODB.Recordset rsADO.Open "T社員情報", cnADO, adOpenKeyset, adLockOptimistic '削除 ret = MsgBox(Me!txt氏名.Value & Chr(13) & "を削除しますか?", vbYesNo + vbQuestion, "削除") Select Case ret Case vbYes rsADO.Delete Me.Requery Case vbNo Exit Sub End Select '終了 rsADO.Close: Set rsADO = Nothing cnADO.Close: Set cnADO = Nothing

  • サブフォームのレコード削除

    サブフォーム(帳票)のレコード削除をしたいのですが、レコードセクレタをクリックして選んだレコードではなく、テーブルの最初のレコードから順番に削除されてしまいます。 Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim ret As Integer '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset rs.Open "T支店", cn, adOpenKeyset, adLockOptimistic '削除 ret = MsgBox("表示中のレコードを削除しますか?", vbYesNo + vbQuestion, "削除") Select Case ret Case vbYes rs.Delete Me!sub支店.Form.Requery Case vbNo Exit Sub End Select '終了 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing WINDOWS98、ACCESS2000をしようしています。よろしくお願いします。

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

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

  • EXCEL2007にてVBAによる図形の複数選択ができなくなってしまっ

    EXCEL2007にてVBAによる図形の複数選択ができなくなってしまった。 以前EXCEL2003にて以下のプログラムでできたことができなくなってしまい いろいろ方法を探していたのですが見つからず困っています。 Sub 図形選択_Click() '--------------------------------------------- With ActiveSheet k% = MsgBox("どちらを選択?左列は(はい)を 右列は(いいえ)を 全選択は(キャンセル)を", vbYesNoCancel + vbQuestion, "複写方法の確認") Select Case k% Case vbYes For Each ob In .DrawingObjects If Not Intersect(ob.TopLeftCell, .Range("A1:D31")) Is Nothing Then ob.Select Replace:=False End If Next Case vbNo For Each ob In .DrawingObjects If Not Intersect(ob.TopLeftCell, .Range("E1:I31")) Is Nothing Then ob.Select Replace:=False End If Next Case vbCancel For Each ob In .DrawingObjects If Not Intersect(ob.TopLeftCell, .Range("A1:I31")) Is Nothing Then ob.Select Replace:=False End If Next End Select End With End Sub

  • 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 どなたかご教授いただけないでしょうか。