すべてのセルを検索する流れは変わりません。
前ページの「見つかったすべてのセルを選択状態にする」では、見つかったセルを次々と変数Targetに格納しましたが、その代わりに、見つかったセルを次々と別のシートにコピーすればいいです。なお、ここでは、Sheet1のデータをSheet2にコピーするものとします。
Sub Sample7() Dim FoundCell As Range, FirstCell As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell 別シートにコピーする End If Do Set FoundCell = Cells.FindNext(FoundCell) If FoundCell.Address = FirstCell.Address Then Exit Do Else 別シートにコピーする End If Loop End Sub
これはもう、検索の話ではありませんね。セルのコピーを、どれだけ自在にプログラミングできるかにかかっています。まず、セルのコピーについておさらいしましょう。
下図のように、Sheet1のセル範囲A2:C2を、Sheet2のセルA2にコピーすることを考えます。
最もシンプルに考えれば、次のように書けます。
Sub Sample8() Sheets("Sheet1").Range("A2:C2").Copy Sheets("Sheet2").Range("A2") End Sub
ただし、コピー元である「Range("A2:C2")」は、検索の結果によって変わりますし、コピー先の「Range("A2")」も何件のデータをコピーしたかによって変化します。
Sub Sample8() 検索で見つかったセル.Copy Sheets("Sheet2").A列の最下行+1 End Sub
ということです。コピー元の「検索で見つかったセル」は、もう少し正確に言うと
検索で見つかったセルから、同じ行のC列までのセル範囲
ということですね。
こうしたセル範囲を特定するとき、検索で見つかったセルの行番号を調べて「Range("A" & 行番号 & ":C" & 行番号 」みたいに下品な方法はいただけません。やるなら「Range(Cells(行番号, 1), Cells(行番号, 3))」または「検索で見つかったセル.Resize(1, 3)」でしょう。ここでは、Resizeでやりましょうか。Resize(1, 3)の「3」を定数や変数に格納しておけば、リストの列が増えたときでも対応が簡単です。また、リストの列数を調べて、動的に変化させることも可能です。
Resizeプロパティというのは「ある大きさのセル範囲を、別の大きさに変更した」結果のセル範囲を返すプロパティです。たとえば、単一のセルというのは「1行×1列」の大きさと表せます。
セル範囲A4:C4は「1行×3列」ですね。
では、単一のセル(ここではセルA6)を「1行×3列」に引き延ばしたらどうでしょう。これは、セル範囲A6:C6と同じことですね。
Resizeプロパティの書式は次の通りです。
元のセル範囲.Resize(新しい行数, 新しい列数)
セルA6を「1行×3列」に変更するには
Range("A6").Resize(1, 3)
となります。
Resizeプロパティの働きを理解したところで、実際の処理を考えてみましょう。
検索で見つかるのは、A列の単一セルです。コピーしたいセル範囲は、その見つかったセルの大きさを「1行×3列」に変更したセル範囲になります。つまり「検索で見つかったセル.Resize(1, 3)」です。
処理の流れは次の通りです。
Sub Sample7() Dim FoundCell As Range, FirstCell As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell 別シートにコピーする End If Do Set FoundCell = Cells.FindNext(FoundCell) If FoundCell.Address = FirstCell.Address Then Exit Do Else 別シートにコピーする End If Loop End Sub
とりあえず、コピー元は確定しましたね。
Sub Sample7() Dim FoundCell As Range, FirstCell As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell FoundCell.Resize(1, 3).Copy コピー先 End If Do Set FoundCell = Cells.FindNext(FoundCell) If FoundCell.Address = FirstCell.Address Then Exit Do Else FoundCell.Resize(1, 3).Copy コピー先 End If Loop End Sub
では、コピー先はどうしましょう。コピー先は、Sheet2の「最終セルの1つ下のセル」ですね。これを取得する方法は、下記コンテンツで詳しく解説していますので、そちらをご覧ください。
ということで、次のような感じですね。
Sub Sample7() Dim FoundCell As Range, FirstCell As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell FoundCell.Resize(1, 3).Copy Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Do Set FoundCell = Cells.FindNext(FoundCell) If FoundCell.Address = FirstCell.Address Then Exit Do Else FoundCell.Resize(1, 3).Copy Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Loop End Sub
見つかったセルのアドレスをUserFormで表示する >> 次ページ