• ベストアンサー

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

  • fgetsでcsvファイルを読み込めなくなる!?

    fgetsでcsvファイルを読み込めなくなる!? Cを使って、csvをfgetsで読み込むプログラムを作っています。 実際に製作し、csvファイルを(A.csvとします)読み込むことができました。 しかしデスクトップ上で 「新規作成」 →「txtファイルを作成」 →「拡張子を.csvにし、csvファイル(B.csv)を作成」 →「Aの中身をコピーし、Bにペースト」 を行い、B.csvを読み込もうとすると、 読み込むことができません(正確には文字化けした、単語が数文字表示される) これは何が原因なのでしょうか? ご教授お願いいたします。

  • EXCEL- VBA(CSVファイル→インポート)

    A列~F列になる複数(100個以上)のCSVファイルをエクセルファイルにインポートして更に個別にエクセルファイルとして保存したいのですが VBAでできるのでしょうか? 記憶マクロでやったらどうにもうまくいきません。 エクセルのVBAについては ほとんど知識ゼロなので困っております。 大変厚かましくありますが どなた様かご教授お願いできたらと思います!! 【元のファイルの状態】   ◆ファイル名「*.CSV」*は文字数それぞれ違います。   <例:tanaka.xls だったり 09福島.xls>  ◆入っているドライブ   TEXT;C:\Documents and Settings\AA_B\デスクトップ\練習  ◆A~F列にデータが入っている 【やりたいこと】    (1)A~F列はカンマ区切りで全て文字列としたい  (2)元のファイル名でエクセルとして保存したい「*.XLS」

  • VBスクリプトでcsvファイルを比較

    別々のCSVファイルがありますが同じ形式にしておいて、 a.csv a,b,c b.csv d,e,f aとd、bとe、cとfと順番に比較する方法を教えて頂けますでしょうか。

  • エクセルファイルの1レコード(1行)を1csvファイルへ変換マクロ

    エクセルファイルの1レコード(1行)を1csvファイルへ変換し、エクセルファイルにあるレコード数分だけあるフォルダに自動作成するマクロを教えて下さい。 因みに、csvファイル名は、エクセルデータの『a列.csv』となるようにしたいです。 【例】 本日2007/11/13 ○○.xls A列 B列 C列 111 1 356 13 1 2 ・ ・ ・ ・ ・ ・ 111.CSV "2007/11/13(火)","1","356,"","","" 13.CSV "2007/11/13(火)","1","2,"","","" 変換後のcsvの中身は 1列目に、本日の日付 2列目に、1 3列目に、変換元のエクセルファイルの3列目 4、5、6列目に空白 という形式です。 どなたかお分かりになるかた、ご教授願います。

  • エクセルVBA、他のファイルからのコピー

    BBA初心者です aaa.xlsのマクロで aaa.xls にbbb.csvのデータを貼り付けたいのですが Sub () Windows("bbb.csv").Activate…ここのbbbってところをセル参照にしたいのです ActiveCell.Range("A1:A10").Select Selection.Copy Windows("aaa.xls").Activate ActiveSheet.Paste End Sub 1つ上のセルにbbbと入力されていればbbb.csvのデータを 1つ上のセルにcccと入力されていればccc.csvのデータを 貼り付けれるようなマクロはどう書けばいいのでしょうか よろしくお願いします

  • csv形式のテキストファイルをexcelでCSV化するマクロについて

    今、ひとつのフォルダに大量にCSV形式で保存されているテキストファイルを excelのマクロを使って、ひとつのexcelにCSV形式(.xls)で保存するものを作成している のですが、今までマクロを使ったことがないため、まったく歯が立ちません。 もう少し詳しく書くと、テキストファイルの中身は、 01,54521,18:01:02,110230 というようになってます。 これを、excelのマクロを使い、カンマ区切りで取り込むような感じです。 すみませんが、回答お願いいたします。

  • 複数のexcelファイルの置換について

    AAA.xlsというファイルの中の情報を複数のexcelファイル(A.xls、B.xls、C.xls、D.xls)でリンク付けしてあるとします。 AAA.xlsをBBB.xlsに名前を変更するとリンクが成り立たなくなってしまいます。 そこで、一括でリンクを変更する方法を教えてください。 マクロでもいいです。 =[AAA.xls]Sheet1!$A$1 これを =[BBB.xls]Sheet1!$A$1 に一括変更したいのです。 よろしくお願いします。

  • csvファイルを取り込み指定の形式にする

    EXCELでcsvファイルを取り込み指定の形式にして、csvファイルとして 保存するマクロを組みたいです。 途中までマクロの記録機能を使い作ったものです。 Sub csvファイルの取り込み() 'Windows("a.csv").Activate '←ここでファイルを選択する形式にしたい。 Columns("C:H").Select Selection.ClearContents Columns("A:A").Select Selection.Delete Shift:=xlToLeft Range("A1").Select ActiveCell.FormulaR1C1 = "Number" Rows("2:2").Select Selection.Delete Shift:=xlUp Rows("1:1").Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="<>C*", Operator:=xlOr, _ Criteria2:="=C1*" ', Operator:=xlOr, Criteria2:="=AABC*" Rows("4:13").Select '←ここをフィルタで選択された行を削除するように変更したい。 Selection.Delete Shift:=xlUp Selection.AutoFilter Field:=1 Range("A1").Select End Sub マクロの流れとして ・まずcsvファイルを取り込む ・C列からH列までを削除(もしくは数値をクリア) ・その後、A列を削除 ・A1セルに文字があるのでその文字を"Number"に変更 ・A列にある指定の文字列をフィルタで抽出してその行を削除  (抽出文字列は以下の3パターン。) Cで始まらない文字を抽出 or C1で始まる文字を抽出 or AABCで始まる文字を抽出 ・以上の作業を終了したら取り込んだファイル名の 左から11文字+"ABC"の文字をあわせてファイル名として CSVファイルで保存する 長くなってすいません。助けてください

  • excelマクロ 別ファイルの特定列をコピーしたい

    C:\testの配下にexcelファイル「aaa.xls」「aaa_yyyymmdd.xls」「bbbxls」があります。 「aaa_yyyymmdd.xls」は「aaa.xls」のバックアップファイルです。 又、「bbbxls」にマクロを記述しようと思います。 ☆処理内容☆ 「aaa.xls」「aaa_yyyymmdd.xls」が開いていない状態で、「aaa.xls」のシート「sheet1」内の E列をコピーして「bbbxls」のシート「sheet3」のA列に貼り付け。 「aaa_yyyymmdd.xls」のシート「sheet1」内の E列をコピーして「bbbxls」のシート「sheet3」のB列に貼り付け。 その後、張り付けたA列を正としB列と比較して、差異があった場合はB列の差異があった部分の セルに色つけをした後、「aaa_yyyymmdd.xls」をC:\test:\oldフォルダに移動する。 上記のようなexcelマクロを作成中なのですが、できなくて困っております。 有識者の方、助けを貸してください。 よろしくお願い致します。

  • Excel2003でcsvの指定行を読み込む

    こんにちわ。 Excel2003のマクロでcsvファイルを読み込みたいと思っています。 csvの中身は下記通りです。 例)   A   B   C   D.......... 1  "氏名" 2  2    2   1   3....(整数の羅列) 3  1    3   2   3....(整数の羅列) 4  3    3   3   3....(整数の羅列) 5  2   1   2   3....(整数の羅列) このファイルを、エクセル上でボタンを押したら(マクロを実行したら)指定した行のみを読み込んで、それをエクセルのシートの指定したセルに代入するのは可能でしょうか?それぞれの行の整数の数は違います。

専門家に質問してみよう