• ベストアンサー

エクセルマクロでシートの比較

sheetAとsheetBそれぞれのA列に千件くらいのデータが入っています。 かなり重複もあります。 今回マクロでSheetCのA列に重複されないデータのみ抜き出したいと思います。 どのような記述になるのでしょうか?

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

  • ベストアンサー
回答No.10

No9さんので重複してないデータの抽出は完了ですが、 補足にあった > SheetAにありSheetBにない S> heetBにありSheetAにないものを区別して抜き出したいのです。よろしくお願いします。 は充足できてないですね。 No9のコードをそのままお借りして以下のようにすると、Sheet3で列を変えて表示できますので区別できます。 Sub test() Dim gyoA As Integer 'A最大値 Dim gyoB As Integer 'B最大値 Dim i As Integer 'ループ用 Dim ii As Integer 'ループ用 Dim iii As Integer '記入カウンタ Dim flg '一致ものがあるかのフラグ iii = 1 '記入開始行 gyoA = Sheet1.Range("A1").End(xlDown).Row gyoB = Sheet2.Range("A1").End(xlDown).Row For ii = 1 To gyoB Step 1 flg = 0 For i = 1 To gyoA Step 1 If Sheet1.Cells(i, 1) = Sheet2.Cells(ii, 1) Then flg = 1 End If Next If flg = 0 Then Sheet3.Cells(iii, 1) = Sheet2.Cells(ii, 1) iii = iii + 1 End If Next iii = 1 '記入開始行を1にどす For i = 1 To gyoA Step 1 flg = 0 For ii = 1 To gyoB Step 1 If Sheet1.Cells(i, 1) = Sheet2.Cells(ii, 1) Then flg = 1 End If Next If flg = 0 Then Sheet3.Cells(iii, 2) = Sheet1.Cells(i, 1)'2列目に表示 iii = iii + 1 End If Next End Sub

moooon
質問者

お礼

完璧です。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (9)

noname#8445
noname#8445
回答No.9

わけわからなくなると思いましたので全部書きます dim gyoA as integer  'A最大値 dim gyoB as integer  'B最大値 dim i as integer 'ループ用 dim ii as integer 'ループ用 dim iii as integer '記入カウンタ dim flg '一致ものがあるかのフラグ iii=1 '記入開始行 gyoA=sheet1.range("A1").end(xldown).row gyoB=sheet2.range("A1").end(xldown).row for ii = 1 to gyoB step 1 flg=0 for i = 1 to gyoA step 1     if sheet1.cells(i,1)=sheet2.cells(ii,1) then flg=1 end if next if flg=0 then sheet3.cells(iii,1)=sheet2.cells(ii,1) iii=iii+1 end if next for i = 1 to gyoA step 1 flg=0 for ii = 1 to gyoB step 1     if sheet1.cells(i,1)=sheet2.cells(ii,1) then flg=1 end if next if flg=0 then sheet3.cells(iii,1)=sheet1.cells(i,1) iii=iii+1 end if next

moooon
質問者

お礼

ありがとうございます。 できました。

すると、全ての回答が全文表示されます。
noname#8445
noname#8445
回答No.8

ごめんなさい #2の追加でした

すると、全ての回答が全文表示されます。
noname#8445
noname#8445
回答No.7

#4のところ 最後のnextの後ろに for i = 1 to gyoA step 1 flg=0 for ii = 1 to gyoB step 1     if sheet1.cells(i,1)=sheet2.cells(ii,1) then flg=1 end if next if flg=0 then sheet3.cells(iii,1)=sheet1.cells(i,1) iii=iii+1 end if next を追加してください

moooon
質問者

補足

やはり Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal がエラーになります。 「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」となります。

すると、全ての回答が全文表示されます。
noname#8445
noname#8445
回答No.6

やはりループでまわすしかないですね

すると、全ての回答が全文表示されます。
noname#8445
noname#8445
回答No.5

またまた  手打ちなものでまちがいが sheet()はsheetsに変更 for i = gyoA+gyoB to 1 step -1 は for i = gyoA+gyoB to 2 step -1 に変更してください。なお後者のマクロは SheetAの中のデータも重複を取ります

moooon
質問者

補足

なんどもありがとうございます。 変更をして実行したところ Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal がエラーになります。 また、この方法だと、AにありBにない。およびその逆の区別がつかないのでは?

すると、全ての回答が全文表示されます。
noname#8445
noname#8445
回答No.4

がんがん追加してしまってすいません dim gyoA as integer  'A最大値 dim gyoB as integer  'B最大値 gyoA=sheets(1).range("A1").end(xldown).row gyoB=sheet(2).range("A1").end(xldown).row sheets(1).range("A1:A"&gyoA).copy sheet(3).range("A1").pastespecial sheet(2).range("A1:A"&gyoB).copy sheet(3).range("A"&gyoA+1).pastespecial sheets(3).activate Columns("A:A").Select Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal for i = gyoA+gyoB to 1 step -1 if cells(i,1)=cells(i-1,1) then cells(i,1).delete shift:=xlup end if next が早いかな

すると、全ての回答が全文表示されます。
noname#8445
noname#8445
回答No.3

#1です 両方でしたね 変数を初期化して 全部をコピー、for・・・のみをひっくり返して追加すれば大丈夫です ちょっと時間がかかるのが難点 マクロだとそうなるのかな

すると、全ての回答が全文表示されます。
noname#8445
noname#8445
回答No.2

まず変数を持たせます dim gyoA as integer  'A最大値 dim gyoB as integer  'B最大値 dim i as integer 'ループ用 dim ii as integer 'ループ用 dim iii as integer '記入カウンタ dim flg '一致ものがあるかのフラグ iii=1 '記入開始行 gyoA=sheet1.range("A1").end(xldown).row gyoB=sheet2.range("A1").end(xldown).row for ii = 1 to gyoB step 1 flg=0 for i = 1 to gyoA step 1     if sheet1.cells(i,1)=sheet2.cells(ii,1) flg=1 end if next if flg=0 then sheet3.cells(iii,1)=sheet2.cells(ii,1) iii=iii+1 end if next でどうでしょうか

moooon
質問者

お礼

ありがとうございます。 if sheet1.cells(i,1)=sheet2.cells(ii,1)のあとにThenをつけて、片っ方はうまくいきました。

すると、全ての回答が全文表示されます。
noname#8445
noname#8445
回答No.1

sheetAとBの項目を教えてください。 あと完全一致かも教えてください

moooon
質問者

補足

項目はありません。一列目のみです。 両シートともA列3行目以下に途切れなく数値あるいは文字が入っています。 完全一致で調べたいです。 SheetAにありSheetBにない SheetBにありSheetAにないものを区別して抜き出したいのです。よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A