Excel VBAエキスパート体験記17(Find)

VBAエキスパート

前回はExcel VBAエキスパートスタンダードのAutoFilterについて勉強しました。
前回までの記事はこちら

今回は6章のFindメソッドについてレポートしていきます。

なお今回も一部動画を使って説明しようと思います。Youtubeのようなものではないですがイメージをつかんでくだされば幸いです。

なお理解が間違っているところもあるかもしれませんがわからない人と同じ視点に立てるのは今しかないので細かいところはご容赦ください。
間違えに気づいたら修正していきます(笑)。
 

<今回の目的>

Findメソッドを理解する

今回の勉強方法
  1. 6章を精読する
  2. Findメソッドをわかりやすく説明する
スポンサーリンク

結論

いきなりですが結論です。

Findメソッドのコードは実際の検索操作をやれば理解できる。

以下の図1枚を理解すればよい

次から詳しく説明します。

コードの説明

Findメソッドのコードは以下のようになります。

セル範囲.Find(What:=” “,LookAt:=” “・・・)

このコードは以下の手動操作の自動化を表しています。
1 表の適当な範囲を選択する(ここではC2からC10セル)
2 メニューバーのホームタブの検索と置換→検索をクリックする
3 検索する文字列を入力する
4 別の条件が必要な場合はオプションをクリックして必要項目を選択する

詳しくは以下の動画を確認ください。

これがそれぞれ以下になります。

1 表の適当な範囲を選択する(ここではC2からC10セル)⇒これがセル範囲

2 メニューバーのホームタブの検索と置換→検索をクリックする⇒これがFindメソッド

3 検索する文字列を入力する⇒これが引数What:

4 別の条件が必要な場合はオプションをクリックして必要項目を選択する⇒これが他の引数


前回のAutoFilter同様行っている操作を順次コードにしているだけですね。

理解するのには手動でやってみるのがおすすめです。

なおセル範囲を1つだけにすると以下のエラーがでます。

コードの詳細

先ほどの説明を図にすると以下のようになります。

まずセル範囲の指定を行います。
その後Findメソッドを実行します。

次にFindメソッドの引数を記載します。
それぞれの引数の説明は日本語で表示されている通りです。

おわかりのように引数はあくまでエクセルの機能上の条件を表現しているだけです。

なおAfterに対応する引数のみ表示がありません。これは選択した次のセルから検索するという内容になります。手動操作では標準の機能のようです。

それぞれの引数に対する値は以下のようになります。

引数
LookInxlFormulas:数式
xlValues:値
xlComents:コメント文
LookAtXlPart:部分一致 xlWhole:完全一致
SearchOrderxlByColumns:列 xlByRows:行
SearchDirectionxlNext:次を検索
xlPrevious:前を検索
MatchCaseTrue:チェックボックスON False:チェックボックスOFF
MatchByteTrue:チェックボックスON False:チェックボックスOFF  

ポイントはエクセルの機能の為xlがつくということとチェックボックスの項目はLookAtを除いてTrue、Falseになることです。

なお注意点としては引数LookIn、LookAt、SearchOrder、およびMatchByteの設定は、このメソッドを使用するたびに保存されることがあります。その為連続で使用する場合などは注意が必要です。

戻り値

Findメソッドで検索した場合の戻り値はRangeオブジェクトとなります。

なお最初にヒットしたRangeオブジェクトしか取得できないのと一致するデータがなかった場合はNothingが返されるという特徴があります。

そのためFindメソッドを使う場合はオブジェクト変数とセットで使うことが多いです。例としては以下があります。

Dim A As Range
Set A = Range("C2:C10").Find(What:="たけみつ")

セルの操作

見つかったセルに対する操作については以下のようなものがあります。

見つかったセルを含む行を削除する

A.EntireRow.Delete

行全体を表すときはEntireRowを使います。行の場合はEntireColumnとなります。

見つかったセルを起点に別のセルを操作する

A.Offset(0,1)

別のセルを操作するにはOffsetを使います。

見つかったセルを含むセル範囲をコピーする

A.Range(A,A.End(xlToRight)).Copy

最終列までをコピーするコードです。

A.Range(A,A.End(xlDown)).Copy

最終行までをコピーするコードです。

A.Resize(1,3)

Resizeでセルの大きさを変化させるコードです。

おまけ

Findメソッドだと一つのセルしか検索できません。

これを行うにはFindNextメソッドとDo Loopステートメントを使います。

複数のセルを検索するコードはインストラクターのネタ帳さんのサイトが非常に参考になりました。

Find・FindNextで全ての行番号・列番号を取得する

インストラクターのネタ帳 https://www.relief.jp/docs/excel-vba-find-all-rows-number-columns-number.html

インストラクターのネタ帳さんでは訪れる方の検索キーワードをもとにコードを書かれているのもあってよく使わせていただいているサイトです。

さて、私が作成したコードは以下です。

Sub FindNext()

Dim A As Range
Set A = Range("C1:C10").Find(What:="たけみつ")

MsgBox A.Address

Dim adr As String
adr = A.Address

Do
Set A = Range("C1:C10").FindNext(After:=A)
  If A.Address = adr Then
    Exit Do
  End If
  MsgBox A.Address
Loop

End Sub

ポイントとしては

1 まず一つ目の検索を行う
2 検索セルの情報を取得しておく
3 次の検索を行う為FindNextメソッドと引数Afterを使う
4 Do~Loopで条件を作成する

となります。

なお私がミスを犯した注意点としては

1 Until A Is NothingをDo~Loopの条件に入れるのは間違い

Aはすでに1つ見つかっている為FindNextメソッドを使うと最低でも再度同じRangeオブジェクトを取得します。なのでAがNothingになることはありません。

2 最初にアドレスを取得しておかないと何度も取得して無限ループになる

Findメソッドは見つかる限り何度でも同じセルを検索します(手動操作でもそうです)。その為最初のセルに戻ったことを認識させないと永遠に続きます。

です。あまりFindメソッド自体使わないようですが勉強として残しておきます。

ここでのまとめ

Findメソッドのコードは実際の検索操作をやれば理解できる。

図1枚を理解すればよい

です。エクセルの機能を使う場合は使う場合は手動操作をしながら覚えると楽なので試してみてください。

コメント

タイトルとURLをコピーしました