プロが教える店舗&オフィスのセキュリティ対策術

アクセスの初心者です。今、仕事でデーターの差分の抽出の仕方についてわからず困っています。
2つのテーブルがあります。
テーブルには100以上の項目と500件ほどのレコードがそれぞれ入っています。
この2つのテーブルを比較して差分を出したいのですが方法が思いつきません。
出したいものは、テーブル1とテーブル2の共通のIDを比較し、
テーブル1からテーブル2で変更、追加されたものを出したいのです。
レコードの追加だけなら差分クエリを利用してやれると思うのですが、
100以上の全フィールドをそれぞれ比較するとなるとどうすれば良いのかわからないのです。
2つのテーブルの項目は基本一緒ですが、追加されたり、変更されたりします。

もともとはエクセルのデータで毎週やりとりされるもので、
エクセル上で手作業で、
シート1とシート2でマッチングを行い、シート3に追加、変更されたものを書き出しています。

100列ほどの項目も追加や変更されるので、前回データと今回データで
(1)列の比較をして2つの列数を揃えてから、
(2)KEYになる列でVLOOKUP関数を使い、追加されたデータをよけて、
(3)前回データと今回データが一緒のデーター並べ替え、揃えて、シートを比較して変更、追加を探す
という作業を行っています。

データー数が多く、エクセルでは限界がでてきました。
また、アクセスを使えば簡単にできる。と言われましたが、
まだまだ初心者のため、この大量のデータをどう処理すればいいのかわかりません。

質問は、
(1)アクセスで100項目以上あるテーブルのそれぞれの差分をだすことができるのでしょうか?
(2)その方法はどうすればよいのでしょうか?
また、アクセス初心者でも勉強すればすぐにできるのでしょうか?
と、いうことです。
会社に迷惑をかけないためにも、可能、不可能を判断したいです。
よろしくお願いいたします。

A 回答 (2件)

アクセスはわかりませんがエクセルでも作業列を作って対応することで十分に早く処理できると思いますね。


例えばシート1に1行目に項目名が有り2行目から下方にデータが入力されているとします。
そこでシート2とシート1を比べてシート2で変更などが有った場合にその変更のあった行をシート3に表示させるとします。
シート2のA1セルにはシート1でも項目名が有り重要なデータ項目名であるIDなどと入力します。
シート2の2行目には項目名を入力します。シート1と同じ項目名でも列に入力する位置は変化しても構いません。
シート2では110列のDF列まで利用されているとします。
そこでDG3セルには次の式を入力してHL3セルまでオートフィルドラッグコピーしたのちに下方にもオートフィルドラッグコピーします。

=IF(COUNTA($A3:$DF3)=0,"",IF(COUNTIF(INDEX(Sheet1!$A:$DF,1,MATCH($A$1,Sheet1!$1:$1,0)):INDEX(Sheet1!$A:$DF,10000,MATCH($A$1,Sheet1!$1:$1,0)),INDEX($A:$DF,ROW(A3),MATCH($A$1,$2:$2,0)))=0,A3,IF(COUNTIF(Sheet1!$1:$1,A$2)=0,A3,IF(A3=INDEX(Sheet1!$A:$DF,MATCH(INDEX($A:$DF,ROW(A3),MATCH($A$1,$2:$2,0)),INDEX(Sheet1!$A:$DF,1,MATCH($A$1,Sheet1!$1:$1,0)):INDEX(Sheet1!$A:$DF,10000,MATCH($A$1,Sheet1!$1:$1,0)),0),MATCH(A$2,Sheet1!$1:$1,0)),"",A3))))

これでシート1のデータと違っている部分が表示されます。
そこでHM3セルには次の式を入力して下方にオートフィルドラッグコピーします。

=IF(COUNTIF(DG3:HL3,"")>=110,"",MAX(HM$2:HM2)+1)

このデータをもとにシート3にはシート1とシート2を比べてデータの違ったシート2の行を表示させることにします。
シート3のA1セルには次の式を入力して右横方向にオートフィルドラッグコピーします。

=IF(Sheet2!A2="","",Sheet2!A2)

シート3のA2セルには次の式を入力して右横方向にオートフィルドラッグコピーしたのちに下方向にもオートフィルドラッグコピーします。

=IF(OR(A1="",ROW(A1)>MAX(Sheet2!$HM:$HM)),"",INDEX(Sheet2!$A:$DF,MATCH(ROW(A1),Sheet2!$HM:$HM,0),COLUMN(A1)))

作業列を使って対応していますのでデータの量が多くなってもそれほど計算速度が遅くなるといったことはありません。
    • good
    • 2
この回答へのお礼

KURUMITOさん。回答ありがとうございます。

一度、この方法を試してみたいと思います。
ありがとうございました。

お礼日時:2012/03/27 19:13

まず、テーブル1とテーブル2の全フィールドが合致するものを抽出するクエリを作成します。

デザインビューで二つのテーブルの対応するフィールドを全て結合線で結べば良いですね。
クエリで出力するフィールドはテーブル2のフィールドのみとします。(テーブル1のみにしても、この場合は結果は同じだと思いますが)。これをクエリ1とします。
次にテーブル2と、クエリ1のIDについて不一致クエリを作成すれば、テーブル2の内で、テーブル1に無いものだけが抽出できると思いますがいかがでしょうか。(もし、テーブル1の内で、テーブル2に無いものを抽出したいのなら、適宜読み替えて同様に行って下さい)
ご参考まで。
    • good
    • 2
この回答へのお礼

mitarashiさん。回答ありがとうございます。
やはり、フィールドをひとつずつ結合する方法が確実なのですね。
100以上の結合作業をすることに抵抗がありましたが、
がんばります。
ありがとうございました。

お礼日時:2012/03/27 19:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A