見出し画像

Excel【Csvファイル】を検索する

Csvファイル内のデータを調べる方法について紹介します。

Csvファイル検索方法

サンプルデータとして、【 売上管理表 】で解説していきます。
検索データ:【 品目 = みかん 】

売上管理表.csv

◇Excelの検索機能を使う

まずは、CsvファイルをExcelのシートに表示させます。
CsvファイルをExcelに取込方法は、前回紹介しました
「テキストデータ取込」でも出来ます。

今回は、CsvファイルをExcelでそのまま開きます。

Excelシート

リボン「ホーム」の中の「検索と選択」
または、「Ctr + F」で検索します。

Excelリボン

「みかん」の検索結果が5件ありました。

◇Excelオートフィルタを使う

Excelリボン
フィルタを「みかん」で絞る
検索結果

オートフィルタでも、該当が5件ありました。

では、そのデータの使用を考えたとき、以下の方法になります。
・検索結果を別シートに貼付し、計算式で必要なセルに連携させる
・検索結果の必要な値を必要なセルに貼付する
・検索結果を必要なセルに手入力する

◇マクロを使う(VBA開発)

ワークシートに「検索キー」を入力できるセルを作成し、
検索結果を表示するようにします。

検索キーに「品目」を入力

標準モジュール(CsvSqlRead)

Sub CsvSqlRead()
    Dim clsSql As clsSqlRead
    Dim strFileName As String
    Dim Ws As Worksheet
    Dim strPath As String
    Dim FDir As String
    Dim sttTime As Double
    Dim endTime As Double
    Dim prsTime As Double
    Dim clsTm As clsTimer
    Set Ws = ThisWorkbook.Worksheets("Sheet1")
    Set clsSql = New clsSqlRead
    Set clsTm = New clsTimer
    
    sttTime = clsTm.startTime
    strPath = Application.ThisWorkbook.Path & "¥"
    strFileName = "売上管理表.csv"
    
    Call clsSql.OpenDataBase(strFileName, strPath)
    endTime = clsTm.endTime
    
    prsTime = clsTm.processTime(sttTime, endTime)
    Ws.Range("E1").Value = prsTime
    
    MsgBox "csv取込完了!"
    Set clsSql = Nothing
End Sub

クラスモジュール(clsSqlRead)

Public Sub OpenDataBase(ByVal tgtCsv As String, ByVal FlePth As String)
On Error GoTo PROC_ERR
    Dim cn          As New ADODB.Connection
    Dim rs          As New ADODB.Recordset
    Dim sEXTENDED   As String
    Dim sSrcDir     As String   ' 接続先フォルダ'
    Dim sSql        As String   ' SQL'
    Dim oWs         As Worksheet
    Dim EndRow      As Long
    Dim NxtRow      As Long
    Dim Hed         As Variant
    
    sSrcDir = FlePth
    Set oWs = ThisWorkbook.Sheets("Sheet1")
    
    ' プロパイダの設定'
    cn.Provider = "Microsoft.ACE.OLEDB.12.0"    ' Office 2007 以降

    ' 読み込むファイルの格納フォルダのパス'
    cn.Properties("Data Source") = sSrcDir
    
    ' その他のプロパティの設定'
    sEXTENDED = "text"
    sEXTENDED = sEXTENDED & ";FMT=Delimited"
    sEXTENDED = sEXTENDED & ";HDR=Yes"
    cn.Properties("Extended Properties").Value = sEXTENDED
    
    ' 接続開始'
    cn.Open
    If IsEmpty(oWs.Range("B1").Value) = False And IsEmpty(oWs.Range("B2").Value) = True Then
        sSql = "SELECT * FROM [" & tgtCsv & "] " & _
                    "WHERE 品目 = '" & oWs.Range("B1").Value & "' ;"
    End If
    If IsEmpty(oWs.Range("B1").Value) = True And IsEmpty(oWs.Range("B2").Value) = False Then
        sSql = "SELECT * FROM [" & tgtCsv & "] " & _
                    "WHERE 仕入日 = #" & oWs.Range("B2").Value & "# ;"
    End If
    If IsEmpty(oWs.Range("B1").Value) = False And IsEmpty(oWs.Range("B2").Value) = False Then
        sSql = "SELECT * FROM [" & tgtCsv & "] " & _
                    "WHERE 品目 = '" & oWs.Range("B1").Value & "' " & _
                    "AND 仕入日 = #" & oWs.Range("B2").Value & "# ;"
    End If
    ' SQL実行'
    rs.Open sSql, cn
    
    If rs.EOF Then
        ' 結果が1行もない場合終わり'
        GoTo PROC_EXIT
    End If
    
    EndRow = oWs.Cells(Rows.Count, 1).End(xlUp).Row
    NxtRow = EndRow + 1
   
    ' 結果をそのまま表示'
    oWs.Cells(NxtRow, 1).CopyFromRecordset rs
    
    rs.Close
    cn.Close
    
PROC_EXIT:
    On Error Resume Next
    ' 後処理'
    Set rs = Nothing
    Set cn = Nothing
    
    Exit Sub
PROC_ERR:
    MsgBox "ADO接続(CSV/TEXT)エラー:" & Err.Description & "(" & Err.Number & ")" & vbCrLf & sSrcDir, vbCritical
    GoTo PROC_EXIT
End Sub

セルB1に検索キー「みかん」を入力し、実行します。

検索結果

検索時間は、0.2秒でした。

検索キー「仕入日」を増やしてみます。
セルB2に検索キーを入力するようにします。
品目は「みかん」、仕入日は「10月25日」で検索してみます。

検索キーは「品目、仕入日」

検索時間は、0.2秒弱でした。
ちゃんと検索できました。

Csvファイル検索方法について紹介しました。
次回は、検索結果の活用編を紹介します。