機能と数式 | VBA | セミナー | オンラインソフト | お問い合わせ | その他
Top > Excel > VBA

すべて検索する



見つかったすべてのセルを選択状態にする


複数のセルを選択状態にするには、たとえば次のようにします。次のコードは、セル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するのではなく、

  1. 最初に見つかったセルを覚えておく
  2. 最初に見つかったセルを変数Targetに格納する

という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



検索で見つかった複数セルを選択状態にできれば、そのあとで文字の色を変えたり、塗りつぶしの色を設定したり、何ならそのままコピーすることもできます。








このエントリーをはてなブックマークに追加