下記のような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
No.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度目に出てくる行)を削除していいのか、後から出てくる行を残し、最初に出てきた行を削除するのか、もっと違った処理をするのかなどを考えた処理をするのが、普通のやり方だと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) VBA リスト表示していますが 3 2023/05/18 12:12
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Excel(エクセル) VBAのエラーが直せません 4 2023/06/12 22:10
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) VBA For Each 〜 複数条件について 3 2022/10/20 20:05
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで1列に500行並んだデ...
-
Countifよりも早く重複数をカウ...
-
Excelで2行単位のソートの出来...
-
エクセルで日付から日にちを削...
-
excel:別シートの値を飛び飛び...
-
VBA 大きなtxtテキストファ...
-
複数の条件に合う行番号を取得...
-
エクセルVBA C列に特定の文字列...
-
VBA 数式を最終行までコピー
-
Excelで社員の本名をニックネー...
-
エクセルで、重複データを除外...
-
【Excel】フィルタの実行で重複...
-
エクセルでデータの重複削除方法
-
Excelの30個ずつの平均値の出し方
-
エクセルで特定の列を素早く出...
-
エクセルの複数のセルを一括で...
-
EXCELで○ヶ月を○年○ヶ月に変換...
-
A1セルに入力したら、入力時間...
-
Excelの入力規則で2列表示したい
-
エクセルで勝手に表示された打...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで日付から日にちを削...
-
Excelで2行単位のソートの出来...
-
エクセルで1列に500行並んだデ...
-
excel:別シートの値を飛び飛び...
-
複数の条件に合う行番号を取得...
-
エクセルで、重複データを除外...
-
Excelの30個ずつの平均値の出し方
-
Countifよりも早く重複数をカウ...
-
VBA 数式を最終行までコピー
-
エクセルVBA C列に特定の文字列...
-
500行の中から、多い順に抽出す...
-
エクセル2016にて、行挿入&コピ...
-
エクセルで横並びの複数データ...
-
エクセル~空白のセルのある行...
-
Excelで2つのデータの突合せを...
-
エクセルで時刻だけを抜き出す...
-
エクセルで重複データを削除す...
-
【Excel】小計単位で並べ替えを...
-
本日の日付を超えているものを...
-
エクセルで1つの会社名に対して...
おすすめ情報
Sheet4にSheet1のデータが全て表示されてしまいます。なぜでしようか