あなたの「必」の書き順を教えてください

下記のようなsheet1~5のsheetがあって、コピペをして重複の削除したデータを最後にはsheet5にコピペしたいのですが、どのように、マクロを組んだらよいか、お教え頂けませんか。具体的には、下記に示すようなことをしたいのです。
 更に、失礼とは思いますが、この2つのことを一緒にしたいのですが、どのように考えられますでしょうか。
 初心者で勉強中なのですが、お教え頂けると幸いに存じます。(ネットを見てなってみました)

sheet1  A3:A500
sheet2  A2:A100
sheet3  A2:A500  A501:A600 重複を削除したら500件ほどになる予定
sheet4  C2:C500
sheet5  C3:C400



Sub Sample3()

sheet1のデータをsheet3にコピペする
sheet2のデータをsheet3にコピペする


Worksheets("Sheet1").Range("A3:A500").Copy Worksheets("Sheet3").Range("A2:A500")
Worksheets("Sheet2").Range("A2:A100").Copy Worksheets("Sheet3").Range("A501:A600")

End Sub

Sub Sample1() 重複データの削除及びコピー貼り付け

sheet3の重複データの削除をする (重複を削除したら500件ほどになる予定)

  Range(Cells(3, 2), Cells(16, 2)).RemoveDuplicates _
 Columns:=Array(1), Header:=xlYes

  sheet3の重複データの削除したものをsheet4にコピペする (重複を削除したら500件ほどになる予定)


  sheet4のデータをsheet5にコピペする

  Worksheets("Sheet3").Range("A2:A500").Copy Worksheets("Sheet4").Range("A2:A500")
  Worksheets("Sheet4").Range("C2:C500").Copy Worksheets("Sheet5").Range("C3:C500")

End Sub

質問者からの補足コメント

  • どう思う?

    Sheet4にSheet1のデータが全て表示されてしまいます。なぜでしようか

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/01/16 19:57

A 回答 (1件)

質問は、以下のようなことでしょうか。


~~~~~~~~~~~~~~~~~~
Sheet1~5のSheetがあって、"Sheet1"の"A3:A500"と "Sheet2"の"A2:A100"とで、重複した値のある行を除外し、除外の後のA列にユニークな値のある行の全列のデータを、["Sheet1"の"A3:A500"、"Sheet2"の"A2:A100"]の並び順で、"Sheet4"の2行目から下に並べたい。
また、そうして"Sheet4"に出来ているデータの中で[C列の値のみ]を、"Sheet5"のC列にも貼り付けたい。 ("Sheet3"には、なにもなくても構わない)
なお、"Sheet1"の3行目、"Sheet2"の2行目は見出し行ではなく、実質のデータがある。
また、"Sheet1"と"Sheet2"のセルには、計算式はなく、全て文字や数値であるか、現状で表示されている値をそのまま"Sheet4"や"Sheet5"に文字や数値として貼り付けられていればそれで良い。(書式も気にしない)
~~~~~~~~~~~~~~~~~~
希望を、以下のように変更しても構いませんか。
~~~  ~~~  ~~~  ~~~
Sheet1には、3行目から下に大量のデータがある(行数は不明)
Sheet2にも、2行目から下にある程度の量のデータがある(行数は不明)
Sheet4に、Sheet1とSheet2の全データの値を転記する。
ただし、転記したデータのA列の値に、後続の行のA列に同じものがある場合は、後続の行そのものを削除する(転記しないのと同じ。結果として、Sheet4のA列には同じ値の行はない)
Sheet5のC列に、Sheet4のC列のデータを転記する
~~~  ~~~  ~~~  ~~~

上でも構わなければ、次のマクロで出来ます。

Sub sample()

e1 = Sheets("Sheet1").UsedRange.Row
e2 = Sheets("Sheet2").UsedRange.Row

Set sht1L = Sheets("Sheet1").Range("A1").SpecialCells(xlCellTypeLastCell)
Set sht2L = Sheets("Sheet2").Range("A1").SpecialCells(xlCellTypeLastCell)
Set sht4 = Sheets("Sheet4")
Set sht5 = Sheets("Sheet5")

saki = Range(Sheets("Sheet1").Range("A3"), sht1L).Value
atto = Range(Sheets("Sheet2").Range("A2"), sht2L).Value

sakiD = UBound(saki)
sakiR = UBound(saki, 2)
attoD = UBound(atto)
attoR = UBound(atto, 2)
migi = -(sakiR > attoR) * sakiD - (akiR <= attoR) * attoR

Range(sht4.Cells(3, 1), sht4.Cells(sakiD + 2, sakiR)).Value = _
saki

Range(sht4.Cells(sakiD + 3, 1), sht4.Cells(sakiD + 2 + attoD, attoR)).Value = _
atto

Range(sht4.Cells(3, 1), sht4.Cells(sakiD + 2 + attoD, migi)).RemoveDuplicates _
Columns:=1, Header:=xlNo

Range(sht5.Cells(3, 3), sht5.Cells(sakiD + 2 + attoD, 3)).Value = _
Range(sht4.Cells(3, 3), sht4.Cells(sakiD + 2 + attoD, 3)).Value

End Sub

上のようなやり方でなくても、やり方はいくらでもあります。
初心とのことなので少し説明すると、
コピー命令ではなくて、=で、右側の値を、左側に入れることが出来ます。
計算式は使わないで見えているセルの値を、=の右から左に入れるのは、
 ○○.value = ▽▽.value です。 ○○と▽▽は、縦横の大きさが同じ範囲です。
範囲を指定するとき、アクティブなシートでないのを扱う可能性がある場合には、
Worksheets("Sheet1").Range("A2:A500") とするのではなく、
Range(Worksheets("Sheet1").Cells(2,1),Worksheets("Sheet1").Cells(500,1)) とした方がいいです。
Range(Sheets("Sheet1").Cells(2,1),Sheets("Sheet1").Cells(500,1)) の方が短くて済みます。
なお、Range("A2:A500")と、Range(Cells(2,1),Cells(500,1)) は同じです。
マクロを使うときには、Cells(2,1) 2行目の1列目のセル という書き方に慣れた方が良いです。
というのは、何行目、何列目を、コードを書き換えないで、状況に応じて指定するのには、位置の値で指定することが多いからです。

また、通常は = の左と右とは、同じ大きさの行と列の範囲をしています。
通常は 行の数が違う処理のコードは あまり書きません。
Worksheets("Sheet1").Range("A3:A500").Copy Worksheets("Sheet3").Range("A2:A500")

なお、
Worksheets("Sheet1").Range("A3:A500") のような書き方
Range(Sheets("Sheet1").Cells(3,1),Sheets("Sheet1").Cells(500,1)) のような書き方
これらの書き方をすることが多い場合には、コードが見にくいので、
Set Sht1 = Sheets("Sheet1") と一度しておけば、
Range(Sht1.Cells(3,1),Sht1.Cells(500,1)) と短く書けて、見やすくなります。

Set sht1L = Sheets("Sheet1").Range("A1").SpecialCells(xlCellTypeLastCell)
これは、"Sheet1"の使用している一番下のセルの位置で一番右のセルの位置に当たる(そのシートで使っているセルのある範囲の一番右下)のセルを、sht1L という名前で使うためのものです。

saki = Range(Sheets("Sheet1").Range("A3"), sht1L).Value
これは、"Sheet1"のA3を左上隅、sht1Lを右下隅としている縦横の範囲を saki という配列変数の中に記憶させる命令です。
sakiD = UBound(saki)   sakiの配列の縦の行数をsakiDという名前で記憶する命令です。
sakiR = UBound(saki, 2)  sakiの配列の横の列数をsakiRという名前で記憶する命令です。
Sheet1とSheet2から転記するデータのあるところの行数をこれらのコードで取得します。
この行数は、Sheet4の転記先の位置を指定するときにも使います。

空白のセル範囲を指定するのも出来るだけ避けて、必要な範囲だけを処理するようにします。
そのために、どこにデータが入っているのかを調べて処理します。

Range(sht4.Cells(3, 1), sht4.Cells(sakiD + 2, sakiR)).Value = _
saki
Range(sht4.Cells(sakiD + 3, 1), sht4.Cells(sakiD + 2 + attoD, attoR)).Value = _
atto
最初にSheet1のデータを転記し、続く行の下にSheet2のデータを転記しています。

migi = -(sakiR > attoR) * sakiD - (akiR <= attoR) * attoR
これは、Sheet1とSheet2で使用している列の数が違う場合を考えて、列数の多い方の列数をmigiとしています。

Range(sht4.Cells(3, 1), sht4.Cells(sakiD + 2 + attoD, migi)).RemoveDuplicates _
Columns:=1, Header:=xlNo
Sheet4の3行目からデータがあるとして、A列のデータが同じもの(同じデータが2度目に出てくる行)を削除する命令です。 EXCEL2007以降で使える命令です。
A列にIDなどがあるときに使えますが、本当にA列のデータが同じもの(同じデータが2度目に出てくる行)を削除していいのか、後から出てくる行を残し、最初に出てきた行を削除するのか、もっと違った処理をするのかなどを考えた処理をするのが、普通のやり方だと思います。
この回答への補足あり
    • good
    • 1
この回答へのお礼

色々と勉強になりました。今後ともよろしくお願いします。自分でもどしどしやってみます。

お礼日時:2019/01/16 21:07

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


おすすめ情報