• ベストアンサー

CSVファイルとの比較について

『test.csv』というファイルの中から、『aaa』を含む文字を表示させたいです。 『main.xls』で『aaa』等の文字を指定し、マクロを動かします。 test.csvの中身が   A     B     C 1 aaabbb 2 bbbccc 3 cccddd 4 aaaccc 5 aaaddd となっているとして、 main.xlsで 検索したい文字を『aaa』と指定すると、   A     B     C 1 aaabbb 2 aaaccc 3 aaaddd が表示される。 どなたか知恵をお貸しいただけないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。KenKen_SP です。 Excel ならオートフィルターかフィルタオプションを使えば VBA は必要 ありません。高速ですしね。が、、、VBA でやってみました。 VBA とは言え、やはり一度 Excel で CSV を開いて、オートフィルター で抽出する...というのが定番なのですが、今回は少々特殊な方法で実装 してます。(済みません...私の実験も兼ねてるので(;´・ω・`)σオイ.. ) オートフィルターのようにカラム単位で柔軟な抽出条件を設定できるわけ ではありませんが、変わりに AND 検索のキーワード数は無制限です。 注意1. 500,"\123,456","abc" のような桁区切りカンマのある CSV は     処理できません。 注意2. 結果出力の際にシート上のデータを消去します。 【実行手順】 1. 標準モジュールに下記ソースをコピペし、ブックを保存 2. 同一フォルダに Sample.csv を用意   ※ファイル名等を変更する場合は、ソースコードの「初期化」    と書かれた部分を修正します 3. A1 セルに適当なキーワードを入力します   ※スペース区切りで複数キーワードの AND 検索を行います 4. マクロ[ SearchFromCsv ]を実行します ' CSV データ抽出サンプル Sub SearchFromCsv()   Dim sCsvFilename As String   Dim rTarget   As Range   Dim sKeywd    As String   Dim vKeywd    As Variant   Dim sBuf     As String   Dim vTmp     As Variant   Dim vData    As Variant   Dim lCol     As Long   Dim n      As Integer   Dim i      As Long   ' 初期化 --------------------------------------------------------   With ThisWorkbook     ' Csv ファイルパス     sCsvFilename = .Path & "\Sample.csv"     ' 抽出条件     sKeywd = ActiveSheet.Range("A1").Value     ' 抽出結果の出力先セル     Set rTarget = ActiveSheet.Range("A3")   End With   ' Csv ファイル存在確認 -------------------------------------------   If Dir$(sCsvFilename) = "" Then     Set rTarget = Nothing     Exit Sub   End If   ' 抽出条件解析 ---------------------------------------------------   sKeywd = Replace$(Trim$(sKeywd), " ", " ")   vKeywd = Split(sKeywd, " ")   ' Csv ロード -----------------------------------------------------   On Error GoTo ERROR_HANDLER   n = FreeFile()   Open sCsvFilename For Binary Access Read Lock Read Write As #n      sBuf = String$(LOF(n), vbNullChar)      Get #n, , sBuf   Close #n   On Error GoTo 0   ' データ抽出 -----------------------------------------------------   vData = Split(sBuf, vbCrLf)   For Each vTmp In vKeywd     vData = Filter(vData, vTmp, True, vbTextCompare)   Next   ' 転記先のセルをクリアして結果出力 -------------------------------   Application.ScreenUpdating = False   Range(rTarget, rTarget.Parent.Cells(Rows.Count, "A")).EntireRow.Clear   i = 0   For Each vTmp In vData     vTmp = Split(vTmp, ",")     lCol = UBound(vTmp)     If lCol > Columns.Count Then lCol = Columns.Count     rTarget.Offset(i).Resize(1, lCol).Value = vTmp     i = i + 1   Next   ' 後処理 ---------------------------------------------------------   Set rTarget = Nothing   Application.ScreenUpdating = True   Exit Sub ERROR_HANDLER:   Close #n   MsgBox Err.Description, vbCritical End Sub

その他の回答 (2)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

そのものずばりの機能はMicrosoft Queryです CSVファイルからでもクエリが作成できます クエリの作り方はここで書くにはちょっと膨大。 ヘルプを読んでください 検索したい文字をその都度変更するにはパラメータクエリにします

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>が表示される。 なら、「検索」では無くて、オートフィルタの方が良いのでは?

関連するQ&A