Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Access 2016)
重複レコードを1件残して自動削除したい
投稿日時: 18/01/25 15:36:22
投稿者: hana_brenda

access初心者です。教えてください。
 
重複クエリクエリウィザードで5つのフィールドがすべて重複するレコードを抽出しました。
この中で、備考フィールドにに値のあるレコードは残し、備考に値のないレコードだけ、1件ずつ残して重複するレコードを削除したいのですが、手作業ではかなり時間がかかってしまうため、自動化する方法はないでしょうか?よろしくお願い致します。

回答
投稿日時: 18/01/25 16:29:40
投稿者: Suzu

こんにちは。
 
重複クエリにて得られた結果は、
元のテーブルのレコードを参照し、演算された結果 表示されています。
 
それをクエリを表示させたまま、元のテーブルのレコードを手動で削除しようとしても
重複クエリで 削除しようとするレコードを参照していますから、
削除できません旨のメッセージが出て削除できないと思いますが いかがですか?
 
ですので、
1.重複クエリの結果を 追加クエリ等を使用し一時テーブルに保存します。
 
2.その一時テーブルのレコードから、残したいレコードを削除します。
  可能であるなら、この削除を削除クエリで実行します。
 
     備考以外同じ条件のデータが複数あり、備考に値があるレコードが 2件あったら
    【備考に値がある】と言う条件では、1件残しにできませんよね
     そうならない様に削除したいレコードを特定できる条件が一時テーブルには必要となります
 
 
3.元のテーブルに対し、一時テーブルのレコードを条件に削除クエリを発行します。
 
 
2.の部分を人の判断ではなく削除クエリ等で条件を指定する事ができるなら
 手順 1. 2. 3. それぞれのアクションクエリを発行すれば良いことになります。
 
必要なら、それらを マクロ/VBA で連続して実行する様にする事になります。
 
 
まずは、ファイルのバックアップを取り、1〜3を手動で出来るかテストしてみましょう。

投稿日時: 18/01/26 16:08:58
投稿者: hana_brenda

Suzu様、前回に引き続き、返信ありがとうございます。
 
重複クエリの結果からレコードを削除すると、元のテーブルからレコードが削除されています。
ただ、200〜300件の重複データを1件ずつ見ていくのは時間がかかり、ミスも考えられます。
 
以下の方法であっているでしょうか?
 
@重複クエリウィザードで重複しているレコードを抽出する。
 「T_単価表入力」の[名称][形状][単価][案件名ID][工事種目]の値が重複しているレコードを抽出する。
 テーブル作成クエリで「T_単価表入力の重複レコード」を作成する。
 クエリの名前は「!Q_T_単価表入力の重複レコードT」
 
A残すレコードを抽出する。
 「T_単価表入力の重複レコードT」を集計クエリで
 [名称][形状][単価][案件名ID][備考][工事種目]をグループ化し、[ID]を最小とし、
 テーブル作成クエリで「T_残すレコード」を作成する。
 クエリの名前は「Q_残すレコード」
 
B「T_単価表入力の重複レコードT」から「T_残すレコード」を削除して、「T_単価表入力」から削除するレコードを抽出する。
 @クエリで「T_単価表入力の重複レコードT」を表示し、[ID]をデザイングリッドに配置する。
 A削除クエリにする。
 B[レコードの削除]セルには「Where」と表示されているのを確認したら、[抽出条件]セルに次のように指定する。
 In (SELECT T_単価表入力の重複レコード.[ID] FROM T_単価表入力の重複レコード INNER JOIN T_残すレコード ON T_単価表入力の重複レコード.ID = T_残すレコード.[IDの最小];)
 C実行する。「T_残すレコード」の件数が削除される。
 Dクエリを保存する。クエリ名は、「Q_重複テーブルから残すレコードを削除する」
 
C「T_単価表入力」から「T_単価表入力の重複レコードT」(削除するレコード)を削除する
 @クエリで「T_単価表入力」を表示し、[ID]をデザイン グリッドに配置する。
 A削除クエリにする。
 B[レコードの削除]セルには「Where」と表示されているのを確認したら、[抽出条件]セルに次のように指定する。
 In (SELECT T_単価表入力.[ID] FROM T_単価表入力 INNER JOIN T_単価表入力の重複レコード ON T_単価表入力.ID = T_単価表入力の重複レコード.[ID];)
 C実行する。「T_単価表入力の重複レコードT」(削除するレコード)の件数が削除される。
 Dクエリを保存する。クエリ名は、「Q_T_単価表入力から重複削除」
 
Dフォームに「重複データの削除」コマンドボタンを作成し、@〜Cのクエリを開くを設定する。
 
Dで、何度もダイアログボックスが表示されますが、これは非表示には出来ますか?
表示しておいたほうがよろしいですか?
毎回実行する前にバックアップを取ったほうがよろしいでしょうか?
 
 

回答
投稿日時: 18/01/26 19:49:34
投稿者: Suzu

3-3、4-3 は、T_単価表入力 の [ID]が
ユニークキー(重複の無い値 主キーである事が多い)である前提での話です。
 
その前提で以下。
 
 
[quote]B-@クエリで「T_単価表入力の重複レコードT」を表示し、[ID]をデザイングリッドに配置する。
[quote/]
ID は配置しなくとも良いはずです。
 
 
[quote]
B-B[レコードの削除]セルには「Where」と表示されているのを確認したら、[抽出条件]セルに次のように指定する。
 In (SELECT T_単価表入力の重複レコード.[ID] FROM T_単価表入力の重複レコード INNER JOIN T_残すレコード ON T_単価表入力の重複レコード.ID = T_残すレコード.[IDの最小];)
[quote/]
 これは
  In(SELECT IDの最小 FROM T_残すレコード)
 で充分では?
 
[quote]
C-B[レコードの削除]セルには「Where」と表示されているのを確認したら、[抽出条件]セルに次のように指定する。
 In (SELECT T_単価表入力.[ID] FROM T_単価表入力 INNER JOIN T_単価表入力の重複レコード ON T_単価表入力.ID = T_単価表入力の重複レコード.[ID];)
[quote/]
  これも先の物と同じで
 In (SELECT T_単価表入力の重複レコード.[ID] FROM T_単価表入力の重複レコード)
  で良いでしょう。
 
[quote]
Dで、何度もダイアログボックスが表示されますが、これは非表示には出来ますか?
表示しておいたほうがよろしいですか?
毎回実行する前にバックアップを取ったほうがよろしいでしょうか?
[quote/]
 
【アクション クエリ確認メッセージのオンとオフを切り替える】
https://support.office.com/ja-jp/article/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-%E3%82%AF%E3%82%A8%E3%83%AA%E7%A2%BA%E8%AA%8D%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%AA%E3%83%B3%E3%81%A8%E3%82%AA%E3%83%95%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B-e58e4bba-9d54-4b9d-b962-9eca048e5335
 
マクロを使う場合には
【マクロで確認メッセージを非表示に】
http://www.relief.jp/docs/001879.html
を参考にどうぞ。

投稿日時: 18/01/30 13:39:51
投稿者: hana_brenda

Suzu様、
IDはユニークキー(オートナンバー型)です。
B-B In(SELECT IDの最小 FROM T_残すレコード)
C-B In (SELECT T_単価表入力の重複レコード.[ID] FROM T_単価表入力の重複レコード)
でできました。
 
B-@ ID は配置しなくとも良いはずです。
というのは、クエリに他のフィールドを配置した方がよいという意味ですか?
現在IDフィールドのみです。
 
 

回答
投稿日時: 18/01/30 17:09:34
投稿者: Suzu

hana_brenda さんの引用:
B-@ ID は配置しなくとも良いはずです。
というのは、クエリに他のフィールドを配置した方がよいという意味ですか?
現在IDフィールドのみです。

 
IDも、他のフィールドすら グリッドに配置する必要が無い と言う意味です。
 
先の WHERE句 の中のサブクエリのFROM句に二つのテーブルを INNER JOIN にしている部分は
演算処理が必要になり、速度低下の原因になり得ますが、
その事に比べたら IDは あっても、何ら問題とはなりませんがね。

投稿日時: 18/01/31 15:44:29
投稿者: hana_brenda

Suzu様ありがとうございました。