みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2015-05-22 15:25:02

QNo.8979908

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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



です。

投稿日時 - 2015-05-23 12:47:08

ANo.2

No1です。

プロシージャに引数を書き忘れていました。
(2)の

Private Sub 更新確認()



Private Sub 更新確認(mycancel As Integer)

のようにmycncelを引数に設定しておいてください。

投稿日時 - 2015-05-23 11:16:27

ANo.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」に変数登録します。

投稿日時 - 2015-05-22 22:58:25

あなたにオススメの質問