BizFAQ-ビズファック

仕事・ビジネスにおけるちょっと困ったこと、わからないことをズバリ解決お悩み解決サイトです。

  • TOP
  • 副業解禁時代の年収1000万円戦略
  • Excel
  • Word
  • PowerPoint
  • サイトマップ

VBAで検索(Find)する!VBAにおけるFindメソッドを解説

2015年4月1日 by Gen

VBA_Find_2

VBAで「検索」を実装しようとした場合結構大変な作業になりますが、Excelの「検索」機能を使えば簡単に実装できます。

Excelの「検索」機能はFindメソッドでアクセスできます。FindメソッドをVBAで扱うと結構癖が強いですが、全部パターン化させてしまいましょう。



目次

  • VBAでFindを実装する
    • 1.Findメソッドとは
    • 2.サンプルを作ろう
      • Sub sumple1() Dim FirstCell As Range Dim TargetCell As Range Set TargetCell = Cells.Find(“Hello”) Set FirstCell = TargetCell Do If TargetCell Is Nothing Then Exit Do Else TargetCell.Activate Set TargetCell = Cells.Find(“Hello”, TargetCell) MsgBox “次のセルに移ります” End If Loop While Not (FirstCell.Address = TargetCell.Address) End Sub
    • 3.応用してみよう
      • Sub sumple2() Dim FirstCell As Range Dim TargetCell As Range Dim Result As String Set TargetCell = Cells.Find(“Hello”) Set FirstCell = TargetCell Do If TargetCell Is Nothing Then Exit Do Else Result = Result & vbNewLine & TargetCell.Address(False, False) Set TargetCell = Cells.Find(“Hello”, TargetCell) End If Loop While Not (FirstCell.Address = TargetCell.Address) If TargetCell Is Nothing Then MsgBox “見つかりませんでした” Else MsgBox Result End If End Sub

VBAでFindを実装する

VBAのFindは、オブジェクトの知識とDo Loop、Do Whileの知識を組み合わせて実装するのが一番簡潔なので今回はそれを紹介します。

核の部分は変わらず、条件判断の記述などでいくつかパターンがあるので、今回紹介した方法以外でも試してみてください。

1.Findメソッドとは

Findメソッドは多数の引数を持っていますが、重要な引数はRange.Find(What, [After])だけです。見つかったセルをRange型として返し、見つからない場合はNothingを返します。
What は文字列型で検索対象の文字列を指定します。
After はRange型で指定されたセルより、後ろ側のセルを検索します。

ひとまずVBAでサンプルを作ってみましょう。

2.サンプルを作ろう

サンプルデータを入力しました。

VBA_Find_1

Sub sumple1()
Dim FirstCell As Range
Dim TargetCell As Range

Set TargetCell = Cells.Find(“Hello”)
Set FirstCell = TargetCell
Do
If TargetCell Is Nothing Then
Exit Do
Else
TargetCell.Activate
Set TargetCell = Cells.Find(“Hello”, TargetCell)

MsgBox “次のセルに移ります”
End If
Loop While Not (FirstCell.Address = TargetCell.Address)
End Sub

まずセル全体から”Hello”を検索し、最初に見つかったセルを代入します。その後TargetCellより後で見つかったセルでTargetCellを上書きしています。

Msgboxは動きを見やすくするために入れました。コメントアウトすると一瞬で終わってしまいます。

Findは一番最後のセルを検索した後、ループして一番最初のセルを返すようになります。While処理をないと無限ループに陥りますので注意してください。

実行した画像がこちらになります。

VBA_Find_2

3.応用してみよう

先程の例は順番に選択するだけでしたが、次はセルのアドレスを全部つなげて出力してみたいと思います。
VBAのコードは以下になります。

Sub sumple2()
Dim FirstCell As Range
Dim TargetCell As Range
Dim Result As String

Set TargetCell = Cells.Find(“Hello”)
Set FirstCell = TargetCell
Do
If TargetCell Is Nothing Then
Exit Do
Else
Result = Result & vbNewLine & TargetCell.Address(False, False)
Set TargetCell = Cells.Find(“Hello”, TargetCell)
End If
Loop While Not (FirstCell.Address = TargetCell.Address)

If TargetCell Is Nothing Then
MsgBox “見つかりませんでした”
Else
MsgBox Result
End If
End Sub

実行した画像がこちらになります。

VBA_Find_3

本来ならResultの行頭の改行コードを除去すべきですが、サンプルということでご容赦ください。


今回はFindメソッドを解説しました。癖の強いメソッドですが自前で実装するより、速度面でもメンテナンス性でもとても頼りになるメソッドです。

今回のサンプルコードで検索して見つかったセル、一つ一つについて処理できるようになりました。応用の幅はとても広いですので是非チャレンジしてみてください。

Filed Under: Find Tagged With: Excel, find, vba, マクロ




© Copyright 2015 BizFAQ · All Rights Reserved · Powered by WordPress · Admin