パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

表の特定の行を抜きだし各シートに分割する

(準備中)

EXCELの表からある1行を抜きだし、別シートにコピーしたい、という作業は比較的よくあるパターン
なので、その作業を行うVBAスクリプトのサンプル。

例として、以下のような表(2021年有馬記念のレース結果)から、着順が赤色の表示になっている行を
抜き出してそれぞれ別シートにコピーする、という作業をやってみます。



1着のエフフォーリアは着順が赤色表示なので、この行は抜きだし対象です。
この行を抜き出して以下のように1枚のシートにコピーし、シート名を馬名にします。


以下、着順が赤色のディープポンド、クロノジェネシス・・を同様に抜き出して1枚のシートにコピーしていきます。

では、この作業のVBAの例を2つ示します。

サンプル1

Sub copy2sheet()
For i = 3 To 18
If Worksheets("data").Cells(i, 1).Font.Color = RGB(255, 0, 0) Then Worksheets.Add Else GoTo skip1: '・・・@
For j = 1 To 13
Sheets(1).Cells(1, j) = Worksheets("data").Cells(1, j).Value '・・・A
Sheets(1).Cells(2, j) = Worksheets("data").Cells(2, j).Value '・・・B
Sheets(1).Cells(3, j).NumberFormat = Worksheets("data").Cells(i, j).NumberFormat '・・・C
Sheets(1).Cells(3, j) = Worksheets("data").Cells(i, j).Value '・・・D
Next j
Sheets(1).Name = Worksheets("data").Cells(i, 3).Value '・・・E
skip1:
Next i

End Sub


@の行
If Worksheets("data").Cells(i, 1).Font.Color = RGB(255, 0, 0)
ワークシート"data"の1列目(着順の列)の文字の色が赤だったら、以下の処理をするようにしている。

Then Worksheets.Add Else GoTo skip1:
ワークシートを新規に追加する。
新規に追加されたシートは1番最初のシートになるので、以降 Sheets(1) としてアクセス可能。

Forループの中で
Aは1行目を新しいシートにコピーしている。
Bは2行目を新しいシートにコピー。
Cは抜き出す行のセルのフォーマットをコピーしている。これを行わないと表示が崩れるケースがある。
例えばタイムの列の表示などがそうである。タイムの列のセルは時刻表示になるようにセルのフォーマットが
されているので、普通の数値表示にすると表示が崩れてしまう。
Dは抜き出す行の値を新しいシートにコピーしている。
E新しいシートの名前を馬名にする。

なお、フォントの色はコピーしていないので、着順の色は標準色(黒)になってしまっています。
文字色やNumberFormatの説明等はセル関連基本マクロpart2にあります。

サンプル2
上記のサンプル1はForループを駆使して1つ1つのセルを順番にコピーしていましたので、動作は目で追える程度に
ノロいです。
そこでCopyメソッドを使って高速化したのがこのサンプル2
結果はサンプル1と同じですが、サンプル1と区別がつくように、新しいシート名は"馬名"+"2"になるようにしています。
また、Copyメソッドを使った場合は、セルのフォーマット情報も、フォントの色の情報も全てコピーされるので、
着順の文字色は赤になります。


Sub copy2sheet2()
For i = 3 To 18
If Worksheets("data").Cells(i, 1).Font.Color = RGB(255, 0, 0) Then Worksheets.Add Else GoTo skip1:
Worksheets("data").Range("A1:M2").Copy Destination:=Worksheets(1).Range("A1:M2") '・・・F
Worksheets("data").Rows(i).Copy Destination:=Worksheets(1).Rows(3) '・・・G
Sheets(1).Name = Worksheets("data").Cells(i, 3).Value + "2"
skip1:
Next i
End Sub


F,G
サンプル1では、For j = 1 to 13 のループの中で行っていたA,B、C、Dの作業を
この2行で完了しています。

こちらのほうが圧倒的にスピードは速いです。

Copyメソッドの説明はセル関連基本マクロpart2にあります。

TopPage > Visual BasIc&EXCEL活用研究目次