質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

1回答

611閲覧

アクセス 開いているレコードのみを削除したい

susls

総合スコア8

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2022/08/31 00:27

前提

アクセスのデータを作成しています。

実現したいこと

アクセスのフォームにカレントコードを削除するボタンを作製したいです。
アクセスで開いているレコードのみを削除したいです。

発生している問題・エラーメッセージ

エラーは出ていませんが、下記コードを実行すると全てのレコードが削除されてしまいました。
ボタン作成時にはカレントレコードのみ削除できていましたが、他のフォーム等を編集していたらすべてのレコードが削除されるようになってしまいました。

該当のソースコード

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim vsql As String
Dim i As Variant
Dim x As Variant

Set db = CurrentDb()

x = Me!Frm見積書明細.Form.Recordset.RecordCount

If x = 0 Then
MsgBox "見積書明細の入力がない為削除できません"
Else

i = 見積ID vsql = "select * from T見積書 where 見積ID = '" & i & "'" Set rs = db.OpenRecordset(vsql, dbOpenDynaset) Me!Frm見積書明細.SetFocus DoCmd.RunCommand acCmdSelectAllRecords DoCmd.RunCommand acCmdSelectAllRecords DoCmd.RunCommand acCmdDeleteRecord DoCmd.SearchForRecord , , acFirst, "見積ID ='" & i & "'" Me!コンボ257.SetFocus DoCmd.RunCommand acCmdSelectAllRecords DoCmd.RunCommand acCmdDeleteRecord DoCmd.RunCommand acCmdSaveRecord Me.Refresh DoCmd.Close acForm, "Frm見積書", acSaveYes DoCmd.OpenForm "Frm見積書" DoCmd.SetWarnings True Application.Echo True rs.Close db.Close

End If

試したこと

途中stopをして一つずつコードを追っていきました。
DoCmd.RunCommand acCmdDeleteRecordの直前まではうまく動作しています。

補足情報(FW/ツールのバージョンなど)

エラーに気づく直前に下記urlを参考に未入力項目のチェックを出来るようにしようと試していました。
https://hatenachips.blog.fc2.com/blog-entry-507.html

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2022/08/31 01:22

> 全てのレコードが削除されてしまいました。 DoCmd.RunCommand acCmdDeleteRecord の前に DoCmd.RunCommand acCmdSelectAllRecords で全選択しているから当然だと思いますけど?
susls

2022/08/31 01:40

失礼しました。 開いているレコードのみを削除しようとそう記述したのですが、 実際に動かすと入力してあるテーブル上のデータが全て消えてしまいます。
guest

回答1

0

Frm見積書明細 というサブフォームがあるようですが、やりたいことは、
メインフォームのカレントレコードとサブフォームに表示されている全レコード(メインのレコードとリンクされた見積書明細のレコード)を削除したいということでしょうか。

もし、そうなら、提示のコードには無意味なものが多いです。
いろいろなところから引っ張ってきたコードだと思いますが、それぞれの意味を理解して使うようにしましょう。

上記の目的なら、下記のコードだけでご希望の動作になります。
各コードの意味をコメントしておきましたのでご参考に。

vba

1 If x = Me!Frm見積書明細.Form.Recordset.RecordCount Then 2 MsgBox "見積書明細の入力がない為削除できません" 3 Else 4 DoCmd.SetWarnings False '確認メッセージをオフ(「削除しますか?」など) 5 Me!Frm見積書明細.SetFocus 'サブフォームにフォーカス移動 6 DoCmd.RunCommand acCmdSelectAllRecords 'サブフォームのすべてのレコードを選択 7 DoCmd.RunCommand acCmdDeleteRecord '選択したレコードを削除 8 9 Me!コンボ257.SetFocus 'メインフォームのコントロールにフォーカス移動 10 DoCmd.RunCommand acCmdSelectRecords 'メインフォームのカレントレコードを選択 11 DoCmd.RunCommand acCmdDeleteRecord 'カレントレコードを削除 12 DoCmd.SetWarnings True '確認メッセージをオン 13 End If

投稿2022/08/31 03:16

hatena19

総合スコア34347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

susls

2022/08/31 04:16

ご返信ありがとうございます! 頂いたコードを動作させてみたのですが、うまくいきませんでした… サブレコードの削除は思った通りの動作をするのですが、レコードの方がテーブル上のデータを全て削除してしまいます。 フォームで開いているレコードのみ削除して他のレコードは残しておきたいです。 エラーが出た際、理由が分からず調べたものを追加しては削除を繰り返しています。 今回のコードも教えて頂いたものだけで動作するだろうと思うのですが、何故か動いてくれず試せるものを入れてははずしてを繰り返した結果のコードになっています。 作製したばかりの時にはちゃんと動いていて、コードも触ってないので何故か分からず… お心当たりあればご教示頂けますと幸いです。
hatena19

2022/08/31 04:41

当方のサンプルでは問題なく動作してます。 > サブレコードの削除は思った通りの動作をするのですが、レコードの方がテーブル上のデータを全て削除してしまいます。 サブフォームに表示されているレコードはすべて削除される。 メインフォームのテーブルのレコードもすべて削除されるということですか。 サブフォームコントロールの「リンク親フィールド」「リンク子フィールド」の設定は正しくできていますか。 実行したコードは私の回答のものそのままですか。 また、このコードはどのように実行しましたか。 いろいろ、情報が不足していて、状況が判断できません。
susls

2022/08/31 05:16

サブフォームに表示されているレコードはすべて削除される。 メインフォームのテーブルのレコードもすべて削除されるということですか。 →サブフォームはフォームに表示されているもののみが削除され、テーブル上の他のデータは消えません。 メインフォームのテーブルのレコード全てが削除されます。 メインフォームに紐づいているテーブルのデータは全て削除されます。 サブフォームコントロールの設定は動作を見ている限り正しいかと思います。 メインフォーム、サブフォームを見積IDで紐づけしていて、リンク親、子フィールド両方とも見積IDを指定しています。 実行したコードはそのままではありません。DoCmd.RunCommand acCmdSaveRecord、Me.Refresh、xの変数定義を追加しました。 コードの実行はフォームにボタンを作製し、イベントのクリック時にイベントプロシージャを作成してコードを入力、ボタンを押して実行しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問