VBA・マクロツール

【知らなくても使える】表内のデータを簡単に検索するマクロツール(Excel VBA)

日常業務を行うにあたって、過去の蓄積されたデータをエクセルの表やテーブルで管理し、必要に応じて都度検索することがあると思います。

 

その際には、エクセルの表やテーブルで管理しているデータを検索するときにエクセル機能の「検索」を利用していましたが、検索結果として検索条件と大量に一致した場合は一つずつの確認が非常にしにくいと感じました。

 

そんな場面で、検索結果を見やすく表示できる『表内のデータ簡単検索ツール』をExcelマクロで作成しました。

 

当記事にはマクロの元になるExcelファイルがダウンロード可能で、VBAのコードも記事内に記載がありますので、Excel VBAやマクロが良く分からないという方でもすぐに使用できます

これを使用すれば業務効率化が図れるかと思いますので、是非ご活用頂けたらと思います。

 

わたしは、過去の質疑回答集を蓄積データとしてエクセルの表で管理して、当ツールを利用して検索結果をスムーズに表示できるようにしていました。

 

また、このツールのように複数項目に対して一つの検索条件でなく、各項目毎に検索条件を設定して検索したい場合は、以下のツールを使用してみてください

【知らなくても使える】テーブル内のデータを項目毎に検索して表示するマクロツール(Excel VBA) Excelのテーブル(表)内の各項目の値をそれぞれ指定して検索したいと思ったことはないでしょうか。 その際には、エ...
ツールの更新履歴

(2022年5月13日:更新) 

・検索実行時に検索対象の文字が存在しない場合は、検索対象がない旨のメッセージを表示させてフィルターしないように変更

・検索方法として「AND検索」「OR検索」を選択可能に変更

(2022年9月23日:更新) 

・検索条件(AND検索、OR検索)の対象を「一つのセル」「複数項目」から選択可能に変更

・ツール全体のUIを変更

(2022年11月25日:更新) 

・検索対象のデータが表でなくテーブルが使用されている場合でも動作するように改修

『表内のデータ簡単検索ツール』の概要

エクセルの表を作成し、その中に日々業務で使用しているデータを入れ込んでいきます。

 

そのデータがある程度の数分だけ蓄積された状態で、そのデータ内から任意の文字を検索したい場合に、検索ワードを入れて検索処理を行えば対象行のみが表示され、該当セルが赤く表示されることで、検索が視覚的にも容易にできるようになります。

 

下に説明動画を載せますので、ご確認ください。

説明動画

 

基本的な機能、操作方法の説明

  1. 表内データ簡単検索ツールのVBAコードを含んだExcelファイル(***.xlms)を開きます。
  2. 対象の表内に検索対象とするデータを入れ込んだ状態にします。

 

  1. 「検索ワード」の欄に検索したい文字を入力ます。
  2.  ”検索アイコン”(虫眼鏡アイコン)をクリックします。

 

検索ワードの内容での部分一致で検索結果が表示されます。

 

検索ワード欄の右にある “戻るアイコン” をクリックすれば、検索状態は解除され全データが表示されます。

 

留意事項

検索文字間にスペースを入れた場合は、検索条件と条件の対象を指定して検索

検索条件:「AND条件」、条件の対象:「一つのセル」

例えば、「問合せ 3」で検索ワードを入れた場合は、一つのセル内で”問合せ” という文字が入っていて、かつ “3” という文字が入っているセルを検索します。

 

検索結果として、両方を満たす値が入っているセルが検索され、表示されます。

 

検索条件:「OR条件」、条件の対象:「一つのセル」

同様に「問合せ 3」で検索ワードを入れた場合は、一つのセル内で”問合せ” と “3” のどちらかの文字が入っているセルを検索します。

 

検索条件:「AND条件」、条件の対象:「複数項目」

 

検索条件:「OR条件」、条件の対象:「複数項目」

 

検索対象の列について

標準では、表内のタイトル行の色が濃紺になっている箇所(D , E , F , G , H , I , J 列)が検索対象として設定されていますが、「setting」シートを変えれば、検索対象列を自由に変更することができます。

初期では非表示になっている「setting」シートのB3の値を対象列のカンマ区切りで値を設定すれば変更可能です。

 

表の項目の列数を変更する場合

現行のツールでは表の列が「J列」までで作成されていますが、項目数を増減する場合は、以下の対応をしてください。

<項目を減らす場合>

 

<項目を増やす場合>

 

使用する際の事前準備

このページの下部にある「Excelファイルのサンプル」からExcelファイルを取得し、「準備の手順」内にあるVBAコードを取得したExcelファイルに記載して保存すれば、すぐに当ツールを使用できます。

 

以下にその手順を説明していきます。

 

準備の手順

サンプルのダウンロードはこちら」からサンプル(Excelファイル)をダウンロードします。

※インターネットにあるマクロファイルをダウンロードすることはセキュリティ上リスクがあるので、マクロ無しExcelファイルを公開しています。

 

<手順1>

ダウンロードしたExcelファイルを開いて、VBE(Visual Basic Editor)を起動させます。

  1. Excelファイル上部にあるリボンの「開発」タブを選択します。
  2. 「Visual Basic」をクリックして、VBE(Visual Basic Editor)を起動させます。

 

<手順2>

  1. 「Microsoft Excel Object」にて右クリックして「標準モジュール」を挿入します。

 

<手順3>

  1. 新しく作成された「Module1」を選択して、右側の空欄スペース(エディター)に下記のVBAコードをコピペで入力します。

 

VBAのソースコードはこちら

以下のVBAコードをコピーして、「Module1」内のエディターに貼り付けます。

※VBAコードの右上のアイコンをクリックするとソースコードをコピーできます

Option Explicit

'---------(設定値)---------------------------
Private Const KEYWORD_POINT = "D4"              '1.検索ワードを入力するセル位置
Private Const SEARCH_TYPE_POINT = "D3"          '2.検索条件を指定するセル位置
Private Const TARGET_TYPE_POINT = "E3"          '3.条件の対象を指定するセル位置
Private Const HEAD_ROW = 8                      '4.テーブル見出し行の行番号
Private Const HEAD_COL_NUM = 1                  '5.テーブル見出し列の列番号
Private Const SEARCH_TGT_POINT = "B3"           '6.カンマ区切りで指定する検索対象の列を入力するセル位置
Private Const SETTING_SHEET_NM = "setting"      '7.設定シートの名称
Private Const WORK_COL_NM = "作業列"            '8.設定シートの名称

'---------(メッセージ)-----------------------
Private Const Msg1 = "検索ワードを入力してください。"
Private Const Msg2 = "検索対象が見つかりませんでした。"
'----------------------------------------------

Dim SearchType As String            '指定する「検索条件」
Dim TargetType As String            '指定する「条件の対象」
Dim HeadCellPoint As String         '見出し行のセル位置
Dim DataCellPoint As String         'データ行のセル位置
Dim WorkColNum As Long              '作業列の列番号
Dim WorkCol As String               '作業列
Dim BaseSht As Worksheet            'ツールの本体シート
Dim SettingSht As Worksheet         '設定シート

'===============================================
'検索ボタンを押した時に実行される検索メイン処理
'===============================================
Sub 検索_Click()

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
    
    If Trim(Range(KEYWORD_POINT).Value) = "" Then
        MsgBox Msg1
        Exit Sub
    End If
    
    Set BaseSht = ActiveSheet
    
    Dim lastRow As Long, iRow As Long, iCol As Long
    
    Dim keyword As Variant, keywordArr As Variant
    Dim tgtCol() As String
    Dim tgtWord(0) As String
    Dim searchResult() As String
    
    Dim blnExist As Boolean: blnExist = True
    Dim blnSearchExist As Boolean: blnSearchExist = False
    
    If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
        Range(HeadCellPoint).AutoFilter
    End If
    
    ''設定情報を取得する
    Call GetSetting
    
    ''色の変更、作業行の初期化等を行う
    Call ClearSheetColor
    
    '検索ワードを取得し、間にスペースがあった場合は文字を分割して取得する
    keyword = Trim(BaseSht.Range(KEYWORD_POINT).Value)
    keyword = Replace(keyword, " ", " ")
    keywordArr = Split(keyword)
    
    '検索対象の列を格納する
    tgtCol = Split(SettingSht.Range(SEARCH_TGT_POINT).Value, ",")
    
    lastRow = BaseSht.UsedRange.Rows.Count + BaseSht.UsedRange.Row - 1
    
    '検索対象の行がある分だけ繰り返す
    For iRow = HEAD_ROW + 1 To lastRow
    
        '条件の対象:「一つのセル」の場合
        If InStr(TargetType, "一つのセル") = 1 Then
        
            '検索対象の列がある分だけ繰り返す
            For iCol = 0 To UBound(tgtCol)
                
                tgtWord(0) = Range(tgtCol(iCol) & iRow).Value
                
                For Each keyword In keywordArr
                    
                    searchResult = Filter(tgtWord, keyword)
                    
                    'AND検索の条件で検索する場合
                    If InStr(SearchType, "AND") <> 0 Then
                    
                        If UBound(searchResult) = -1 Then
                            blnExist = False
                            Exit For
                        End If
                        
                    'OR検索の条件で検索する場合
                    Else
                        blnExist = False
                        If UBound(searchResult) <> -1 Then
                            blnExist = True
                            Exit For
                        End If
                        
                    End If
                    
                Next keyword
                
                If blnExist Then
                    Range(WorkCol & iRow).Value = "1"
                    Range(tgtCol(iCol) & iRow).Font.Color = RGB(255, 0, 0)
                    blnSearchExist = True
                End If
                
                blnExist = True
            
                Erase tgtWord, searchResult
            
            Next iCol
        
        '条件の対象:「複数項目」の場合
        Else
            Dim findCnt As Long: findCnt = 0
            Dim processWord As String: processWord = ""
            
            For Each keyword In keywordArr
            
                '検索対象の列がある分だけ繰り返す
                For iCol = 0 To UBound(tgtCol)
                
                    tgtWord(0) = Range(tgtCol(iCol) & iRow).Value
                    searchResult = Filter(tgtWord, keyword)
                    
                    '検索ワードが表の対象セル内の値と一致する場合
                    If UBound(searchResult) <> -1 Then
                        
                        Range(tgtCol(iCol) & iRow).Font.Color = RGB(255, 0, 0)
                        
                        '一致した件数がスペースで区切ったワード数分と同数かをカウントする
                        If processWord <> keyword Then
                            findCnt = findCnt + 1
                            processWord = keyword
                        End If
                    End If
                    
                Next iCol
                
            Next keyword
            
            'AND検索の条件で検索する場合
            If InStr(SearchType, "AND") <> 0 Then
            
                If findCnt = UBound(keywordArr) - LBound(keywordArr) + 1 Then
                    Range(WorkCol & iRow).Value = "1"
                    blnSearchExist = True
                Else
                    Rows(iRow).Font.ColorIndex = 1
                End If
                
            'OR検索の条件で検索する場合
            Else
                If findCnt > 0 Then
                    Range(WorkCol & iRow).Value = "1"
                    blnSearchExist = True
                Else
                    Rows(iRow).Font.ColorIndex = 1
                End If
            End If
            
            Erase tgtWord, searchResult
        End If
        
    Next iRow
    
    '検索対象が存在する場合はフィルターし、存在しない場合はメッセージを表示させる
    If blnSearchExist Then
        BaseSht.Range(HeadCellPoint & ":" & WorkCol & Format(HEAD_ROW)).AutoFilter Field:=WorkColNum, Criteria1:="<>"
    Else
        MsgBox Msg2
    End If
    
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With
    
End Sub

'===================================================================
'フィルター解除ボタンを押した時に実行されるフィルター解除メイン処理
'===================================================================
Sub フィルター解除_Click()

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
    
    HeadCellPoint = Split(Cells(1, HEAD_COL_NUM).Address, "$")(1) & HEAD_ROW

    If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
        Range(HeadCellPoint).AutoFilter
    End If
    
    Call ClearSheetColor
        
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With
    
End Sub

'-------------------------------------
'色の変更、作業行の初期化等を行う
'-------------------------------------
Sub ClearSheetColor()
    
    Dim iRow
    Dim iCol
    
    iRow = BaseSht.UsedRange.Rows.Count + BaseSht.UsedRange.Row - 1
    iCol = BaseSht.UsedRange.Columns.Count + BaseSht.UsedRange.Column - 1
    
    BaseSht.Range(Range(DataCellPoint), Cells(iRow, iCol)).Font.ColorIndex = 1
    BaseSht.Range(WorkCol & HEAD_ROW + 1 & ":" & WorkCol & iRow).Clear
    
End Sub

'-------------------------------------
'設定情報を取得する
'-------------------------------------
Sub GetSetting()

    Set SettingSht = Worksheets(SETTING_SHEET_NM)
    Dim workColNm As String
    
    Dim c As Range
    Set c = Cells(HEAD_ROW, HEAD_COL_NUM).CurrentRegion
    
    '最終列の列番号と列を取得する
    WorkColNum = c.Columns(c.Columns.Count).EntireColumn.Column
    workColNm = BaseSht.Cells(HEAD_ROW, WorkColNum).Value
    
    HeadCellPoint = Split(Cells(1, HEAD_COL_NUM).Address, "$")(1) & HEAD_ROW
    DataCellPoint = Split(Cells(1, HEAD_COL_NUM).Address, "$")(1) & HEAD_ROW + 1
    
    '最終列の項目名が「作業列」でない場合は作業列を新たに作る
    If WORK_COL_NM <> workColNm Then
        WorkColNum = BaseSht.Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column + 1
        BaseSht.Cells(HEAD_ROW, WorkColNum).Value = WORK_COL_NM

    End If
    
    '検索対象が表でなくテーブルで記載されている場合の対応
    If BaseSht.ListObjects.Count <> 0 Then
        If BaseSht.Range(HeadCellPoint).ListObject.Range.Columns.Count <> WorkColNum Then
    
            '作業列がテーブル内に入っていない場合は、追加する
            With BaseSht.Range(HeadCellPoint).ListObject
                .Resize .Range.Resize(, .Range.Columns.Count + 1)
            End With
        End If
    End If
    
    WorkCol = Split(Cells(1, WorkColNum).Address, "$")(1)
    
    '作業列が非表示になっていない場合は、非表示にする
    If Columns(WorkColNum).Hidden <> True Then Columns(WorkColNum).Hidden = True
    
    '検索条件を取得する
    SearchType = SettingSht.Range(SEARCH_TYPE_POINT).Value
    
    '条件の対象を取得する
    TargetType = SettingSht.Range(TARGET_TYPE_POINT).Value
    
End Sub

 

<手順4>

マクロを含んだExcelとして、ファイルを保存します。

  1. 左上にある「保存」アイコンをクリックします。
  2. 「ファイルの種類」から「Excelマクロ有効ブック」を選択します。
  3. 「保存」をクリックします。

 

<手順5>

「検索アイコン」にメイン処理「検索_Click」のマクロを設定します。

【検索ボタン】

  1. 「検索アイコン」を右クリックします。
  2. 「マクロの登録」をクリックします。
  3. 「検索_Click」を選択します。
  4. 「OK」をクリックします。

 

<手順6>

「オートフィルター解除アイコン」にメイン処理「フィルター解除_Click」のマクロを設定します。

【オートフィルター解除ボタン】

  1. 「フィルター解除アイコン」を右クリックします。
  2. 「マクロの登録」をクリックします。
  3. 「フィルター解除_Click」を選択します。
  4. 「OK」をクリックします。

これで、それぞれのボタンを押せば、検索とフィルター解除が実施できるようになります。

 

これで事前準備は完了です。

あとは「当ツールの使用方法」で記載された方法でツールを実行できます。

 

また、このようなExcelVBAを用いた業務効率化を行うときに、以下の書籍が実際のVBAコードを書く際に参考になると思いますので、良かったらご参照ください。

 

なお、当マクロの開発環境として、OSは “Windows10” 、Excelのバージョンは “Microsoft Office 365″ で行っており、当環境では動作確認ができていますが、他のすべての環境で正常に動作するかは確認できていません。

 

正常に動作しない場合は、コメントいただければ幸いです。
また、このような業務効率化できるツールを以下に一覧でまとめてありますので、ご興味のある方はご覧ください。

 

サンプルのダウンロードはこちら

下記よりExcelファイルをダウンロードして、記事の途中にありました VBAのソースコードをツール内に組み込んで使用してください。

【Excel VBA】表内データ簡単検索ツール

ツールのダウンロードはこちら

※インターネットにあるマクロファイルをダウンロードすることはセキュリティ上リスクがあるので、マクロ無しExcelファイルを公開しています

他に要望等ありましたら、可能な限り改修等を対応しますのでコメント頂ければと思います

 

<このツールが『結構使える!』と思ったら、下のグッドボタンを押していただけたら幸いです>

コメントはこちら

  1. より:

    作業列をKではない列に変更することは可能でしょうか。
    AQまでの列を使用したいと考えております。

    • RH より:

      管理人のRHです。
      ご返答が遅れまして、申し訳ありません。
      yさん、ツールのご使用とコメントありがとうございます。

      「AQ列」まで使用するとのことですので、作業列をその次の列である「AR列」にすると考えて、以下を修正頂ければと思います。

      ・5行目を「Private Const WorkCol = “AR”」に変更
      ・8行目を「Private Const WorkColRow = “AR5:AR”」に変更
      ・89行目を「sht.Range(“A4:AR4″).AutoFilter Field:=44, Criteria1:=”<>“」に変更

      上記で目的が実現できない場合は、再度ご連絡をお願いします。

      • より:

        ご返信いただきありがとうございます。
        3点の修正をしたところ、問題なくマクロが実行できました。
        とても有益な情報をありがとうございました。
        仕事で活用させていただきます。

        • RH より:

          管理人のRHです。

          問題なくマクロが実行でき、目的が達成されたようで良かったです。
          また何かありましたらコメント願います。

  2. より:

    こちらのマクロを使わせていただいているのですが、検索の際、「123AB/AA」とあった場合に検索で「123AA」と検索しても「123AB/AA」をヒットさせる方法はないでしょうか。コードなど教えて頂けると幸いです。

  3. より:

    再コメントです。こちらのマクロを使わせていただいているのですが、検索の際、「123AB/AA」とあった場合に検索で「123AA」と検索しても「123AB/AA」をヒットさせる方法はないでしょうか。コードなど教えて頂けると幸いです。

    • RH より:

      管理人のRHです。
      コメントいただきありがとうございます。
      返信が遅くなり、申し訳ありません。

      さ様が最終的に実現したいこととしては少し違っているかもしれませんが、
      今のコードですと、「123AB/AA」を見つけたい場合に「123 AA」(※間に空白)を入れるとand条件で検索されて検索した結果として表示されますが、それで解決しますでしょうか。

      >「123AB/AA」とあった場合に検索で「123AA」と検索しても「123AB/AA」をヒットさせる方法はないでしょうか。

  4. より:

    質問なのですが、検索を行う際に検索ワードが無かった場合最下層にある空欄のセルが(データが入っていないところのセル)最上部に出てくるのですが、そのあと検索しても該当がないのかと思いオートフィルター解除のボタンや検索のボタンを押してもエクセルがフリーズしてしまいエクセルを再起動しないといけない状態になります。
    検索のキーワードが該当ない場合、該当ありませんでリセットできるような状態にできませんでしょうか?

    • RH より:

      管理人のRHです。
      コメントいただきありがとうございます。

      検索を行った際に検索ワードが無かった場合、その後にオートフィルター解除のボタンや検索のボタンを押してもエクセルがフリーズしてしまうという現象は、当方の環境では確認できませんでした。

      そのため、当ツールを検索対象がない場合に、「該当ありません」という旨のメッセージを表示してフィルターしないよう仕様変更しましたので、これでこ様の要望が実現できるかと思いますので、是非お試しください。

      • より:

        おはようございます。
        早急の対応ありがとうございます。
        フリーズが解消されました。
        数万件のリスト検索をしているので処理が追い付かなかったのかもしれません。
        本当にありがとうございます。

  5. yn より:

    こんにちは。
    使わせていただきたいと思い、ダウンロードさせていただきました。
    教えてください。
    2021年10月15日 10:53 AMの質問のように、R行を作業列としたく、返信の内容を行ってみましたが、上手くいきません。お手数おかけしますが、お教え願います。
    どうぞよろしくお願いします。

    • RH より:

      管理人のRHです。
      ynさん、ツールのご使用とコメントありがとうございます。

      2021年10月15日 10:53 AM時の質問が当記事を更新する前のVBAコードに対しての回答になっておりましたので、同様に記載しても上手く動かなかったものと思われます。

      本日改めてメンテナンス性が高くなるよう記事のVBAコード部分を更新しました。

      ynさんが実現したい内容(R行を作業列とする)は、当記事(2022/4/20時点)のVBAコードにおいて以下の2か所を修正頂ければ動作すると思いますので、ご確認ください。

      ・9行目を「Private Const WorkCol = “R”」に変更
      ・10行目を「Private Const WorkcolNum = 18」に変更

      上記で目的が実現できない場合は、再度ご連絡をお願いします。

      • yn より:

        ご返答いただき、ありがとうございます。
        検索出来ました!
        ありがとうございます。

        あと、もう1点だけ、お教え願いますでしょうか。
        検索範囲をD行・E行にしているのですが、それぞれ検索をかけるとちゃんと引っかかってきますが、例えば、
        D行に会社名「㈱ABC」、E行に商品名「DEF」を入力

        検索に「ABC DEF」と検索 すると、「検索対象は見つかりませんでした」と出てきました。
        and検索の意味を私がしっかり理解していないのかもしれませんが、両方引っかかるというより、それぞれの項目に引っかかると考えていいでしょうか?
        よろしくお願いします。

        • RH より:

          管理人のRHです。
          ynさん、無事使用できたようで良かったです。

          追加のお問い合わせに関して、
          ynさんが行った下記の動作はツールのルールであるAND条件としては、そのような動きになってしまいます。
          >D行に会社名「㈱ABC」、E行に商品名「DEF」を入力
          >↓
          >検索に「ABC DEF」と検索 すると、「検索対象は見つかりませんでした」と出てきました。

          AND検索というのが、「複数の条件をいずれも満たすもの」を検索結果として表示させるものになります。
          ※今回の場合ですと、一つのセルに「ABC」と「DEF」を含むセルを検索結果に出させる挙動

          ynさんがおっしゃる挙動で動かす場合は、OR検索というものになり「複数の条件のうち少なくともいずれか一つを満たすもの」を検索結果として表示させることになります。

          もし、そのような動作(OR検索)が必要でしたら、必要に応じてカスタマイズできるようにツールを変更しますので、その旨追加でコメント頂ければと思います。

          • yn より:

            ご返答いただき、ありがとうございます。
            OR検索というものがあるのですね、AND検索と混同しておりました、お教えいただきありがとうござます。

            希望としては、OR検索がしたいです。
            現在、2つのデーター用に活用させていただいています。
            1)B、D、E行
            2)B、D、E、F、G、M行
            各上記行が、検索に引っかかるように設定しています。
            ややこしくて済みませんが、お教えいただけますでしょうか?
            よろしくお願いします。

  6. RH より:

    管理人のRHです。
    ynさん、コメントありがとうございます。
    (返信できる件数の上限を超えましたので、新規でコメントします。)

    ご希望された「OR検索」ができるように改修しましたが、要望に応えられるものになっていますでしょうか。

    なお、1)B、D、E行 2)B、D、E、F、G、M行を検索対象にする場合は、以下のとおり修正していただければ動作するかと思います。
    ・VBAコードの11行目を Private Const SearchTgtCol = “B,D,E,F,G,M” に変更する。
    ・Excelファイルを再度ダウンロードしていただき、「J3」セルを「OR検索」に変更する。
     (ダウンロードできるExcelファイルを新しいバージョンに変更しました)

    一度ご確認をお願いします。

    • yn より:

      何度もご返答いただき、ありがとうございます。
      とても分かりやすくタブをつけていただいて、誰でも使いやすいようになっており、とても助かります。

      もう1点だけ、確認させてください。何度も済みません。
      複数条件に合致したものだけを抽出、としたいのですが、それはまたOR検索でもAND検索でもなく、別検索になりますでしょうか。

      例えば、B,D,F行が検索対象行とすると、Bに会社名、Dに商品名、Fに単価を入れています。検索ボックス「アマゾン 〇〇商品」と入力すると、「アマゾン 〇△商品」「楽天市場 〇〇商品」も含まれて検索結果に出てきます。
      「アマゾン」で買った「〇〇商品」の単価はいくらだったか?が出てきてほしい場合は、また違った検索になりますでしょうか。

      私の質問の仕方がイマイチなため、何度も質問重ねて申し訳ございません。
      よろしくお願いします。

      • RH より:

        管理人のRHです。
        ynさん、ご確認ありがとうございます。

        なるほど、そういうことですか、理解できず失礼しました。

        イメージとしては、項目をまたいだAND検索を行いたいという意味だと理解しました。
        おそらく、B列とD列の値が一つのセルに入ってる状態なら、AND条件で検索をすればynさんの行いたいことを実現できるのかなと思います。

        現状としては当ツールは「一つのセルに対して検索」をする機能しかないので、ynさんが行いたい仕様になっていません。

        可能なら、その機能を実現したツールを作りますので、少しお待ちいただけますでしょうか。

        • RH より:

          管理人のRHです。
          ynさんへ、項目をまたいだAND検索ができるツールを用意できましたので、以下のページからツールをご確認ください。

          https://resthill.blog/excel-vba-tool9/

          必要に応じて、表内の列等が多くなった場合などは、VBAコード内の(設定値)を変えることで対応できるかと思います。
          不明点等ありましたら、改めてコメントをください。

          • yn より:

            早々にご返答いただき、ありがとうございます。
            私こそ、上手く質問出来ておらず、大変失礼しました。
            ツール確認いたしました。とても分かりやすく、希望通りです!
            何度もお付き合いいただき、ありがとうございました。

            管理人さんのサイトで、マクロの凄さを知りました。
            マクロって、メンドクサソウ・何書いてるか分からないし、関数は分かるからそれで何とかしよう・・としていました。つまづいた結果、検索して、こちらのサイトに辿り着きました。
            他サイトと比べて、大変見やすい・分かりやすい・ど素人でも試しやすかったです。マクロを知って楽しかったので、サイトでも勉強させていただきます。
            ど素人の私に対して親身になって、迅速にお答えいただきありがとうございました!

  7. RH より:

    管理人のRHです。
    ynさん、ご返答ありがとうございます。
    (返信できる件数の上限を超えましたので、新規でコメントします。)

    ご希望通りのものを作ることができてよかったです。そしてお褒め頂き大変ありがとうございます。
    VBAマクロは細かな業務効率化をするために非常に有効な方法だと思うので、是非、当サイトも含めて色々なもので学んでいただき、日々の業務にご活用いただけたらと思います。

  8. TF より:

    管理人さま

    使い勝手がよく、作業が効率化できました。ありがとうございます。
    下記内容についてご教示頂きたく、コメントいたします。

    検索を実行すると、検索ワードに該当しない行は格納されると思いますが、
    35行目以降(初期状態は34行目まで罫線あり)にデータ入力し使用したところ、検索後に該当しない行が格納しません。(34行目までは格納される)

    35行目以降も格納できるようにしたいのですが、何か対応策はございますでしょうか?

    以上

    • RH より:

      管理人のRHです。
      TFさん、ツールのご使用とコメントありがとうございます。

      35行目以降にデータ入力した場合は、それらも検索対象と認識して、検索とフィルター解除の対象となるはずでしたが、されないようですね。

      では試しにですが、34行目の行全体をコピーして、35行目以降に貼り付けて、貼り付けた行に値を入力した状態で、「検索」をするとどうなるでしょうか。

      また、増やした行(例えば35行から40行まで増やす)の35行目のセルに値が一つも入っていない状態で、36行目のセルに値が入っていても検索対象が35行までになります。そのため途中の行で空行が存在しないようにする必要があるのですが、これも問題ないでしょうか。

      • TF より:

        管理人さま

        迅速な対応ありがとうございます。

        本件の事象について、34行目の行全体をコピペしてみたところ、問題なく動作いたしました。
        また、後述された空行の件についても問題なく動作することを確認いたしました。

        ありがとうございました。これからも当マクロを使わせていただきます。

        以上

        • 匿名 より:

          管理人のRHです。
          TFさん、コメントありがとうございます。

          問題なく動作したとのことで、安心しました。
          またお使い頂いて、何かありましたらコメント願います。

  9. hako より:

    管理人さま
    とても便利なツールをありがとうございます。
    1つ質問なのですが、AND検索を1つのセルに対してではなく1つの行に対して行うようにすることは可能でしょうか。

    もし可能でしたら、その方法を教えていただけると助かります。
    よろしくお願い致します。

    • RH より:

      管理人のRHです。
      hakoさん、コメントありがとうございます。

      申し訳ありませんが、このツールでは行単位でのAND検索には対応していません。
      >1つ質問なのですが、AND検索を1つのセルに対してではなく1つの行に対して行うようにすることは可能でしょうか。

      しかし、別のツール『テーブル内の各項目データ検索ツール』(https://resthill.blog/excel-vba-tool9/)
      でしたら、行単位でのAND検索が可能かと思うのですが、おっしゃることは実現できそうでしょうか。

      お手数ですが、一度当ツールのご確認をお願いいたします。実現したいイメージと異なる場合は改めてコメント頂ければと思います。

  10. hako より:

    管理人さま

    早速お返事をいただきありがとうございます。
    私がイメージしているものは、例えば項目にKeyword1~Keyword5まであり、その中に検索ワードの〇〇と△△が存在する行を探したいみたいな感じです。
    返信いただきました『テーブル内の各項目データ検索ツール』のやり方ですと、項目ごとに検索ワードを入れる形になるので、ちょっと違うのかなぁと。

    そのため、こちらのツールを参考にさせていただきました。
    1つの検索ボックスにいくつかワードを入れて、一致する行を探したいというのが希望です。

    もしそのようなことが可能でしたらご教授いただけると助かります。

    • RH より:

      管理人のRHです。
      hakoさん、コメントありがとうございます。

      申し訳ありません、勘違いしておりました。なるほど、そういうことですね。
      項目を指定せずセル内でなく、行内でAND検索をしたいということで理解しました。

      では、暫定的な対応ですが、既存のVBAコードの78行目~117行目を削除していただき、代わりに以下のコードを記載願います。(※コメント欄の縮小のため、コードの空行をなくしています)
      ===============================
      Dim findCnt As Long
      For Each keyword In keywordArr
      ‘検索対象の列がある分だけ繰り返す
      For iCol = 0 To UBound(tgtCol)
      tgtWord(0) = Range(tgtCol(iCol) & iRow).Value
      searchResult = Filter(tgtWord, keyword)
      If UBound(searchResult) <> -1 Then
      findCnt = findCnt + 1
      Range(tgtCol(iCol) & iRow).Font.Color = RGB(255, 0, 0)
      Exit For
      End If
      Next iCol
      Next keyword
      ‘AND検索の条件で検索する場合
      If InStr(SearchType, “AND”) <> 0 Then
      If findCnt = UBound(keywordArr) – LBound(keywordArr) + 1 Then
      Range(WorkCol & iRow).Value = “1”
      blnSearchExist = True
      Else
      Rows(iRow).Font.ColorIndex = 1
      End If
      ‘OR検索の条件で検索する場合
      Else
      If findCnt > 0 Then
      Range(WorkCol & iRow).Value = “1”
      blnSearchExist = True
      Else
      Rows(iRow).Font.ColorIndex = 1
      End If
      End If
      findCnt = 0
      Erase tgtWord, searchResult
      =================================
      これで動作するかと思いますので、一度お試しいただき、イメージと異なる場合はお手数かけますが再度コメントを頂きたくお願いいたします。

      • hako より:

        管理人RHさま

        ありがとうございます。
        私のイメージ通りです!ちゃんと動作しました!!!
        本当にありがとうございました。

        • RH より:

          管理人のRHです。
          hakoさん、コメントありがとうございます。

          イメージ通りのツールを作ることができて良かったです。
          また、ご要望等がありましたらコメントをお待ちしております。

  11. CK より:

    管理人さま

    VBAは初心者です。
    検索ツールを作りたくていろいろ検索し、これだ!と思うものに出会えて感激し、DLさせていただきました。ありがとうございます。
    1点質問がありまして、
    表のデータが増えていくのが必然なのですが、データを入れていくのは現在いわゆる表(勘違いでしたらすみません)の様ですが、こちらはデータ行が増えても取り扱いやすいテーブルにすることは可能なのでしょうか。
    もしテーブルで稼働できるのであればお教えいただけると助かります。
    よろしくお願いいたします。

    • RH より:

      管理人のRHです。
      CKさん、ツールの使用とコメントいただき、ありがとうございます。

      当マクロツールはDLできるファイルは初期状態では表形式になっていますが、表部分をテーブルに変更しても稼働するかと思います。

      実際にテーブルに変更して動かしてみて、思ったような動作がしない場合は改めてコメントいただければと思います。
      もし動作しない等ありましたらご希望の状態に改修する方法をお伝えいたします。

      • CK より:

        管理人RHさま。
        早速ご回答いただきありがとうございます。

        実際にテーブル変更して動かしてみたのですが、エラーが表示されてしまいました。
        テーブルは、表の8行目を見出し行として変換しました。
        エラーは178行目がマーキングされていて
        「RangeクラスのAutoFilterメソッドが失敗しました」
        と表示されます。
        すみません、できればテーブルにして使用したいのですが
        もし大きくコードを構築しなければならないようでしたら申し訳ないので
        以前のコメントにあった行全体をコピペして増やすことに致します。
        ご足労でないようでしたら、改修方法をご教示いただければと存じます。

        • RH より:

          管理人のRHです。
          CKさん、コメントありがとうございます。

          動作しない旨、承知しました。
          本日(2022/11/25)テーブルが使用されている場合でも動作するようソースコードを改修しましたので、改めてソースコードをコピペしてご利用いただければ幸いです。

          #改修箇所:ソースコード259行~268行目
          原因を調査したところ、作業列にあたる列がテーブルに含まれなかったことが理由だと判明しましたので、テーブルが使われていた場合は作業列をテーブル内に含むよう処理を追加しました。

          • CK より:

            管理人のRHさま

            CKです。早速ご対応いただきありがとうございます。
            正にコレ!というイメージ通り、とてつもなく重宝するツールを公開していただき感謝です。
            いろいろな場面で使わせていただきます。
            お手数をお掛け致しました。ありがとうございました!!!!!

  12. はりー より:

    いつも参考にさせていただいております。
    バーコードでの備品管理をしています。
    A列のセルにバーコードでNoを入力し右のセルにVLOOKで在庫場所や入庫、出庫状況を表示させ、いつ、誰が度のタイミングで出しているのかなどを表示させてています。

    一点ご相談なのですが、
    いろいろとデータを入れていくとき、
    A列のセルにバーコードで数字を入力したときに、その入力した数字で同時に検索をかけ、これまでの経過を表示させていくことは可能でしょうか。
    というのも、どのような払い出し経過をしているのかみたいと言われました・・・汗

    • RH より:

      管理人RHです。
      はりーさん、コメントありがとうございます。返答が大変遅くなり申し訳ありません。

      A列のセルに数字等の値を入力したときに、同時に検索をかけることは実現可能です
      現状のツールに当てはめると、A列の新規行に値を入力すると、検索ワード欄に入力した値が同時に入力されて検索まで実施されるイメージで考えていますが、合ってますでしょうか?

  13. KO より:

    いつも参考にさせていただいております。
    今回のマクロツールですと、検索ワードを入力後に検索ボタンをクリックする必要がありますが、その手間を省く方法はありませんでしょうか?(検索ワード入力欄に入力すればフィルターがかかるといった形)
    ご教授くださいますと幸いです。

    • RH より:

      管理人RHです。
      KOさん、ツールのご使用とコメントありがとうございます。

      検索ワードに値を入力してカーソルを外す(Enterやtab等を押す)だけで検索がかかるようにする方法を以下にご説明します。

      1.ツールのVBAのソースコード(このページ内にあるVBAコード)をコピーして、VBEの「Sheet2(テーブル内データ検索)」をダブルクリックして、表示された右側の欄にそのまま貼り付けします。
       ※元々「Module1」に記載されていた内容を「Sheet2」に張り直します。

      2.「Module1」に記載されていたコードは削除します。

      3.「Sheet2」に貼り付けたコードの最後に以下をコピペします。
       ===============================
       Private Sub Worksheet_Change(ByVal Target As Range)

        If Replace(Target.Address, “$”, “”) = KEYWORD_POINT Then
        Call 検索_Click
        End If

       End Sub
       ===============================

      これらをすれば検索ボタンを押さずして検索が実行されるかと思います。

      また、検索アイコンと解除アイコンを使用する場合には、改めてそれらのボタンにマクロの登録を行う必要がありますのでご注意ください。

      行ってみて思ったような動作がしない場合は改めてコメント頂ければ幸いです。

  14. kura より:

    管理人様

    お世話になります。
    こちらのツールのお陰で既存のExcelの表を検索するのが容易になり、大変助かり、感謝しきれません。
    ひとつ質問なのですが、セルないに半角カナで入力されている場合は全角カナを検索窓に入力しても検索できません。
    どうやら大文字は大文字で、全角は全角でとセル内と全く同じ書式でないと検索できない様なのですが、出来る方法はございますでしょうか。
    ご返答のほど、よろしくお願いいたします。

    • RH より:

      管理人RHです。
      kuraさん、ツールのご使用とコメントありがとうございます。

      大文字と小文字や、全角と半角を区別せずに検索する場合は、以下のご対応をお願いします。

      ・88行目と133行目の2行分を以下のように変更してください。
       searchResult = Filter(tgtWord, keyword)
        ↓
       searchResult = Filter(tgtWord, keyword, True, vbTextCompare)

      ソースコード修正後に実行し、思ったような動作がしない場合は改めてコメントいただければと思います。

  15. kura より:

    管理人様

    早速のご返答、誠にありがとうございます。
    コード修正後、検索できるようになりました。
    またわからないことがあれば、質問させていただくかもしれませんが、その際はよろしくお願いいたします。
    誠にありがとうございます。

    • RH より:

      管理人RHです。
      kuraさん、ご希望通り検索できたようで良かったです。
      また何かありましたら遠慮なくコメント等頂ければ返信いたします。

  16. うめ より:

    1つ質問させて頂きたいです。
    247行目で「オブジェクト変数またはWithブロック変数が設定されていません」というエラーが出てしまいます。
    どのように対処したらよいかご教授願います。

    • RH より:

      管理人RHです。
      うめさん、ツールのご使用とコメントありがとうございます。

      247行目の「workColNm = BaseSht.Cells(HEAD_ROW, WorkColNum).Value」でエラーになっているかと思います。
      管理人の環境では、当該エラーは発生しないため再現させることができません。
      エラーになった状況(表に入っている特異なデータ、どの操作をした場合にエラーが出るか)をもう少し詳しく教えていただけるとエラー発生原因が分かるのですが、説明頂くことは可能でしょうか。
      例)検索する値に日付を入れて検索ボタンをクリックしたときに発生する。等

      または、デバッグ(エラーが発生した箇所とそのあたりで使用されている変数の値を調べる等)していただければ原因発生の理由に近づくのですが、いかがでしょうか。

      それかもし可能でしたら、「お問い合わせフォーム」よりご連絡いただければ個別に原因追及等の対応をいたしますので、ご検討ください。

      • うめ より:

        こちらからコメントしたのにも関わらず、日数が経ってしまい申し訳ありません。

        RH様が用意してくださったサンプルをダウンロードして、そこにソースコードを追加し、ユーザーフォームの実行を押すとエラーになってしまいます。
        検索する値などはいれていないです。
        Excel2016で行っています。

        お問い合わせフォームの場所が分からず、コメントでの返信となってしまいました。申し訳ありません。

        • RH より:

          管理人RHです。
          うめさん、ご返答ありがとうございます。

          実施頂いた内容で少し気になったのが、マクロを実行する際に「ユーザーフォームの実行を押した」というところです。
          このツールを実行させるには、本来は検索ワード欄の右にある(虫眼鏡マーク)をクリックするか、またはその右にあるグレイのアイコンをクリックします。

          試しに実施していただきたいのですが、上部リボンの「開発」タブ→「マクロ」→「検索_Click」を選択して「実行」を押していただくと、エラーは起こりますでしょうか。

  17. chika より:

    マクロの知識がなければやったこともないまま、簡単に入れられたこちらのデータを利用させていただいております。
    かなり初歩的な質問なのですが、データをマクロ有効ブックで保存し閉じ、再び開いたときにマクロが無効化されていますという表記が上に出てきたので、有効にするというところをクリックした後に検索かけると
    実行エラー”1004″ ‘Rangeメソッドは失敗しました’ ’_Global’オブジェクト
    という表記が出てデバッグをクリックすると
    Range(Head Cell Point).AutoFillter
    という部分が黄色くマーカーされている状態です。(検索はかけられないまま)

    マクロ知識以前の問題かもしれませんが、常に開いただけで検索がかけられる状態にすることはできますでしょうか。このような表記が出てしまう原因と改善方法を教えていただけますと幸いです。
    わかりにくい文章で申し訳ございません。よろしくお願いいたします。

    • RH より:

      管理人RHです。
      chikaさん、ツールのご使用とコメントありがとうございます。

      いえいえ、Excelマクロなどを知らずに使えることをモットーにしていたのに簡単に使えず申し訳ないです。

      おっしゃっていただいた内容は、当方の環境では再現できないですが、現象は承知しました。

      試しにですが、VBAソース上の
      56行目と205行目の「Range(HeadCellPoint).AutoFilter」の2か所を「BaseSht.Range(HeadCellPoint).AutoFilter」に変更して動作させてみるといかがでしょうか。

      ソースコード修正後に実行し、思ったような動作がしない場合は改めてコメントいただければと思います。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です