• 締切済み

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

専門家に質問してみよう