- ベストアンサー
excellVBAで、シートからデータを移す方法
- excellVBAを使用して、複数のシートからデータが被らないようにしてコピーする方法を探しています。
- 現在の方法では効率が悪く感じており、より良い方法を教えていただきたいです。
- データの入っている列は共通で5列で固定されており、行数はシートによって異なります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
シートDに全てのシートのデータを結合した表(重複を含む)を作成した後、フィルタで重複を非表示すると効率が良いように思えます。 非表示でも重複データが存在する事がNGなら表示データだけコピーして別なシートに貼り付ければ良いでしょう。 #以下のコードはサンプルですのでエラー処理を行っていません。 Sub Sample() Dim nLast With Sheets("SheetD") 'SheetDの項目名 .Range("A1:C1") = Sheets("SheetA").Range("A1:C1").Value '各シートからデータをコピー Call fCopyData("SheetA") Call fCopyData("SheetB") Call fCopyData("SheetC") '重複を非表示 nLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1 .Range("A1:C" & nLast).AdvancedFilter Action:=xlFilterInPlace, Unique:=True End With End Sub Sub fCopyData(aSheetName As String) Dim vData, nLast '指定シートのデータをコピー With Sheets(aSheetName) If .Range("A2") = "" Then Exit Sub .Range(.Range("A2"), .Range("C2").End(xlDown)).Copy End With 'SheetDの最終行に貼り付け With Sheets("SheetD") nLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1 .Cells(nLast, 1).PasteSpecial Paste:=xlPasteValues .Cells(nLast, 1).PasteSpecial Paste:=xlPasteFormats End With End Sub
その他の回答 (4)
- merlionXX
- ベストアンサー率48% (1930/4007)
一例です。 作業シートにすべて貼り付ける。 エクセルのフィルタオプションを利用して重複を非表示に。 可視セルのみをシートDに貼り付け。 作業シートを削除。 というコードです。 Sub test01() Dim ws(2) As Worksheet '変数宣言 Set ws(0) = Worksheets.Add '作業シート追加 Set ws(1) = Sheets("D") For Each ws(2) In Sheets(Array("A", "B", "C")) '各シートコピー ws(2).Range("A1", ws(2).Cells(Rows.Count, "C").End(xlUp)).Copy ws(0).Cells(Rows.Count, 1).End(xlUp).Offset(1) Next ws(1) With ws(0) '作業シートに貼り付けし重複削除してシートDに貼り付け .Range("A2").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, Unique:=True .Range("A2").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy ws(1).Range("A1") Application.DisplayAlerts = False .Delete '作業シート削除 Application.DisplayAlerts = True End With End Sub
- Siegrune
- ベストアンサー率35% (316/895)
EXCEL2007ならデータの中に、重複の削除機能があるから、 シートAからシートCまで全部シートDへコピーして、 重複の削除1回で終わりです。 (マクロの記録しておけば、VBAの記述も分かると思います。) ただし、EXCEL2003にはこの機能がありません。
- mu2011
- ベストアンサー率38% (1910/4994)
一案です。 (1)行データを連結(区切り文字あり)、それをキーに連想配列を作成(重複分を吸収) (2)連想配列からキーを取り出し、Splitで再配列してDシートにコピー
シートAで配列を作る、「りんご=A1」「バナナ=A2」・・・ シートBをその配列の中を巡回する、あれば捨てて、無ければ新規にA6とかつくる。 最後にシートDに入れて、終わり。