ray88’s diary

お仕事で困ったとき用の自分用の覚書

Excel VBA シート内の特定の文字列のセルを検索する

検索キーワード:VBA 正規表現
■書式:
オブジェクト.Fined(What,After,LookIn,LookAt,SearchOrder,
SearchDirection,MatchCase,MatchByte,SearchFormat)

※オブジェクトと各引数の説明
 ・オブジェクト:検索対象となるセル範囲のRangeオブジェクトを指定
 ・What:検索値を指定
 ・After:検索開始セルを指定。省略した場合、対象セル範囲の左上端のセルが指定される。
 ・LookIn:検索対象を以下定数より指定。省略すると検索値に合わせて指定される
      定数: xlFormulas(数式) xlValues(値) xlComments(コメント)
 ・LookAt:完全一致検索か部分一致検索かを以下定数より指定。省略した場合は xlPart 。
      定数: xlWhole(完全一致) xlPart(部分一致)
 ・SearchOrder:検索方向を以下定数より指定。省略するとxlByRowsが指定される。
      定数: xlByRows(行方向) xlByColumns(列方向)
 ・SearchDirection:検索順序を以下定数より指定
      定数: xlNext(前方向) xlPrevious(後方向)
 ・MatchCase:大文字・小文字の区別
        True(区別する) False(区別しない)
 ・MatchByte:全角・半角の区別
        True(区別する) False(区別しない)
 ・SearchFormat:検索の書式を指定。(詳細説明は割愛)

■以下のブックより「パンdeミホ」の文字列の入ったセルを検索し、
 セルアドレスを取得します。取得したセルアドレスより行数のみ
 と列のアルファベット部分のみを抜き出します。
 f:id:ray88:20200307220252p:plain
■セルアドレスを取得 ■行数のみを取得   ■列のアルファベットのみを取得
f:id:ray88:20200307220859p:plain f:id:ray88:20200307221159p:plain f:id:ray88:20200307221305p:plain

■Mainプロシージャ

Sub main()
    Dim strTarget As String      '検索対象文字列を格納'
    Dim strBookPath As String    '対象ブックのパスを格納'
    Dim strSheetName As String   '対象シート名を格納
    Dim strCellAddress As String '対象セルアドレスをString型で格納
    Dim strNum As String         'セルアドレスの行数のみをString型で格納
    Dim strChr As String         'セルアドレスの列のアルファベットのみを格納
    
        '対象ブックパス、検索対象文字列を設定。
        strBookPath = "C:\Users\ドキュメント\T顧客マスタ.xlsx"
        strSheetName = "T顧客マスタ"
        strTarget = "パンdeミホ"
        
        '対象セルアドレスをString型で取得しメッセージボックスで表示
        '対象データが存在しない場合は「対象データなし」を表示
        strCellAddress = fncSearchCell(strBookPath, strSheetName, strTarget)
        MsgBox strCellAddress
        
        '対象データがある場合のみ対象セルアドレスより行数のみと
        '列名アルファベットのみを個別に抽出してメッセージボックスで表示
        If strCellAddress <> "対象データなし" Then
            Call infoCellAddress(strCellAddress, strNum, strChr)
            MsgBox strNum
            MsgBox strChr
        End If
End Sub

■セルアドレスをString型で返すFunctionプロシージャ

Function fncSearchCell(strBookPath As String, strSheetName As String, strTarget As String) As String
'---------------------------------------------------------------
'機 能:対象文字列の入力のあるセルを検索し、String型でセルアドレスを返す
'    対象セルが存在しなかった場合は「対象データなし」を返す
'引数1(strBookPath) :対象ブックのパス
'引数2(strSheetName):対象シート名
'引数3(strTarget)   :対象文字列
'----------------------------------------------------------------
        Dim wb As Workbook              '開いたブックを格納する変数
        Dim objFoundCell As Range       '検索結果のセルを格納するRange型変数
                
        'オブジェクト変数に対象ブックを格納
        Set wb = Workbooks.Open(strBookPath)
        
        '検索対象文字列シート内を検索し、ヒットしたセルをオブジェクト変数に格納
        Set objFoundCell = wb.Sheets(strSheetName).Cells.Find(strTarget)
        
        '対象文字列がみつからない場合は対象なしのメッセージを返す
        If objFoundCell Is Nothing Then
            fncSearchCell = "対象データなし"
        Else
        '対象文字列が見つかった場合はセルアドレスを返す
            fncSearchCell = objFoundCell.Address
        End If
        
        '対象ブックを閉じる
        wb.Close
        
        'オブジェクト変数を解放
        Set objFoundCell = Nothing
        Set wb = Nothing
End Function

■セルアドレスより行数(String型)と列名のアルファベットを抽出するSubプロシージャ

Sub infoCellAddress(strCellAddress, strNum, strChr)
'------------------------------------------------
'機 能:セルアドレス(String型)より行数のみと
'       列名のアルファベットのみを個別に抜き出す
'引数1:セルアドレス(String型)
'引数2:行数格納用変数(String型)
'引数3:列名アルファベット格納用変数(String型)
'-----------------------------------------------       
        '取得したセルアドレスからRowの数字のみ、アルファベットのみを取り出す
        With CreateObject("VBScript.RegExp")
            .Global = True
            '数字のみを取り出す
            .Pattern = "[A-Z,$]*"
            strNum = .Replace(strCellAddress, "")
            'アルファベットのみを取り出す
            .Pattern = "[1-9,$]*"
            strChr = .Replace(strCellAddress, "")
        End With
End Sub