初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

Find:VBAマクロで検索する-初心者のためのExcel(エクセル)マクロVBA入門

さて、次は検索です。検索と言っても色々あるのですが、今日はFindメソッドを扱いたいと思います。前回と同じですが、この検索もマクロの記録を使うと余計わからなくなる・・・汗というパターンです。

マクロの記録で検索すると・・・


とりあえず、書いてしまうとこうなります。「abc」という単語を検索した場合です。やった操作はCtrl+Fキーを押して検索ダイアログを表示そこに「abc」と書いて実行しただけです。すると・・・

Sub Macro1()

	Cells.Find(What:="abc", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , MatchByte:=False, SearchFormat:=False).Activate
End Sub

あぁ・・・という感じです。これ見ただけでげんなりですね。これから学ぶことは2つくらいです。行末の「_」アンダースコアと「○○:=××」という形式くらいですね。わかりにくいですがせっかくなのでこの2つは説明してからFindメソッドの説明をします。

「_」アンダースコアはプログラムのお約束まだ命令が続くよ


アンダースコアはまだ命令が終わりではなく続きがありますよという意味です。他のプログラミング言語JavaPHPなど)は命令文の終わりを表す記号があります。(;セミコロン)しかしVBAは命令文の終わりがありません。したがって改行がほぼ命令文の終わりと捉えます。そのためながーいコードを1行書くと非常に人が見て見にくいコードになりますので、改行してもまだ命令文が終わってませんよーという意味でアンダースコアを使います。

ちょっと上のコードをもう少し初心者用に見やすくすると・・・

Sub Macro1()

	Cells.Find( _
		What:="abc", _
		After:=ActiveCell, _
		LookIn:=xlFormulas, _
		LookAt:=xlPart, _
		SearchOrder:=xlByRows, _
		SearchDirection:=xlNext, _
		MatchCase:=False, _
                MatchByte:=False, _
                SearchFormat:=False _
        ).Activate
End Sub

となります。わかりやすく字下げもしてみました。アンダースコアはこのようにコードを見やすく綺麗にすることができます。

○○:=××は引数の指定


○○:=××は引数を指定する時に使います。○○を引数名やオプション名と言います。上のコードを見ればわかりますがFindメソッドには少なくとも9個の引数があるみたいですね。たくさんあるので、順番などを変えても良いように引数に名前を付けて指定することでそれを可能にしています。

引数は省略できる


さて、マクロの記録をするとFindメソッドはこのように書かれてるので、Findメソッドは常にこのように書かなければいけないのか?というとそうではありません。Copyの時はコピー先を指定する引数があったのに省略されていましたね。今回は省略してもいい引数まで全部書かれているのです。マクロの記録って・・・汗

私がマクロを学びたいならマクロの記録はするなという理由がわかってもらえるでしょうか。

Findメソッドの引数


Fiodメソッドの引数を整理してみると・・・

名前 必須/オプション データ型 説明
What 必須 バリアント型 (Variant) 検索するデータです。文字列など、セル内のデータに該当する値を指定します。
After オプション バリアント型 (Variant) セル範囲内のセルの 1 つを指定します。
このセルの次のセルから検索が開始されます。
引数 After で指定するセルは、コードからではなく、通常の画面上で検索を行う場合のアクティブ セルに該当します。
>このセルの次から検索が開始されるため、範囲内の他のセルがすべて検索され、このセルに戻るまで、このセル自体は検索されません。
この引数を省略すると、対象セル範囲の左上端のセルが検索の開始点になります。
LookIn オプション バリアント型 (Variant) 情報の種類を指定します。
LookAt オプション バリアント型 (Variant) 使用できる定数は、XlLookAt クラスの xlWhole または xlPart です。
SearchOrder オプション バリアント型 (Variant) 使用できる定数は、XlSearchOrder クラスの xlByRows または xlByColumns です。
SearchDirection オプション XlSearchDirection 検索の方向を指定します。
MatchCase オプション バリアント型 (Variant) 大文字と小文字を区別するには、True を指定します。既定値は False です。
MatchByte オプション バリアント型 (Variant) この引数は、2 バイト (全角) 文字の言語サポートが選択またはインストールされている場合にだけ使用できます。
2バイト文字が2バイト文字とだけ一致するようにする場合は、True を指定します。
2バイト文字が 2 バイト文字だけではなく、対応する1バイト文字とも一致するようにする場合は False を指定します。
SearchFormat オプション バリアント型 (Variant) 検索の書式を指定します。


ヘルプからの引用です。注目すべきは必須の項目、必須なのは実は「What」のみ。つまり他はオプションなので指定してもしなくてもいいということになります。つまりただシートからabcを検索したいならさっきのマクロは・・・

Sub Macro1()

	Cells.Find(What:="abc").Activate
End Sub

でよいということになります。あら、ずいぶんと簡単になりましたね。ちなみに必須のWhatだけならWhat:=は省略して・・・

Sub Macro1()

	Cells.Find "abc"
End Sub

と書くこともできます。

戻り値を使う


Findメソッドはヘルプを見ると戻り値を返します。ヘルプには「検索範囲の先頭のセルを表す Range オブジェクト。」となっています。また検索結果がない場合は「一致するデータが見つからなかった場合、このメソッドは Nothing を返します。Find メソッドは、選択範囲またはアクティブ セルに影響を与えません。」つまり、検索結果がオブジェクトで帰ってくるのでそれに対する操作もできるということになります。例えばabcを含むセルがある行を表示したい場合。

Sub Macro1()

	'戻り値を格納する変数を作る
	Dim ret As Range
	
	'検索結果を変数に入れる
	ret = Cells.Find(What:="abc").Activate
	
	'検索結果があれば、行を表示する
	If Not ret Is Nothing Then
		
		MsgBox ret.Row
	
	End If
	
End Sub

上の「ret.Row」というのが、検索結果のRangeオブジェクトのRowプロパティを参照しているところです。マクロの良いところはこのように何か実行した結果に対して動的に動作を変えられることです。

はぢめてのマクロ作成をしてみよう。

初めてですが、ちょっと次回までに作ってみてください。

Sheet1のA列にabcを含む文字列をいくつかと含まない文字列をランダムに作って、abcを含む文字列だけを検索してそのセルの色を黄色にするマクロを作成してみてください。abcを含む文字列はランダムな位置に100個以上作ってみてくださいね。そうじゃない文字列はその倍くらいで。そして、それができたら、今度は同じ動作をするマクロをFindを使わないで作ってみましょう。

<ヒント>

  • For文またはDoLoop文を使いましょう。
  • このブログのFindの引数をもう一度よく見て見ましょう。
  • 引数に変数をしていすることもマクロでは可能です。
  • 文字列から文字を検索する関数にInStr関数というものがあります。

プログラミングの基礎ができている皆さんならきっと簡単なはず!
あ、マクロは標準モジュールであるModule1に書いてくださいね。




かしこ


ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本

ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本