ワークシート上の表からキーワードを検索する方法は幾つかありますが、VLookupとFindの例を紹介します。検索はその行為だけでなく、そのキーワードの隣のデータを取得する、キーワードの個数をカウントするなど別の処理と結びついています。いくつかの例をまとめてみました。

1.KeyWordが左端にある場合(VLookup)

KeyWordが範囲(Range)の左端の列にある場合Application.VLookupを使用すると高速で簡単です。
VLookup関数の書式:

 VLookup(検索値, 範囲, 列番号, 検索の型)

パラメータの意味:

パラメータデータ型説明
検索値StringKeyWordを指定
範 囲Range情報テーブルのセル範囲を指定
列番号Integer情報テーブルの目的の値が入っているセル範囲内での列を指定。ワークシートの列ではありません。
検索の型BooleanTrue:近似値を含める。(規定値) False:完全一致検索する。注1

注1:完全一致を検索する場合は、必ずFalseを設定して下さい。また、第3引数の後ろに「,」のみがある場合、第4引数を省略したとはみなされず、FALSEが指定されたものとみなされます。

以下の例はKeyWord(例:"A")の右隣の値がTargetWord(例:"AAA")と一致するかというデータの検証のFunctionです。KeyWordが複数無いという前提です。データ検証のためKeyWordが無くてもTargetWordが無くてもFalseとするようにしています。この例でSerchWordを戻すようにすると、右隣のデータを取得することができます。ここでSerchWordのデータ型はVariantです。これはKeyWordが範囲内で見つからなかった時にVLookupが返すエラーを受取るためです。

Function MatchKeyWord(LookupRange As Range, KeyWord As String, _
                     TargetWord As String) As Boolean
   Dim SerchWord As Variant
  
   MatchKeyWord = False
  
   SerchWord = Application.VLookup(KeyWord, LookupRange, 2, False)  '← 2 = 右隣
   If IsError(SerchWord) Then                   '← KeyWordが無かった場合
       'NOP
   ElseIf SerchWord = TargetWord Then           '← TargetWordが一致した場合
       MatchKeyWord = True
   End If
  
End Function

2.KeyWordが左端にない場合( Find Methods )

KeyWordが範囲(Range)の左端の列にない場合Vlookupは使用できません。その場合のFindメソッドを使用した例を紹介します。
Find メソッドの書式:

 range.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

range:検索する範囲です。
FindはRangeを返します。
パラメータの意味:

パラメータデータ型説明
WhatString検索する文字列(KeyWord)を指定します。
AfterCellここに指定したセルの次から検索を開始します。省略するとrangeの左上セルを指定したことになり、2番目のセルから検索を開始します。最初のセルから検索したい場合は、一番最後のセルを指定します。
LookInLong検索する対象を指定します。xlValues(規定値),xlFormulas,xlComments
LookAtLong完全一致検索をするかどうか指定します。xlPart(規定値),xlWhole
SearchOrderLong検索の方向を指定します。xlByRows,xlByColumns
SearchDirectionLong検索の順を指定します。xlNext(規定値),xlPrevious
MatchCaseBoolean大文字と小文字を区別して検索するかどうかを指定します。False:区別しない。(規定値)
MatchByteBoolean半角文字と全角文字を区別して検索するかどうかを指定します。True:区別する。規定値は前回の値
SearchFormatBoolean書式を検索の条件に含めるかどうかを指定します。True:含める(規定値)

(注意:引数 LookIn、LookAt、SearchOrder、および MatchByte の設定は、このメソッドが使われるたびに保存されます。)
以下はKeyWordを元にその右隣の値を取得する例です。KeyWordが見つからなかったのかKeyWordの右隣の値が空白だったのかを見分けるために、見つからなかった場合"False"を戻り値にしました。KeyWordが複数無いという前提です。

Function example601(FindRange As Range, KeyWord As String) As String
    Dim row As Range
  
    Set row = FindRange.Find(what:=KeyWord, _
                            LookIn:=xlValues, lookat:=xlWhole, _
                            SearchOrder:=xlByRows, searchDirection:=xlNext)
    If row Is Nothing Then
        example601 = "False"
    Else
        example601 = row.Offset(0, 1).Value         '← Offset(0, 1) = 右隣
    End If
 
    Set row = Nothing
  
End Function

3.KeyWordのある行を求める場合(Match)

Vlookup関数ではKeyWordのある行の値を求めましたが、行番号を求める場合はMatchを使用します。
Match関数の書式:

 Match(検索値, 範囲, 検索の型)

パラメータの意味:

パラメータデータ型説明
検索値StringKeyWordを指定
範 囲Range情報テーブルのセル範囲を指定
検索の型Integer-1:検索値以上の最小値。(規定値) 0:完全一致検索する。1:検査値以下の最大値

以下の例はKeyWord(例:"A")の値がMatchRangeの領域内にある場合の行を返すFunctionです。KeyWordが見つからなかった場合は0を返します。 簡単なのでわざわざ関数を作らなくてもいいと思いますので以下は使用方法のサンプルと思って下さい。
返す値がシートの行番号ではなく領域内での行番号であることに注意して下さい。

Function MatchRow( KeyWord As String, MatchRange As Range ) As Long
   Dim SerchRow As Variant
  
   SerchRow = Application.Match(KeyWord, MatchRange , 0)
   If IsError(SerchRow ) Then                   '← KeyWordが無かった場合
       MatchRow = 0
   Else           '← KeyWord が見つかった場合
       MatchRow = SerchRow
   End If
  
End Function

最終更新のRSS
Last-modified: 2016-06-22 (水) 17:06:45 (2864d)