【Excel VBA】表内のデータ簡単検索ツール(コピペですぐ使える)

 

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

 

その際には、エクセルの表やテーブルで管理しているデータを検索するときにエクセル機能の「検索」を利用していましたが、検索結果として検索条件と大量に一致した際に一つずつの確認がしにくいと感じたので、検索結果が見やすい『表内のデータ簡単検索ツール』をExcelマクロで作成しました。

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

 

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

 

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

 

 

<ツールの更新履歴>

(2022年5月13日:更新) 

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

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

(2022年9月23日:更新) 

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

・ツール全体のUIを変更

 

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

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

 

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

 

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

説明動画

 

当ツールの使用方法

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

1.表内データ簡単検索ツールのVBAコードを含んだExcelファイル(***.xlms)を開きます。

2.対象の表内に検索対象とするデータを入れ込んだ状態にします。

 

3.「検索ワード」の欄に検索したい文字を入力して「検索」ボタンを押す。

 

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

 

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

 

留意事項

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

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

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

 

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

 

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

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

 

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

 

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

 

検索対象の列について

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

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

 

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

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

<項目を減らす場合>

 

<項目を増やす場合>

 

使用する際の事前準備

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

 

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

 

準備の手順

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

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

 

2.Excelを開き、「開発」タブをクリックして、「Visial Basic」をクリックします。

 

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

 

4.新しくできた「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
    
    '最終列の項目名が「作業列」でない場合は作業列を新たに作る
    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 Columns(WorkColNum).Hidden <> True Then Columns(WorkColNum).Hidden = True
    
    WorkCol = Split(Cells(1, WorkColNum).Address, "$")(1)
    HeadCellPoint = Split(Cells(1, HEAD_COL_NUM).Address, "$")(1) & HEAD_ROW
    DataCellPoint = Split(Cells(1, HEAD_COL_NUM).Address, "$")(1) & HEAD_ROW + 1
    
    '検索条件を取得する
    SearchType = SettingSht.Range(SEARCH_TYPE_POINT).Value
    
    '条件の対象を取得する
    TargetType = SettingSht.Range(TARGET_TYPE_POINT).Value
    
End Sub

 

5.ファイルを保存する際は「Excelマクロ有効ブック」を選択して、保存します。

 

6.「検索ボタン」と「オートフィルター解除ボタン」のそれぞれにマクロを設定します。

検索ボタン

 

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

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

 

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

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

 

また、このようなExcelVBAを用いた業務効率化を行うときに、以下の書籍が初心者向けでとても参考になると思いますので、良かったらご参照ください。

 

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

 

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

 

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

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

 

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

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

 

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

 

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

【Excel VBA】表内のデータ簡単検索ツール(コピペですぐ使える)” に対して31件のコメントがあります。

  1. より:

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

    1. 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:=”<>“」に変更

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

      1. より:

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

        1. RH より:

          管理人のRHです。

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

  2. より:

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

  3. より:

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

    1. RH より:

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

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

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

  4. より:

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

    1. RH より:

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

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

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

      1. より:

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

  5. yn より:

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

    1. 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」に変更

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

      1. yn より:

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

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

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

        1. RH より:

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

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

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

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

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

          1. 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ファイルを新しいバージョンに変更しました)

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

    1. yn より:

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

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

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

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

      1. RH より:

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

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

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

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

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

        1. RH より:

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

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

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

          1. yn より:

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

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

  7. RH より:

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

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

  8. TF より:

    管理人さま

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

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

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

    以上

    1. RH より:

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

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

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

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

      1. TF より:

        管理人さま

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

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

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

        以上

        1. 匿名 より:

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

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

  9. hako より:

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

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

    1. RH より:

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

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

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

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

  10. hako より:

    管理人さま

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

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

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

    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
      =================================
      これで動作するかと思いますので、一度お試しいただき、イメージと異なる場合はお手数かけますが再度コメントを頂きたくお願いいたします。

      1. hako より:

        管理人RHさま

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

        1. RH より:

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

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

コメントを残す

CAPTCHA