複数のセルを選択状態にするには、たとえば次のようにします。次のコードは、セルA1とセルB3を選択状態にします。
Sub Sample3() Range("A1,B3").Select End Sub
このように、選択したいセルのアドレスをカンマで区切って指定すればいいのですが、この方法だとセルのアドアレスが255文字を超えるとエラーになります。詳しくは、下記ページをご覧ください。
検索の結果、非常に多くのセルが見つかったとき、エラーになるかもしれませんので、こんなときはUnionメソッドを使うと安全です。ApplicationオブジェクトのUnionメソッドは、引数で指定した連続していない複数セルの集合を返します。Unionメソッドの働きをイメージするために、簡単な例を紹介しましょう。
上記のコードを、Unionメソッドを使うと、次のように書けます。
Sub Sample4() Dim Target As Range Set Target = Union(Range("A1"), Range("B3")) Target.Select End Sub
Unionメソッドは、Range("A1")とRange("B3")という、連続していない複数セルを返します。手動操作で、Ctrlキーを押しながらセルを選択するようなものです。では、次のコードをご覧ください。
Sub Sample5() Dim Target As Range Set Target = Union(Range("A1"), Range("B3")) ''(1) Set Target = Union(Target, Range("C5")) ''(2) Target.Select End Sub
Unionメソッドは、引数で指定した複数のセルを、合体させたセルの集合を返します。(1)では、Unionメソッドによって、「セルA1」と「セルB3」を合体させた(Ctrlキーを押しながら選択した)セルの集合を返しました。それを変数Targetに入れています。そして、(2)では、その変数Targetと、セルC5を合体させて、また変数Targetに格納します。その結果、変数Targetでは「セルA1」「セルB3」「セルC5」と3つのセルを合体されていることになります。このように、
Set Target = Union(Target, 新しいセル)
を繰り返せば、次々に新しいセルを変数Targetに格納できるわけです。ここでは、検索して見つかったセルを変数Targetに格納しますので、
Set Target = Union(Target, 検索で見つかったセル)
ということになります。
では、実際のマクロを作っていきましょう。
最初に検索するところは、前ページに書いた通りです。ただし、見つかったセルをすぐActivateするのではなく、
という2つの処理を行います。最初に見つかったセルは、変数FirstCellに格納することにしましょう。
Sub Sample6() Dim FoundCell As Range, FirstCell As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell Set Target = FoundCell End If End Sub
続いて、本コンテンツのテーマであるFindNextメソッドを使って、2つめ以降のセルを検索します。いくつのセルが見つかるか分かりませんので、Do Loopステートメントで繰り返します。
Sub Sample6() Dim FoundCell As Range, FirstCell As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell Set Target = FoundCell End If Do Set FoundCell = Cells.FindNext(前回見つかったセル) もし、新しく見つかったセル が 最初に見つかったセル だったら Do Loop を抜ける そうでなかったら 変数Targetに 新しく見つかったセルを合体させる Loop End Sub
分かるところから、コード化していきましょう。もし○○だったら~は、言うまでもなくIfステートメントですね。また「新しく見つかったセル」とは、FindNextメソッドの結果を格納した変数FoundCellです。「最初に見つかったセル」は、確か変数FirstCellに入れていましたね。ただし、
Sub Sample6() Dim FoundCell As Range, FirstCell As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell Set Target = FoundCell End If Do Set FoundCell = Cells.FindNext(前回見つかったセル) If FoundCell = FirstCell Then Do Loop を抜ける Else 変数Targetに 新しく見つかったセルを合体させる End If Loop End Sub
のように「FoundCell = FirstCell」としてはいけません。これはValueプロパティが省略されていますので、実際は「FoundCell.Value = FirstCell.Value」という意味になります。Valueプロパティは、セルに入力されているデータですから、この場合は必ず"田中"になります。だって、"田中"を探して見つかったセルなのですから。なのでここは、次のようにセルのアドレスで比較しなければなりません。
Sub Sample6() Dim FoundCell As Range, FirstCell As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell Set Target = FoundCell End If Do Set FoundCell = Cells.FindNext(前回見つかったセル) If FoundCell.Address = FirstCell.Address Then Do Loop を抜ける Else 変数Targetに 新しく見つかったセルを合体させる End If Loop End Sub
「Do Loopを抜ける」には、Exit Doを使います。「変数Targetに 新しく見つかったセルを合体させる」のは、さっき解説した
Set Target = Union(Target, 検索で見つかったセル)
です。「検索で見つかったセル」は、変数FoundCellに格納されています。「前回見つかったセル」も同じ変数FoundCellですね。
Sub Sample6() Dim FoundCell As Range, FirstCell As Range, Target As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell Set Target = FoundCell End If Do Set FoundCell = Cells.FindNext(FoundCell) If FoundCell.Address = FirstCell.Address Then Exit Do Else Set Target = Union(Target, FoundCell) End If Loop End Sub
最後に、検索で見つかったすべてのセルが格納されている変数Targetを選択状態にすれば完了です。ついでに、いくつのセルが見つかったかも表示しておきましょう。
Sub Sample6() Dim FoundCell As Range, FirstCell As Range, Target As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Exit Sub Else Set FirstCell = FoundCell Set Target = FoundCell End If Do Set FoundCell = Cells.FindNext(FoundCell) If FoundCell.Address = FirstCell.Address Then Exit Do Else Set Target = Union(Target, FoundCell) End If Loop Target.Select MsgBox Target.Count & "件見つかりました" End Sub
検索で見つかった複数セルを選択状態にできれば、そのあとで文字の色を変えたり、塗りつぶしの色を設定したり、何ならそのままコピーすることもできます。