• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access2013 不一致抽出)

Access2013 不一致抽出についての方法とテーブル比較

このQ&Aのポイント
  • Access2013を使用してテーブルの不一致抽出方法について教えてください。複数のテーブルを比較し、抽出条件を設定したいと考えています。
  • テーブルAとテーブルBを比較し、差分を抽出する方法を教えてください。例えば、JANコードが異なるレコードや品名が異なるレコードを抽出したいです。
  • 抽出結果の例として、テーブルAとテーブルBの差分を表示します。JANコード、品名、店番の項目で差分を抽出し、テーブルAでは存在するがテーブルBには存在しないレコードと、逆にテーブルBには存在するがテーブルAには存在しないレコードを表示します。

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

  • ベストアンサー
  • naoto0216
  • ベストアンサー率46% (183/391)
回答No.8

失礼しました。 仰る通り、SQLの頭の箇所がテーブルAの固定になってました。 そこを、 "SELECT [" & table1 & "].JANコード, に修正してみて下さい。

jyksy75798
質問者

お礼

再三の質問に対し親切に対応頂き誠にありがとうございました。 何とか自分がイメージしていたものができあがりました。 また機会がありましたら宜しくお願い致します。

その他の回答 (7)

  • naoto0216
  • ベストアンサー率46% (183/391)
回答No.7

まずフォームにcountという名前のテキストボックスを 追加します。 で、抽出ボタンが押されたときのコードの最後の方に  Forms![フォーム]![count] = Forms![フォーム]![リスト].ListCount - 1 を追加します。 これはリストボックスに表示されているレコード数をカウントし countに代入しています。見出しも1レコードとしてカウントされるので -1してます。 ※リストボックスのカウントをしてるので、リストボックスのRowsource  を設定した後に上記コードを追加する必要があります。

  • naoto0216
  • ベストアンサー率46% (183/391)
回答No.6

補足です。 ちゃんと抽出した状態でないと出力ボタンを押せないように、 処理の頭の方で、 If Forms![フォーム]![リスト].RowSource = "" Then MsgBox "出力する前に抽出して下さい。" Exit Sub End I を追加した方がよかと思います。 もしくは、デフォルトで出力ボタンは使用不可の状態に しておいて、抽出された場合のみ使用可能にするなど ちゃんと制御した方がよいです。

jyksy75798
質問者

お礼

改めてありがとうございます。 思っていた事が出来ました。

jyksy75798
質問者

補足

抽出したレコード件数をフォーム上に表示する事も可能でしょうか?

  • naoto0216
  • ベストアンサー率46% (183/391)
回答No.5

#1です。 失礼しました。無条件に抽出結果クエリを削除しようと して、存在しなかったらエラーになりました。 なので、抽出結果クエリが存在したら削除するように修正 しました。 Private Sub 出力_Click() Dim MySQL As String Dim db As Database Dim qdf As QueryDef MySQL = Forms![フォーム]![リスト].RowSource Set db = CurrentDb For Each qdf In CurrentDb.QueryDefs If qdf.Name = "抽出結果" Then db.QueryDefs.Delete "抽出結果" End If Next qdf Set qdf = db.CreateQueryDef("抽出結果", MySQL) Set qdf = Nothing DoCmd.TransferText acExportDelim, , "抽出結果", "C:\temp\抽出結果_" & Format(Date, "yyyymmdd") & ".csv" End Sub

  • naoto0216
  • ベストアンサー率46% (183/391)
回答No.4

>コマンドボックス(出力)を1個追加し、 とは、出力する為のボタンってことでしょうか。 だとしたら、出力ボタンがクリックされたときに以下のコードを 実行するようにして下さい。 例では、C:\tempに抽出結果_日付.csvというファイル名で 保存してます。 Private Sub 出力_Click() Dim MySQL As String Dim db As Database Dim qdf As QueryDef MySQL = Forms![フォーム]![リスト].RowSource Set db = CurrentDb db.QueryDefs.Delete "抽出結果" Set qdf = db.CreateQueryDef("抽出結果", MySQL) Set qdf = Nothing DoCmd.TransferText acExportDelim, , "抽出結果", "C:\temp\抽出結果_" & Format(Date, "yyyymmdd") & ".csv" End Sub 解説すると、現在のリストのソース(SQL)を変数に代入して そのSQLで抽出結果というクエリを作成し、そのクエリを エクスポートしてます。 ※TransferTextは直接SQLを指定できないので、あえてクエリを   作成し、その内容をエクスポートしてるってことです。   で、作成する際に既に同じ名前のクエリが存在するとエラーに   なるので、無条件に抽出結果クエリを削除してます。

jyksy75798
質問者

補足

お世話になっております 上記出力を実行しますとこのコレクションには項目がありませんのエラーが発生します どこか修正の必要があるのでしょうか?

  • naoto0216
  • ベストアンサー率46% (183/391)
回答No.3

#1です。補足です。 例えば、存在しないテーブル名が入力された場合や テーブル1とテーブル2に同じテーブル名が入力された場合 などのエラー処理は別途必要です。 エラー処理というよりは、そもそも上記のようなケースで入力 させないよう制御した方がいいかもしれませんね。 例えば、手入力させないようにテキストボックスではなく コンボボックスにして、そこには存在するテーブル名を表示して 選択させたり、テーブル1でテーブルAが選択されている状態で テーブル2にもテーブルAが選択されたら、その時点でエラー メッセージを表示させるとか。

jyksy75798
質問者

補足

今回お教えいただいた内容で自分なりに作成してみました。 抽出に関して一つ問題が発生しました。 テーブル1(テキストボックス)へテーブルC、テーブル2(テキストボックス)へテーブルBを入力し抽出を行うと正常に抽出できませんでした。 恐らくMySQL = "SELECT [テーブルA].JANコード, [" & table1 & "].品名, [" & table1 & "].店番"のテーブルAが固定になっている為かと思います。 比較するテーブルもテーブルAとテーブルB、テーブルBとテーブルCと変わる場合があります。 どのように記述したらよろしいでしょうか? 度々すみません。

  • naoto0216
  • ベストアンサー率46% (183/391)
回答No.2

#1です。 フォームは図のようなイメージですが、あってますでしょうか。 だとしたら、抽出ボタンがクリックされたときに以下のコードを実行 すればよいです。 テーブル1またはテーブル2が空白の状態で抽出ボタンが押された ときはエラーメッセージを表示するようにしてます。 ※自分もあまり詳しくないので、この方法がベストがどうか   分かりません。 Private Sub 抽出_Click() Dim MySQL As String Dim table1 As String Dim table2 As String If IsNull(Forms![フォーム]![テーブル1] = True) Then MsgBox "テーブル1を入力して下さい。" Exit Sub Else table1 = Forms![フォーム]![テーブル1] End If If IsNull(Forms![フォーム]![テーブル2] = True) Then MsgBox "テーブル2を入力して下さい。" Exit Sub Else table2 = Forms![フォーム]![テーブル2] End If MySQL = "SELECT [テーブルA].JANコード, [" & table1 & "].品名, [" & table1 & "].店番" MySQL = MySQL & " FROM " & table1 & " LEFT JOIN " & table2 & " ON [" & table1 & "].品名 = [" & table2 & "].品名" MySQL = MySQL & " WHERE ((([" & table2 & "].品名) Is Null))" MySQL = MySQL & " UNION SELECT [" & table2 & "].JANコード, [" & table2 & "].品名, [" & table2 & "].店番" MySQL = MySQL & " FROM " & table1 & " RIGHT JOIN " & table2 & " ON [" & table1 & "].品名 = [" & table2 & "].品名" MySQL = MySQL & " WHERE ((([" & table1 & "].品名) Is Null));" Forms![フォーム]![リスト].RowSource = MySQL Forms![フォーム]![リスト].Requery DoEvents End Sub

jyksy75798
質問者

補足

分かりやすい説明ありがとうございます イメージ通りです コマンドボックス(出力)を1個追加し、抽出後のデータをCSVにてエクスポートも可能でしょうか? 度々すみません

  • naoto0216
  • ベストアンサー率46% (183/391)
回答No.1

SELECT [テーブルA].JANコード, [テーブルA].品名, [テーブルA].店番 FROM テーブルA LEFT JOIN テーブルB ON [テーブルA].品名 = [テーブルB].品名 WHERE ((([テーブルB].品名) Is Null)) UNION SELECT [テーブルB].JANコード, [テーブルB].品名, [テーブルB].店番 FROM テーブルA RIGHT JOIN テーブルB ON [テーブルA].品名 = [テーブルB].品名 WHERE ((([テーブルA].品名) Is Null)); で、抽出できると思います。 あとは、上記SQLの「テーブルx」の箇所を変数とし、フォームのテキストボックスに 入力されたテーブル名を変数に代入してやればよいかと思います。

jyksy75798
質問者

補足

早速の回答ありがとうございます。 下記の部分はフォーム1の何処にどのように記述したら宜しいでしょうか? 【上記SQLの「テーブルx」の箇所を変数とし、フォームのテキストボックスに入力されたテーブル名を変数に代入してやればよいかと思います】

関連するQ&A