• ベストアンサー

Accessレコードの削除(VBA)

Accessで入力フォームを使用して入力をしていますが、 全項目の入力がされていない場合そのレコードを削除したいのです。 閉じるときに消そうと思い DoCmd.RunCommand acCmdDeleteRecord を入れてみたのですが、レコードの削除はできません、とメッセージが出てしまい消せません。 次のレコードを選択すれば消せるかと思い DoCmd.GoToRecord , , acNewRec を足してみたりしてみたのですが、やっぱりダメでした。 この場合はどのようにすればいいのでしょうか?

  • w-inty
  • お礼率72% (1169/1618)

質問者が選んだベストアンサー

  • ベストアンサー
  • Gin_F
  • ベストアンサー率63% (286/453)
回答No.1

フォームのレコード更新前イベントを使ってください。 If IsNull(Me!コントロール名1) Or IsNull(Me!コントロール名2) Then   MsgBox "入力をキャンセルします。"   Me.Undo End If のように。

w-inty
質問者

お礼

回答ありがとうございます。 これは、閉じるときのイベントでいいんですよね? me.undo 入れてみたんですが、テーブルを見るとしっかりデータが入ってました。

w-inty
質問者

補足

すいません、更新前でしたね。 無事出来ました。 ありがとうございました。

その他の回答 (1)

回答No.2

入力フォームでのレコード入力中は まだそのレコードが確定したわけではありませんので Me.Undo でレコードに対する変更をキャンセルできますよ。

w-inty
質問者

お礼

回答ありがとうございます。 これは、閉じるときのイベントでいいんですよね? me.undo 入れてみたんですが、テーブルを見るとしっかりデータが入ってました。

関連するQ&A

  • フォームのレコードソースにストアドをしてした場合

    フォームのレコードソースにパラメータ付きのストアドを指定した場合は、 データを追加する場合にはVBAで下記の命令では追加できないのでしょうか? 状況は「acNewRec」は正常に動作しているようです、「acCmdSaveRecord」で 「データの競合」のメッセージが表示されすすまないので、 終了させようとすると、「プロシージャまたは関数'○○○'には パラメータ'○○'が必要ですが、指定されませんでした。」となります. DoCmd.GoToRecord , , acNewRec データの入力処理 DoCmd.RunCommand acCmdSaveRecord 駄目な場合やはり追加用のストアドを作成するのでしょうか?

  • Accessでレコードの複製

    Accessで、ボタンをクリックすると 表示させているレコードをコピーして複製したいです。 以下のようにコードを書いてみたのですが、 「コマンドまたはアクション”追加貼り付け”は無効です」 となってしまいます。 DoCmd.RunCommand acCmdSelectRecord 'レコードの選択 DoCmd.RunCommand acCmdCopy 'コピー DoCmd.RunCommand acCmdRecordsGoToNew '新規レコードへ DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdPasteAppend '追加貼り付けを実行 ちなみに DoCmd.RunCommand acCmdPasteAppend を DoCmd.RunCommand acCmdPaste に修正しても 「コマンドまたはアクション”貼り付け”は無効です」 となって、エラーになってしまいます。 そこで、以下のようにコードを省略して DoCmd.RunCommand acCmdSelectRecord 'レコードの選択 DoCmd.RunCommand acCmdCopy 'コピー DoCmd.RunCommand acCmdRecordsGoToNew '新規レコードへ DoCmd.RunCommand acCmdSelectRecord ここで、手動で、ctrl+Vをすると、レコードのコピーができます。 コードの書き方が間違っているのでしょうか? ご教授よろしくお願いいたします!

  • Accessで一件の新規レコードのみを登録する方法

    OS: win xp Access Version: 2003 フォームを使って新規レコード入力できるように   Private Sub Form_Load() Docmd.GoToRecord,, acNewRec End Sub として、開いています。 ここの際、問題なのですが、ホイールマウスを使っているとデータ入力中に誤ってホイールを回すことにより次の新規レコードに移ってしまいます。 これを制限したいと思います。 この類の過去で検索しましたが、解決に至っていません。 ご意見をください。

  • Access を×ボタンで閉じる時、レコード保存したくない。

    Accessで最後の1レコード分のデータ入力を行ってから、レコードの更新をせず、レコードを移動せず、更新ボタンも押さず、いきなりフォームを閉じると、この1レコードが保存されてしまいます。 Me.Undo DoCmd.GoToRecord , , acNewRec を読込み解除時のイベントに入れても、しっかり保存されてしまいます。 閉じる時のイベントに入れるとエラーが出て保存されます。 ×ボタンで閉じる時、入力途中のレコードを保存せずに閉じるにはどうしたら良いでしょう。 初心者ですので、何か簡単で良い方法がありましたら、ご教授願います。

  • サブフォームの新規レコードに移動したい アクセス

    親フォームのコマンドボタンをクリックしたら 親フォームにはまっているサブフォームの新規レコードに移動したいのですが、 うまくできません。 サブフォームのオブジェクト名は、"F_SubForm"です。 サブフォームはデータシートビューです。 VBAコードは Private Sub cmd_test_Click() DoCmd.SelectObject acForm, "F_SubForm" DoCmd.GoToRecord , , acNewRec End Sub です。 上記コードを実行すると DoCmd.SelectObject acForm, "F_SubForm" の部分で、 「実行時エラー 2489  オブジェクトが開いていません。」 となります。 だからと言って、 DoCmd.GoToRecord , , acNewRec だと、何も起こりません。(新規レコードに移動しません) 解決方法をご教授ください。

  • Accessでレコードの複製

    Access2010を使用して入力フォームを作成しています。 メインフォームとサブフォームにそれぞれ顧客情報を表示させていて、 「複製」ボタンを押すと、 メインフォーム、サブフォームのレコードがコピーされるようにしています。 メインフォームの元テーブルはJIK サブフォームの元テーブルはREN です。 JIKおよびRENテーブルはほかからリンクさせているのですが、 これで「複製」ボタンを押すと、 "実行時エラー '3022': インデックス、主キー、またはリレーションシップで重複する値が生成されるためテーブルに要求した変更でした成功しました。フィールドまたは重複データが含まれている、インデックスを削除するフィールド内のデータを変更または重複するエントリを許可して、やり直してのインデックスを再定義します。このエラーは、レポートやレポートの生成に変更を保存するときに発生します。 が出てしまいます。 テーブルをインポートすると正常に動作します。 テーブルをリンクさせる場合、レコードの複製は不可能なのでしょうか? VBAは以下のように記述してみました。 Private Sub コマンド10_Click() On Error GoTo Err_コマンド10_Click Dim Result As Integer Result = MsgBox("このデータを複製しますか?", vbYesNo + vbDefaultButton2 + vbQuestion, "データの複製確認") If Result = vbYes Then Me!txtCopy事件ID = Me!事件ID Dim stDocName As String DoCmd.RunCommand acCmdSelectRecord 'カレントレコードの選択 DoCmd.RunCommand acCmdCopy '選択レコードのコピー DoCmd.GoToRecord , , acNewRec '新規レコードに移動 DoEvents ' (必要に応じて) DoCmd.RunCommand acCmdPasteAppend 'コピーレコードの追加貼り付け DoCmd.SetWarnings False ' システムメッセージ非表示 stDocName = "追加クエリ" DoCmd.OpenQuery stDocName, acNormal, acEdit DoCmd.SetWarnings True ' システムメッセージ表示 ' サブフォーム再クエリ Me!SREN.Requery ' 追加したレコードに移動 DoCmd.GoToRecord , , acLast Me.リスト31.Value = Me.リスト31.ItemData(0) MsgBox ("データを複製しました") Exit_コマンド10_Click: Exit Sub Err_コマンド10_Click: MsgBox Err.Description Resume Exit_コマンド10_Click Else MsgBox "データの複製をキャンセルしました" End If End Sub 追加クエリは以下のように作成してみました。 【追加クエリ】 INSERT INTO REN ( 事件ID, 氏名, フリガナ, ・・・ ) SELECT [Forms]![MAIN]![事件ID] AS 式1, REN.氏名, REN.[フリガナ], REN.報告書, ・・・ FROM REN WHERE (((REN.事件ID)=[Forms]![MAIN]![txtCopy事件ID]));

  • アクセス enterで次ページ(レコード)移動

    アクセスでformを使い最後の入力”失効有無”が終わったら次のレコードにenter keyで 移動したいのですがうまくいきません。 プロパティの更新後処理 イベントプロシージャのところに下記を書いています。 Private Sub 失効有無_AfterUpdate() DoCmd.GoToRecord , , acNewRec DoCmd.GoToControl "ID" End Sub 以前はこれでうまくいったと思います。。。 おかしいですか? よろしくお願いします、

  • Accessサブフォームのレコード移動

    Accessにおいて、サブフォームのレコードの移動方法をどなたか教えてもらえませんか。「Forms![メインフォーム名]![サブフォーム名].Form.SetFocus DoCmd.GoToRecord acDataForm, "サブフォーム名", acNext」とコーディングしたのですがダメでした。よろしくお願い致します。

  • トグルスイッチをVBAでコントロール

    マイクロソフトアクセス2000で作成しています。 メインフォームとサブフォームを使っています。 メインフォームにあるトグルスイッチを押した時に、サブフォームの最新レコードに移動したいと 考えています。 ボタンを押したときに、VBAの命令は動くのですがトグルスイッチが押した状態になりません。 VBAで押した状態にしようとしても命令言語がわかりません。 ご教授をお願い致します。 Me.トグルスイッチ1=true <- ここが動きません。 DoCmd.GoToControl "サブフォーム名" DoCmd.GoToRecord , , acNewRec

  • Access2003にて、メインフォーム上に設置した「コピー」ボタンを

    Access2003にて、メインフォーム上に設置した「コピー」ボタンをクリックすると、メインフォームとサブフォーム9個のレコードを一括で新規レコードにコピーするVBAを作成しています。 ですが、ボタンをクリックすると、 「3164  フィールドを更新できません」 とメッセージが表示されて、メインとサブ1だけがコピーされ、サブ2~9はコピーされません。 テーブルの構成は以下のようになっています。 メイン(テーブル名:00メイン)  ・計画書番号(オートナンバー型)※主キー  ・コピーフラグ(数値型)  ・コピー実行日(日付型)  ・作成フラグ(数値型)  ・作成日(日付型)  ※この他40程フィールドがあります。 サブ1~9(テーブル名:01~09サブ)  ・計画書番号(長整数型)※インデックスは「はい(重複なし)」  ・レコード作成用番号(長整数型)  ※この他各サブテーブルごとに、20~40程のフィールドがあります。 サブ1~9の計画書番号はメインの計画書番号とリレーションシップしています。 サブフォームに計画書番号を表示するようにしてみると、コピーボタンをクリックしたときサブ2だけがメインで取得した新しい計画書番号が表示されていて、サブ2~9はコピー元の計画書番号が表示されています。 以下にコピーボタンをクリックした時のコードとBeforeUpdate時のコードを記載します。 また、「Forms!メイン!サブ1.Form.レコード作成用番号 = Me.txt計画書No」の箇所はメインの新規作成時にサブ1~9にレコードを作成するようにしています。 (メイン作成と同時にサブにもレコードを作成したかったので・・・) サブ2~9までのコピーができるようにするにはどうしたらよいのでしょうか? よろしくお願いいたします。 Private Sub cmdコピー_click() DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend Me!コピーフラグ = 1 Me!コピー実行日 = Date Me!サブ1.SetFocus DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend Me!サブ2のサブフォーム.SetFocus DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend ※以下サブ3~9までサブ2と同じコードを記述しています。 MsgBox "レコードのコピーが完了しました。" End Sub Private Sub Form_BeforeUpdate(Cancel As Integer) Dim dlgret As Integer dlgret = MsgBox("編集内容を保存しましすか?", vbQuestion + vbOKCancel, "保存確認") If dlgret = vbCancel Then Cancel = True Else '新規作成の場合、作成日フラグは既定値0のため1に変更 If Me!作成フラグ = 0 Then Me!作成フラグ = 1 Me!作成日 = Date If Me!コピーフラグ = 1 Then Forms!メイン!サブ1.Form.Requery Forms!メイン!サブ2.Form.Requery ※サブ3~9も同様にRequeryを行ないます。 Else MsgBox "コピーフラグは" & Forms!メイン!コピーフラグ & "です。" & Chr(13) & _ "新規作成を実行します。""" Forms!メイン!サブ1.Form.レコード作成用番号 = Me.txt計画書No Forms!メイン!サブ2.Form.レコード作成用番号 = Me.txt計画書No ※サブ3~9も同様に処理します。 End If Else End If End Sub

専門家に質問してみよう