顧客情報を入力する単票フォームを作成しています。
データが勝手に書き換わってしまわないように、
更新確認メッセージを表示させ、
キャンセルが押された場合は、編集を取り消す。ということがしたいのです。
現在、ある本の例を元に下記の記述をしています。
------------------------------
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でタイトルバーを非表示にする方法
Access(アクセス)
-
Accessでテーブルの値をテキストボックスに代入するには?
Access(アクセス)
-
-
4
Access を×ボタンで閉じる時、レコード保存したくない。
Visual Basic(VBA)
-
5
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
6
Access 別フォームへの再クエリ(更新)がしたい。
その他(データベース)
-
7
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
8
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
9
Accessで、フォームに情報を入力途中で、やめる(レコードに保存しない)ということは出来ますか?
Access(アクセス)
-
10
AccessからExcelにエクスポートする時に常に上書きしたい
Excel(エクセル)
-
11
新規レコード行を非表示にしたい
Access(アクセス)
-
12
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
13
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
14
ACCESS フォームから開く【クエリ「パラメータの入力」】でキャンセルしてもエラーにならない方法は?
Access(アクセス)
-
15
アクセスで#エラーを表示させない方法は?
Access(アクセス)
-
16
Access終了時にマクロまたはVBAの実行したい
その他(Microsoft Office)
-
17
サブフォームの切り替え方を教えてください
その他(データベース)
-
18
テキストボックスにクエリ結果を表示させたい
その他(データベース)
-
19
エラー(型が一致しません。)の対処方法
Visual Basic(VBA)
-
20
【アクセス】クエリで、行と列を入れ替えるには?【access】
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
モーダルフォームとモードレス...
-
Hideについて(.NET)
-
VBAでユーザーフォームを再表示...
-
ExcelVBAのユーザーフォームの...
-
エクセルVBAのフォームを最...
-
Accessで、一つのフォーム画面...
-
Microsoft Formsの「個人情報や...
-
'ユーザーフォーム右上隅の[×...
-
①ExcelVBAでカレンダーを作り、...
-
クリックイベントなのに、2回ク...
-
クリックするたびに、フォーム...
-
VBA(エクセル)のユーザー...
-
アクセスのUserFormにはInitial...
-
ブックをCloseまたはQuitで閉じ...
-
ユーザーフォーム上に現在日時...
-
C#で起動時のフォームを非表示...
-
コントロールの存在確認
-
MSGBOXのフォント大きさ変更
-
エクセルのVBAでユーザーフォー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
エクセルVBAのフォームを最...
-
ユーザーフォームのテキストボ...
-
クリックイベントなのに、2回ク...
-
モーダルフォームとモードレス...
-
Form_Load と Form_Activate の...
-
VBAでユーザーフォームを再表示...
-
Hideについて(.NET)
-
ACCESSのフォーム、開くんです...
-
MSGBOXのフォント大きさ変更
-
Excelにて、ユーザーフォームで...
-
【VBAユーザーフォームで閉じる...
-
ユーザーフォーム上に現在日時...
-
VBA(エクセル)のユーザー...
-
access2021 更新前に処理をしたい
-
Accessで、一つのフォーム画面...
-
コントロールの存在確認
-
Microsoft Formsの「個人情報や...
-
複数モニタ使用時のフォームの...
おすすめ情報