セルに背景色がある行を別シートにコピーする方法

このQ&Aのポイント
  • 質問内容は、ある一覧表の中のC列のセルに特定の条件が満たされている行を背景色付きで別のシートにコピーする方法についてです。
  • 質問者は、現在のコードでは処理時間が長いため、より効率的な方法を知りたいと述べています。
  • 4000件のデータで30分以上かかってしまい、スマートな方法を求めています。
回答を見る
  • ベストアンサー

セルに背景色がある行を別シートにコピー

ある一覧表があり、その中のC列のセルにある条件を満たしていれば背景色をつけています。 この色付セルがある行全体を別のシートに順次コピーして一覧表を作成させるマクロを以下のように作ってみました。 h = 6 For i = 7 To 最終行 If Worksheets("一覧表").Cells(i, "C").Interior.ColorIndex = 背景色番号 Then Sheets(1).Select Rows(i).Copy Sheets(2).Select h = h + 1 Rows(h).Select ActiveSheet.Paste End If Next データが少ないときはこれで問題がなかったのですが、件数が増えてきますと処理時間がかなり掛かります。4000件のデータで30分経っても終わりませんでした。 もっと処理時間が短くなるスマートな方法はありませんでしょうか?

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

以下のように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) だけでかまいません。

drymango
質問者

お礼

回答ありがとうごさいます。 教えていただいた記述で実行しますと、4000件のデータがものの1分で終了しました。 本当に助かりました。ありがとうございました。

drymango
質問者

補足

説明不足ですいません。 Sheets(1)とWorksheets("一覧表")は同じものです。

その他の回答 (3)

  • shut0325
  • ベストアンサー率40% (490/1207)
回答No.4

毎回シートを切り替えずに処理すれば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:'こちらに移動 ~以下略~

drymango
質問者

お礼

ご指摘ありがとうございます。 できるだけ第3者が見ても理解できるものをと心がけていますが、他のところに気をとられて不親切な記述になっていました。 merlionXXさんの記述に変更を加え、無事解決しました。 ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

>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

drymango
質問者

補足

説明不足ですいません。ある条件というのは特定のセルで判断するのではなく、その行の複数セルを判断してということですので、目で見て地道に色を付けています。 merlionXXさんの回答で解決しました。 ありがとうございました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

シート1と同じ行に同じ色を付けるという操作のように見られますね。それでしたらシート1の全体を選択してコピーし、シート2に書式のみを貼り付けることで良いように思いますね。

関連するQ&A

  • VBAで行をコピーして別のシートに貼付け

    いつもお世話になっております。 現場登録検索のシートの数値F2の値が 一覧シートにマッチする行を検索し その行を切り取り、終了現場に入力されている 最終行に貼付ける。と言うVBAを作りましたが、 "RangeクラスのSelectメソッドが失敗しました。" 下記が黄色になります。 Sheets("終了現場").Range("A1").Select 解決ができません。 アドバイスをお願い致します。 Private Sub CommandButton7_Click() '終了ボタン '終了行を一覧から探す Worksheets("現場登録検索").Range("F2").Select ActiveCell.FormulaR1C1 = "=MATCH(RC[-1],一覧!C[-5],0)" n = ActiveCell.Value 行 = n Worksheets("一覧").Rows(行).Copy Sheets("終了現場").Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub

  • エクセルで指定した行範囲を別のシートにコピーするには?

    (1)指定した行(数値)を変数として登録する方法 tx1 = Sheets("0").Range("A1") tx2 = Sheets("0").Range("A2") tx3 = Sheets("0").Range("A3") A1=2 A2=2000 A3=2500 (2)(1)で指定した変数を使用して行範囲を他のシートSheets(”1”)、Sheets("2”)にコピーペースト。 行(”2:1999”) ←tx1 : tx2-1(A2の数値から1を引いた数値) Rows(▲▲▲▲▲▲).Select Selection.Copy Sheets("1").Select Rows("1:1").Select ActiveSheet.Paste 行(”2000:2499”) ←tx2 : tx3-1(A3の数値から1を引いた数値) Range(▲▲▲▲▲▲).Select Selection.Copy Sheets("2").Select Rows("1:1").Select ActiveSheet.Paste ▲部分がエラーになってしまい、うまくいきません。 正しい方法を教えてください。

  • VBAでの背景色分岐後の結合セルの処理について

    VBAで対象範囲の背景色が黒の部分のみ"-"をいれるという処理をしたいのですが、ループがうまく動いておらず最初のセルのみ"-"が入った状態です。 ※対象範囲のセルは3列ずつ結合されています コードは以下になります。VBA初心者のため、初歩的な質問かもしれませんがご回答よろしくお願いいたします。 Private Sub CommandButton1_Click() Dim C As Range Sheets("sheet1").Select T33:BA74 の範囲を1セルずつ繰り返す For Each C In Range("T33:BA74") セルが黒のとき If C.Interior.ColorIndex = 1 Then C.Value = "-" end If '次のセルへ Next End Sub

  • Excelで条件にあったセルを検索して、行全体に色をつける方法

    こんにちは 初歩的な質問で大変恐縮なのですが、助けていただけませんでしょうか。 エクセルのシート上のG列4~120行に入っている数値を検索して、その値が条件を満たす場合にその行全体に色をつけたいと思い、以下のようなコードを書いてみたのですが、「型が一致しません」というエラーがでてしまいます。(色は一応つくのですが・・・) Sub TestMacro()  Dim i As Integer   For i = 4 To 120   If Sheets("aaa").Cells(i, "G").Value < 365 Then    Sheets("aaa").Rows(i).Select   Selection.Interior.ColorIndex = 7  End If Next i End Sub この原因は何なのでしょうか?教えてください。 宜しくお願いします。

  • VBA 最終行を選んだシートにコピーする。

    VBAど初心者です。どうしても最終行のデータを選んだシートにコピーできません。 LastRow.Selectのところで、止まってしまいます。どのように行を設定していいのかさっぱりわかりません。どなたか、ご指導のほどよろしくお願いします。 Sub copy_last_line() Dim LastRow As Long Sheets("Sheet1").Select LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow.Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A1").Select End Sub

  • エクセルマクロ 抽出したデータを別のシートへコピーしたい

    マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 【1】シート名「データ」をA列でオートフィルタ抽出して、別シートにコピーする。 【2】別シートにコピーしたデータに外枠罫線をつける。 【3】シート名「データ」には塗りつぶしがあるので、別シートにコピーされた塗りつぶしは「なし」する。 【4】シート名「Sheet1」の1~2行目をコピーし、別シートの1~2行目に挿入し、シート名「データ」に戻る。 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、今はコピーして「あ行」の部分を書き換えています。(かなり面倒です) 最終的には、抽出されたそれぞれのシートを別々のブックにしたいとも思っています。 長々とすみませんが、どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 Sheets("データ").Select Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="あ行", Operator:=xlAnd Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Copy Sheets("あ行").Select Range("A1").Select ActiveSheet.Paste Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With Cells.Select Selection.Interior.ColorIndex = xlNone Sheets("Sheet1").Select Rows("1:2").Select Selection.Copy Sheets("あ行").Activate Rows("1:1").Select Selection.Insert Shift:=xlDown Range("A1").Select Sheets("データ").Select Range("A1").Select

  • VBAで、ある文字の列を他のシートにコピーしたい時

    名称   /数量 /種類 りんご /1 /食べ物  自動車 /2 /乗り物 a /3 /アルファベット バナナ /4 /食べ物 消防車 /6 /乗り物 b /5 /アルファベット 上記の様な表で種類の列を基準に、「食べ物」のある行だけ集めて別のシートにコピーして、「乗り物」のある行だけ集めて別のシートにするということはできますか? 下記のように考えてみましたが上手くいきませんでした。 質問内容が上手く説明ができないため 分かりづらいかもしれませんが、 もし、お分かりになりましたら教えてください。 ------------------------------ Sub test2() Dim i As Long For i = 2 To 7 Select Case Cells(i, 3).Value Case "食べ物" Rows(i).Select Selection.Copy Sheets("食べ物").Select Rows(i).Select ActiveSheet.Paste Case "乗り物" Rows(i).Select Selection.Copy Sheets("乗り物").Select Rows(i).Select ActiveSheet.Paste Case Else Rows(i).Select Selection.Copy Sheets("その他").Select Rows(i).Select ActiveSheet.Paste End Select Next End Sub

  • エクセルグラフを別シートのグラフに連動させることはできますか?

    エクセルのグラフで教えてください。 下記のVBAを使って同じグラフを それぞれ別シートに作成しています。 VBAの3行目のActiveSheetはシート名(入力画面)を指します。 入力画面のセルで1または2を入力することで グラフの色が変わるようにしています。 そのグラフと同じものを別シート(印刷用画面)に作成したく 入力画面の入力で印刷用画面の入力も変わるようにしたつもりなのですが・・・ この方法だと、入力した際に 一瞬印刷用画面に移動して画面がちらついてしまいます。 このちらつきをなくしたいのですが なにかよい方法はありますでしょうか? よろしくお願いいたします。 Sub Sam1() Dim i, nColor As Integer ActiveSheet.ChartObjects("グラフ 8").Select i = 1 nColor = 2 '←「2」の時の色 If Cells(i, 13) = 1 Then nColor = 5 '←「1」の時の色 ActiveChart.SeriesCollection(1).Points(i).Interior.ColorIndex = nColor Sheets("印刷用画面").Select ActiveSheet.ChartObjects("グラフ 2").Select nColor = 2 '←「2」の時の色 If Sheets("入力画面").Cells(i, 13) = 1 Then nColor = 5 '←「1」の時の色 ActiveChart.SeriesCollection(1).Points(i).Interior.ColorIndex = nColor Sheets("入力画面").Select Range("H15").Select End Sub

  • Excel VBA(列全体のセルの処理)の質問です。

    Excel VBA(列全体のセルの処理)の質問です。 初心者です。 やりたいことは、一つの列(C列とします)の各セルに整数もしくは同一文字列がセットされています。行数は不定ですが、全行に渡って処理したい。 処理はセルが文字列なら何もしないで、次の行に移る。 数字なら、数字の大きさに従って背景色を変える(0,1-10,11-20とか)。 セルの書式は 標準 になっています。 行の選択は => Columns("C:C").Select 背景色指定はこんな感じかと思っています。 Dim delay As Long if delay = 0 Then ColorIndex = 10 Pattern = xlSolid ElseIf delay ... Then : Else : End If 列全体に渡って実行する方法、各セル値を取り出してやる方法がわかりません。 宜しく、お願いします。

  • エクセルマクロ 繰り返して、別のシートへコピーしたい

    エクセルマクロ 繰り返して、別のシートへコピーしたい マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、 どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 1行目から10行目まで繰り返したくて、 1行目から2行目のセルの移動の差は10行目までかわりません。 '1行目 Sheets("Sheet1").Select Range("B14:C14").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B15:C17").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False '2行目 Sheets("Sheet1").Select Range("B18:C18").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B19:C21").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B2").Select Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False

専門家に質問してみよう