- ベストアンサー
セルに背景色がある行を別シートにコピーする方法
- 質問内容は、ある一覧表の中のC列のセルに特定の条件が満たされている行を背景色付きで別のシートにコピーする方法についてです。
- 質問者は、現在のコードでは処理時間が長いため、より効率的な方法を知りたいと述べています。
- 4000件のデータで30分以上かかってしまい、スマートな方法を求めています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
以下のようにSelectするのをやめ、Application.ScreenUpdating = Falseで画面の更新を一時停止するだけで飛躍的に早くなります。 h = 6 Application.ScreenUpdating = False With Worksheets("一覧表") For i = 7 To 最終行 If .Cells(i, "C").Interior.ColorIndex = 背景色番号 Then h = h + 1 Sheets(1).Rows(i).Copy Sheets(2).Rows(h) End If Next i End With Sheets(2).Activate Application.ScreenUpdating = True もしSheets(1)とWorksheets("一覧表")が別物なら ところでSheets(1)はWorksheets("一覧表")のことでしょうか? そうであれば Sheets(1).Rows(i).Copy Sheets(2).Rows(h) は .Rows(i).Copy Sheets(2).Rows(h) だけでかまいません。
その他の回答 (3)
- shut0325
- ベストアンサー率40% (490/1207)
毎回シートを切り替えずに処理すれば4000行程度なら即座に終わるかと思います。 これはmerlionXXさんが書かれているコードに変更すればよいですが、7行目から開始するのにh=6 とし i=7~~ となっているのは間違いの元になりやすそうでちょっと怖いしスマートじゃない気がします。細かいことですが、他の人や自分でも後からコードを参照する場合に理解しづらくなりますので。 なので下記のように修正されることをお勧めします。 Const StartRow As Integer = 7:'処理開始行 Const EndRow As Integer = 最終行:'処理終了行 h = StartRow ~中略~ For i = StartRow To EndRow ~中略~ 'h=h+1を削除 Sheets(1).Rows(i).Copy Sheets(2).Rows(h) h=h+1:'こちらに移動 ~以下略~
お礼
ご指摘ありがとうございます。 できるだけ第3者が見ても理解できるものをと心がけていますが、他のところに気をとられて不親切な記述になっていました。 merlionXXさんの記述に変更を加え、無事解決しました。 ありがとうございました。
- keithin
- ベストアンサー率66% (5278/7941)
>C列のセルにある条件を満たしていれば背景色をつけています。 C列を「その条件」でオートフィルタを使って絞り込み,いちどにコピーしてしまいます。 with worksheets("一覧表") .range("A6:Z" & .range("C65536").end(xlup).row).autofilter field:=3, criteria1:=">100" .autofilter.range.copy destination:=worksheets("Sheet2").range("A6") .autofiltermode = false end with
補足
説明不足ですいません。ある条件というのは特定のセルで判断するのではなく、その行の複数セルを判断してということですので、目で見て地道に色を付けています。 merlionXXさんの回答で解決しました。 ありがとうございました。
- KURUMITO
- ベストアンサー率42% (1835/4283)
シート1と同じ行に同じ色を付けるという操作のように見られますね。それでしたらシート1の全体を選択してコピーし、シート2に書式のみを貼り付けることで良いように思いますね。
お礼
回答ありがとうごさいます。 教えていただいた記述で実行しますと、4000件のデータがものの1分で終了しました。 本当に助かりました。ありがとうございました。
補足
説明不足ですいません。 Sheets(1)とWorksheets("一覧表")は同じものです。