- ベストアンサー
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 が表示される。 どなたか知恵をお貸しいただけないでしょうか。
- みんなの回答 (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)
そのものずばりの機能はMicrosoft Queryです CSVファイルからでもクエリが作成できます クエリの作り方はここで書くにはちょっと膨大。 ヘルプを読んでください 検索したい文字をその都度変更するにはパラメータクエリにします
- hana-hana3
- ベストアンサー率31% (4940/15541)
>が表示される。 なら、「検索」では無くて、オートフィルタの方が良いのでは?