- ベストアンサー
エクセルで表の相違確認をVBAでしたい。
お世話になっております。 下記の様な表がシート1とシート2に有、 シート2がシート1と比較して、行が多かったり、または 数量だけが変わっていたり、行が減っていたり、 表の行数は100から200行くらいあるので、VBAでどこが 違うかをすぐ分かる様に確認したいと思っています。 下記の表はあくまでも例ですが、実際は同じNO・同じ品番・同じ品名・同じ数量で複数行あったりします。 どの様に記述していいか分からなく、ご教示下さいます様宜しくお願い致します。 記 A列 B列 C列 D列 E列 No 品番 品名 地区 数量 236 A6TET みかん 市川 3本 248 A7TGR りんご 松戸 5本 273 B9GKT ぶどう 柏 14本 273 A8UFE すいか 行徳 6本 381 C2ROF いちご 平井 22本
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
どういう条件の行があって、何をもってその行が「同じ/違う」とするか?という仕様によると思いますが、 仮に、ABCD列が全て同じものを「同一」とし、同シートに前述定義の「同一」が無いと仮定すれば、 Set s1 = Sheets("Sheet1").Range("A1").CurrentRegion Set s2 = Sheets("Sheet2").Range("A1").CurrentRegion n = 10 For i = 2 To s1.Rows.Count s1.Cells(i, 6) = "" Next For j = 2 To s2.Rows.Count s2.Cells(j, 6) = "" Next For i = 2 To s1.Rows.Count judge = 0 For j = 2 To s2.Rows.Count If s1.Cells(i, 1) = s2.Cells(j, 1) And _ s1.Cells(i, 2) = s2.Cells(j, 2) And _ s1.Cells(i, 3) = s2.Cells(j, 3) And _ s1.Cells(i, 4) = s2.Cells(j, 4) Then judge = 1 If s1.Cells(i, 5) = s2.Cells(j, 5) Then s2.Cells(j, 6) = "Sheet1と同じ" '同一 Else s2.Cells(j, 6) = "Sheet1と本数以外同じ" '本数変更 End If End If Next If judge = 0 Then s1.Cells(i, 6) = "Sheet1にしかない" '削除 End If Next For j = 2 To s2.Rows.Count If s2.Cells(j, 6) = "" Then s2.Cells(j, 6) = "Sheet2にしかない" '追加 End If Next 順次比較でスマートではありませんが
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
2つの表を通して、同一と判断できる項目は何ですか。2つが同一と判断できて、その後その属性項目について、比較してこそ意味があるのです。人事ファイルでは職員コードです。主キーに当たるものです。 上記例は実際世界ー>模擬例に移し変えてあるようですが、品番がそれに当たるのかな。品名は品番が決まれば1意に決まる(従属している)ものでしょう。そういう点から、A列とB列の関係が良くわからない。 こういうことを意識しないうちは、質問のような課題を自力でやるのは無理です。VBAは経験あるのでしょうか。質問課題は中級の上ぐらいのスキルがいると思います。本件課題の丸投げで、コードをマルマル書いてくださいという状態です。このコーナーの規約上望ましくないタイプです。 人間がエクセルを使って手作業でやる場合は、どういう作業をすればよいのか、事細かに考えて、まず文章で、文章化するとVBAの場合も参考になります。 ーー ロジックとしては1方のシートの主キーを元に、他シートの同一キーを捜し(総なめ法)、一致したものが見つかれば、比較作業に入る 方法があります。 ーー その場合データを主キーでソーとしてあれば、見つかった後の塊以外は該当が無いので、ロジックが組みやすいです。 ーー 私なら両シートを主キーでソートして、ファイル・マッチングのロジックで主キーの同じレコード(行)を見つけ、対比して、差異を見つけます。 その場合1対1または1対多が望ましいが、多対多だとどれを基準に 正しいとしてよいか分からなくなります。 シート1で主キーについて誤りダブりが無いように、第1ステップの作業が必要かもしれません。 ーーー 誤り事由の、ありそうなパターンを、文章で書き上げてみるのも非常に大切だと思います。 (主キー、ファイル・マッチングはWEB照会のこと) http://e-words.jp/w/E4B8BBE382ADE383BC.html マッチングの法は語句(文字列)マッチングの記事が多いので注意。 本件はファイルのマッチンヅの方です。 http://dospara.okwave.jp/qa3419667.html?ans_count_asc=20 のNo.2
- n-jun
- ベストアンサー率33% (959/2873)
ANo.1です。 例えば、 >実際は同じNO・同じ品番・同じ品名・同じ数量で複数行あったりします。 この場合だと”地区”が変われば抽出と言う事ですか? 比較するには変化のない部分と変化する部分があって出来ると思います。 この表の場合品番と品名が必ず組み合わさっているとか、品番と地区が 組になっているとか、そう言う情報が読み取れません。 ですので、憶測でのコード化も難しいと思ってはいます。 (出来る方はいらっしゃるかも知れませんが。) 或いはテキストファイルにして、差分抽出を行なうのがいいのかは 実際のファイルがないので不明ですが。 検索:テキストファイル 差分抽出 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2005-51,GGLG:ja&q=%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%80%80%e5%b7%ae%e5%88%86%e6%8a%bd%e5%87%ba 有効かどうかは検証できないので無理であればスル~して下さい。
- n-jun
- ベストアンサー率33% (959/2873)
>下記の表はあくまでも例ですが、実際は同じNO・同じ品番・同じ品名・同じ数量で複数行あったりします。 どのような表とどのような表を比較した際に、どのような結果を求めているのか、 補足が必要な感じがします。 例を元にコード化したあとでご自身で変更が可能であれば別ですが、 何をコード化すべきか回答する側も憶測でしか出来ないように思います。 比較する際に基準にするものが、A列だけとか複数列とかも合わせて 提示してみたら回答がつくかも知れません。
補足
早期なご回答ありがとうございます。 すみません。わかりずらいと思います。 そのものの表を提示する訳にはいかず、説明も分かりずらいかも知れません。 表は、ある情報を元に、毎日更新され、それを日ごとにシートを分けて管理してます。 比較する表の形式や内容は、ほとんど同じ物の表で、それが前日の表より、どこか1行増えていたりするのを何百行ある内から探すのが大変なので、VBAでどこが変化したか確認したく検討しています。その変化の内容は行が増えるだけなら単純なのですが、行は増えずに、数量だけが変わっていたりします。(例えば、上記表の中のNO248の5本だったのが、次の日みたら、7本に変わっていたりとかです。) あくまでも表が例ですので、当然自身でコード変更は必要になると思っております。 もしこれで宜しければご回答頂きたいと思います。 尚、補足は随時行いたいと思います。
お礼
分かりにくい質問でしたのに、ありがとうございます。 やはり主キーをABCD列まとめる事になると何となく思っていましたが、そのVBAの記述が分かりませんでした。 ありがとうございました。