エクセル VBA 入門 Find Findnext

      2016/05/03


Findは検索するのに使います。

サンプルソース
Sub start()

With Worksheets(1).Range("a1:b500")

Dim c As Range

Set c = .Find("こんにちわ")

Row = Cells.Find("こんにちわ").Row
Column = Cells.Find("こんにちわ").Column
MsgBox "こんにちわ" + "(" + CStr(Row) + "," + CStr(Column) + ")"

End With

End Sub

実行結果
(5,2)


実行結果はこんにちわと入力したセルが表示されます。
withは定義することによりend withまでの間省略して.から書けます。
findは最初のひとつしか検索できません。

findnextを使います。

サンプルソース
Sub start()
Dim ad As String
With Worksheets(1).Range("a2:b500")
Dim buf As String
Dim Count As Integer
Dim c As Range

buf = Range("A1")

Set c = .Find(buf, LookIn:=xlValues)

Row = Cells.Find(buf).Row
Column = Cells.Find(buf).Column
MsgBox buf + "(" + CStr(Row) + "," + CStr(Column) + ")"

If Not c Is Nothing Then
ad = c.Address

Do
Set c = .FindNext(c)
Count = Count + 1

Loop While Not c Is Nothing And c.Address ad
End If
For i = 1 To Count - 1

Row = .FindNext(c).Row
Column = .FindNext(c).Column
MsgBox buf + "(" + CStr(Row) + "," + CStr(Column) + ")"
Set c = .FindNext(c)
Next

End With

End Sub

実行結果はA1で指定した条件の文字列を検索して複数の座標を表示します。

プログラムを少し解説します。
bufで文字列を取得してxlValuesで検索対象の値を指定してます。
RowとColumnで座標を取得してます。
最初はfindで一回目は表示します。
findnextは一回目は今回は使いません。
実はfindnextでもいいのですが一回飛ばして二番目に表示され
順番が最初に検索で表示して欲しいのが最後に表示されるので使いません。
do loopの中に書くと最後の表示もされてしまうのでカウントして回数を取得して
後でループを回すことにしました。
do loopは最後一回多く回るのでforのカウントをひとつ引いています。
もっときれいな書き方がありそうですがとりあえずこんな感じですかね。




PR



 - Excel入門 , ,

Translate »