ray88’s diary

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

Excel VBA Findメソッドで検索する際にセル結合がある場合

■セル結合がある場合は以下2点がポイント
 ①セルの検索範囲を全てのセルにする(Cells にする)
 ②SerchorderをxlByColumnsではなく、xlByRowsにする

sub main()
    call.Cells.Find(What:="検索値", SearchOrder:=xlByRows)
end sub

■使用例

Sub FindCell()
    Dim bookPath As String              '対象ブックのパスを格納
    Dim wb As Workbook                  '開いたブックを格納
    Dim searchWord As String             '検索対象の文字列を格納
    Dim foundCell As Range              '検索結果のセルを格納
    Dim strCellAddress As String        '検索結果のセルアドレスを格納    
    '検索対象の文字列を設定
    searchWord = "店舗名"
    '対象ブックを開く
    bookPath = "C:\デスクトップ\テスト\テスト.xlsx"
    Set wb = Workbooks.Open(bookPath)
    'セルを検索
    Set foundCell = wb.Sheets("Sheet1").Cells.Find(what:=searchWord, SearchOrder:=xlByRows)
    '検索結果のセルよりセルアドレスを取得
    strCellAddress = foundCell.Address
    'ブックを閉じてオブジェクト変数を解放
    wb.Close
    Set wb = Nothing    
    MsgBox strCellAddress
End Sub

■ファンクション化するとこんな感じ
呼び出し元

Sub test1()
    Dim bookPath As String              '対象ブックのパスを格納
    Dim wb As Workbook                   '開いたブックを格納
    Dim searchWord As String             '検索対象の文字列を格納
    Dim TargetCell As String    
    '検索対象の文字列を設定
    searchWord = "店舗名"
    '対象ブックを開く
    bookPath = "C:\デスクトップ\テスト\テスト.xlsx"
    Set wb = Workbooks.Open(bookPath)
    
    TargetCell = fncFindCell(wb, searchWord)
    MsgBox TargetCell    
    'ブックを閉じてオブジェクト変数を解放
    wb.Close
    Set wb = Nothing
End Sub

ファンクションプロシージャ

Function fncFindCell(wb As Workbook, searchWord As String) As String
'---------------------------------------------------------------------
'機能 :検索値のあるセルを検索し、セルアドレスを返す
'引数1:対象ワークブック
'引数2:検索対象の文字列
'戻り値:検索結果セルのセルアドレス
'---------------------------------------------------------------------
    Dim foundCell As Range              '検索結果のセルを格納
    Dim strCellAddress As String        '検索結果のセルアドレスを格納    
    '検索値
    Set foundCell = wb.Sheets("Sheet1").Cells.Find(what:=searchWord, SearchOrder:=xlByRows)
    '検索結果のセルよりセルアドレスを取得
    strCellAddress = foundCell.Address
    'セルアドレスは絶対参照のアドレスで返されるので$マークを削除する
    fncFindCell = Replace(strCellAddress, "$", "")    
End Function