
顧客情報を入力する単票フォームを作成しています。
データが勝手に書き換わってしまわないように、
更新確認メッセージを表示させ、
キャンセルが押された場合は、編集を取り消す。ということがしたいのです。
現在、ある本の例を元に下記の記述をしています。
------------------------------
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)登録ボタンにこの動作をつける
どちらでも構いません。
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
Private Sub Form_BeforeUpdate(Cancel As Integer)
は、新規レコードに移動する時、あるいは
既存のレコードを変更し他のレコードに
移動する時、あるいは、レコードを変更したり
新規レコードに入力してそのまま閉じようとする
ときなどに発生します。
そこで、
>このレコードは保存できません。
>オブジェクトを閉じてもよろしいですか?と
>確認メッセージが出てしまいます。
この現象を調べると、単票フォームにデータを
新規に登録、または既存のデータを変更し、
そのままフォームの右上の閉じるボタンでフォームを
閉じようとすると、まず設定した更新確認のメッセージ
が表示され、キャンセルを押すと、
システムの「このレコードは保存することができません」
というメッセージが表示されます。
したがって、質問の更新前処理を残したままに
して、この現象を回避するためには、単に
他にボタンを設定するだけでなく、
(1)
閉じるボタンではキャンセルが難しいので、
この場合は、フォームのプロパティで閉じるボタンを
「いいえ」にする。
(2)
フォームを閉じるボタンを設定し、そのボタンのクリック時
にも変更確認をする。
(3)
また、登録ボタンを設定し、それにも変更確認をする。
なお、更新前処理を残せば、新しいレコードや
別のレコードに移動するときに更新を確認でき
るので残す必要があります。
以上を踏まえて、以下を設定します。
(1)登録ボタンの設定
名前を cmd登録
標題を 登録
Private Sub cmd登録_Click()
If MsgBox("登録しますか", vbYesNo + vbQuestion, "更新確認") = vbOK Then
DoCmd.RunCommand acCmdSaveRecord
Else
Me.Undo
End If
End Sub
(2)フォームを閉じるボタンの設定
名前を cmd閉じる
標題を 閉じる
Private Sub cmd閉じる_Click()
'編集中であるか確認
If Me.Dirty Then
If MsgBox("レコードを更新して閉じます。よろしいですか?", vbYesNo + vbQuestion, "更新確認") = vbOK Then
DoCmd.RunCommand acCmdSaveRecord
DoCmd.Close acForm, Me.Name
Else
MsgBox ("更新せずに閉じます")
Me.Undo
DoCmd.Close acForm, Me.Name
End If
Else
DoCmd.Close acForm, Me.Name
End If
End Sub
(3)質問にある更新前処理は残す
(4)フォームの既定の閉じるボタンの設定
既定の閉じるボタンではキャンセルが難しいので、
この場合は、フォームのプロパティで閉じるボタンを
「いいえ」にする。
なるほど!ひとつの考え方に執着してしまうようなので、何通りもの考え方をするようにがんばります!解決できました。ありがとうございます。
No.4
- 回答日時:
顧客情報入力テーブル
を用意し
入力→入力→入力
最後に3件分更新
の仕掛けをすれば
テーブル本体への影響少ない。
入れるだけ入れておいて
更新となればエラーないものを処理。
アクションクエリ時のメッセージが出る出ない、アクセスそのものの設定はどうですか。

No.2
- 回答日時:
私がよく行う方法を書きますが、具体的な事はご自分でお調べになってください。
まったく何を言ってるのかわからないのであればお勧めしません。
ようはフォームをレコードソースに直結させず、単なるデータの表示・入力の用途とし、VBA のコードでフォーム上の入力値をテーブルに登録するって方法です。
普通にフォームを作成し、テキストボックスなども配置させます。
普通はこの後、フォームのレコードソースにテーブルやクエリを指定し、テキストボックスなどのデータソースにはフォームのレコードソースが持つフィールドを指定するかと思いますが、あえてそうせずに非連結なままにします。
フォームに配置した [登録] ボタンのクリック イベントはプロシージャに設定。
あとはフォーム上の各コントロールの値を読み取って、"何らかの手法" でレコードを登録する処理を VBA で書きます。
"何らかの手法" はいくつかあり、どれを使っても構いません。
私がよくやるのは、レコードを追加するクエリを ADO から実行する方法。
レコードを追加するクエリはパラメーター クエリにしておきます。
パラメーター クエリは ADO から Command オブジェクトとして参照し、Parameter オブジェクトでクエリのパラメーターにフォーム上の値を入れて登録します。
例
■ テーブル
テーブル名: employees
列1: empID 長整数型
列2: empName テキスト型
■ クエリ
クエリ名: DataAdd
内容:
PARAMETERS [@ID] Long, [@Name] Text ( 255 );
INSERT INTO employees ( empID, empName )
VALUES ([@ID], [@Name]);
■ フォーム
フォーム名: EntryForm
1つ目のテキストボックスの名前: idTextBox
2つ目のテキストボックスの名前: nameTextBox
ボタンの名前: RegistButton
■ ボタンのクリック イベントプロシージャ
見やすいように全角スペースでインデントしてあるため、このコードをこのままコピペしてもエラーになる。
インデント部分の全角スペースは半角スペースに置き換えること。
また、ADO を使うため、"Microsoft ActiveX Data Object xx Library" を参照すること。
Private Sub RegistButton_Click()
Dim con As ADODB.Connection
Set con = CurrentProject.Connection
Dim com As New ADODB.Command
With com
.ActiveConnection = con
.CommandType = adCmdStoredProc
.CommandText = "DataAdd"
End With
Dim paramID As New ADODB.Parameter
Dim paramName As New ADODB.Parameter
With paramID
.Name = "[@ID]"
.Type = adInteger
.Value = Me.idTextBox.Value
End With
com.Parameters.Append paramID
With paramName
.Name = "[@Name]"
.Type = adVarWChar
.Size = 255
.Value = Me.nameTextBox.Value
End With
com.Parameters.Append paramName
com.Execute
End Sub
このコードの先頭のほうに MssBox で 「登録するか?」 を問いかけてユーザーに答えさせるように書けばよい。
No.1
- 回答日時:
OKボタンと、Cancelボタンを置くときは下記でいけると思います。
ご参考まで。
Private Sub OKbutton_Click()
If MsgBox("OK?", vbYesNo) = vbYes Then
DoCmd.RunCommand acCmdSaveRecord
'必要により、呼び元の帳票フォームをrequery
DoCmd.Close
End If
End Sub
Private Sub CancelButton_Click()
Me.Undo
DoCmd.Close
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
このQ&Aを見た人はこんなQ&Aも見ています
-
ACCESS フォームから開く【クエリ「パラメータの入力」】でキャンセルしてもエラーにならない方法は?
Access(アクセス)
-
メッセージボックスを前面に表示させるには?
Visual Basic(VBA)
-
VBAで3秒だけ時間を止めたい
Visual Basic(VBA)
-
-
4
Access 複数フォームを開き、画面の最上面にしたいフォームをコント
その他(データベース)
-
5
前のレコードの値を自動で入れたい
PowerPoint(パワーポイント)
-
6
クエリのデータをテーブルに入れたい
Access(アクセス)
-
7
ACCESS 複数のフォームから同一テーブル参照
Access(アクセス)
-
8
アクセスで数値型のフィールドにNullをいれたい
その他(データベース)
-
9
Access 同じデータをたくさんのレコード(同一列)に一度に入力するには
Access(アクセス)
-
10
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
11
アクセスVBA フォームのスクロールバーを動かす。
Visual Basic(VBA)
-
12
Access VBAでタブコントロールで選択するタブをしていするには。
Access(アクセス)
-
13
クエリで出来た表にチェックボックスを追加する
その他(Microsoft Office)
-
14
iif関数で3つ以上条件を抽出したい場合
IT・エンジニアリング
-
15
Accessで別テーブルの値をフォームに表示したい
その他(データベース)
-
16
ACCSESS2013VBA フォームのレコードソースを変更する
その他(データベース)
-
17
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
18
Accessレポートのチェックボックスを大きくする方法
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
子Formからの得た値をtextBox...
-
ユーザーフォームを表示中にシ...
-
ACCESS フォーム ビュ...
-
フォーム上でパラメータクエリ...
-
フォームを一瞬で綺麗に開くには?
-
イーベイで質問したら、Respond...
-
VBAのフォームについて
-
ユーザーフォーム上に現在日時...
-
ExcelVBAのユーザーフォームの...
-
picturebox の BackColor は透...
-
現在開いている全てのフォーム...
-
vb2010でフォーム非表示で処理...
-
Microsoft Formsの「個人情報や...
-
JavaScriptで「検索フォーム」...
-
VBAでユーザーフォームを再表示...
-
ユーザーフォームのラベルに時...
-
クリックイベントなのに、2回ク...
-
VisualStudioでのフォーム改変作業
-
C# デスクトップ画面にずっとフ...
-
VB6で2つのFormを使ってプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
Form_Load と Form_Activate の...
-
VBAでユーザーフォームを再表示...
-
Microsoft Formsの「個人情報や...
-
クリックイベントなのに、2回ク...
-
ユーザーフォームのテキストボ...
-
ユーザーフォーム上に現在日時...
-
ACCESSのフォーム、開くんです...
-
エクセルのチェックボックスの...
-
エクセルVBAのフォームを最...
-
VB.NETでフォームロード中のエ...
-
EXCEL VBA ユーザーフォームの...
-
VBA(エクセル)のユーザー...
-
【Excel VBA】ユーザフォームを...
-
Hideについて(.NET)
-
(Excel+VBA)ユーザーフォームの...
-
モーダルフォームとモードレス...
-
VBA コンボボックスとテキスト...
-
アクセス2013 フォームが...
おすすめ情報