Findメソッドを用いて指定した文字を含むセルを検索する方法を示します。以前にIf~ThenステートメントとFor~Nextステートメントを使って指定した文字と同じ文字が記入されているセルを検索する方法を示しましたが、Findでは完全一致か部分一致か、あるいは全角と半角の区別をどうするかなど、判定基準を多少設定することができます。今回も例題として家計簿から指定した項目を抜き出して、合計金額を計算してみます。
Findメソッド
Findメソッドは、指定したセル範囲から指定したデータを検索します。そして、最初に見つかったセルを返し、見つからなかった場合にはNothingを返します。検索文字列以外は省略が可能です。
引 数 | 内 容 | 省 略 |
---|---|---|
What | 内 容 | 省略できない |
LookIn | 検索する文字列 | 省略できる 省略時 xlFormulasまたは前回指定内容 |
LookAt | 数式を検索時 xlFormulas 直を検索時 xlValues コメント検索時 xlComments | 省略できる 省略時 xlPartまたは前回指定内容 |
MatchByte | 半角と全角を区別 True 半角と全角区別なし False | 省略できる 省略時 Falseまたは前回指定内容 |
FindNextメソッド
つぎのデータを検索するときに使用します。Findメソッドで見つかったセルを指定します。条件に合うセルが見つからなかった場合には、Nothingを返します。
FindNextメソッドはセルを最後まで探した後に最初のセルに戻って検索を継続しますので、最初に見つかったセルに戻ってきた時点でセル検索を終了するように指定する必要があります。
Addressプロパティ
セル番地を返します。
Findを用いたプロシージャ
下記の関連記事に示した家計簿からIf~ThenステートメントとFor~Nextステートメントを使ったプロシージャをFindメソッドを用いて書き換えます。
書き換えたプロシージャをつぎに示します。
まず、”1月”~”12月”のそれぞれのシートを For i=0 To 11 で指定しています。
Findメソッドでは検索して同じ項目のセルが見つかった後は、Do~Loop Untilでアドレスが最初に見つけたセルと同じセルにくるまでFindNextで繰り返して検索します。それぞれ同じ項目のセルが見つかった場合の処理内容は同じ内容であるため、処理内容はサブルーチン化しました。また、Ifを使って最初のアドレスと新しく検索したアドレスが同一でない場合に、このサブルーチンを実行するようにしています。
また、Findメソッドで同じ項目が検索できなかった場合(Nothingである場合)は検索が終了します。
Sub シート検索() For i = 0 To 11 Kakeibo.Activate '家計簿ファイルをアクティブにして Set Kwksht(i) = Worksheets(sht(i)) 'ワークシートを設定 Set Kensakuhani = Kwksht(i).Range("C5:S35") '検索範囲を設定 'ーーーーーーFindでkoumokuと部分一致、全角半角の別なしで検索ーーーーーーーーー Set Onajisel = Kensakuhani.Find(What:=koumoku, LookIn:=xlFormulas, _ LookAt:=xlPart, MatchByte:=False) Basho = Onajisel.Address '---検索結果のアドレスをBashoに入力 If Not Onajisel Is Nothing Then '---もし検索結果があったらシート書き込みへ Call シート書き込み Do '---Bashoと同じアドレスが見つかるまでつぎの検索を実行 Set Onajisel = Kensakuhani.FindNext(Onajisel) Basho2 = Onajisel.Address '---新しく見つかったアドレスをBaho2に入力 If Basho2 <> Basho Then '---Bashoと違うアドレスならシート書き込みへ Call シート書き込み End If Loop Until Onajisel.Address = Basho End If Set Onajisel = Nothing '---Onajiselを初期化 Next Thisbook.Activate 'ーーーーーーーーーーここから下は前回と一緒ーーーーーーーーーー wksht1.Cells(ii + 1, 2).HorizontalAlignment = xlCenter wksht1.Cells(ii + 1, 2) = "合 計" wksht1.Cells(ii + 1, 4).NumberFormat = "0,000" wksht1.Cells(ii + 1, 4) = goukei Set rng = Range(Cells(3, 2), Cells(ii + 1, 4)) rng.Borders.LineStyle = xlContinuous End Sub
処理内容のサブルーチンは下記内容ですが、検索した項目の日付と金額を抜き出すために、.Rowで行番号を、.Columnで列番号を抜き出して利用しています。それ以外は、関連記事の処理内容と同じ内容です。
Sub シート書き込み() BashoR = Onajisel.Row 'セルの行番号を取得 BashoC = Onajisel.Column 'セルの列番号を取得 'ーーーーーーここから下は前回の操作と同じものに検索文字の出力を追加ーーーーー hizuke = Kwksht(i).Cells(BashoR, 2) kingaku = Kwksht(i).Cells(BashoR, BashoC + 1) ii = ii + 1 Thisbook.Activate wksht1.Cells(ii, 2).NumberFormat = "m月d日" wksht1.Cells(ii, 2) = hizuke wksht1.Cells(ii, 3).HorizontalAlignment = xlCenter wksht1.Cells(ii, 3) = Onajisel 'ーーーー検索した文字の出力を追加ーーーー wksht1.Cells(ii, 4).NumberFormat = "#,000" wksht1.Cells(ii, 4) = kingaku goukei = goukei + kingaku Kakeibo.Activate End Sub
Findによる検索結果
上記のプロシージャを実行した場合の結果(右側)を、関連記事の検索プロシージャ結果(左側)と比較して示します。If で検索した場合には、完全に一致するものだけを検索しますので、Findで検索した場合の”Pasmo”や”PASMO”は検索されません。Find を用いたプロシージャでは、半角と全角の区別無く検索する、また部分的に一致するものも検索するという条件で検索を掛けていますので、このような違いが出ています。
入力値自体が多少曖昧でも検索したい場合には Find は効果的だと思います。その代わり、プロシージャは FindNextで検索を継続したり、最初に見つけたアドレスに戻ることで検索終了を判断するなど、少々複雑なプロシージャになりがちです。
このように、完全一致で良いのか、多少曖昧でも検索したいのかに応じて使い分けされるものと思われます。
以上、参考になれば幸いです。
コメント