• 締切済み

Excelマクロで外部csvを読み書きする方法

EXCELマクロ初心者です。 ネットでの情報を元にお勉強しつつ、 仕事でマクロを利用しているのですが、 行き詰ってしまったため、お知恵を貸して頂きたく質問しました。 質問をすること自体、不慣れなため 情報不足の場合はご指摘いただければと思います。 ---------- ▼行いたいこと   ・マクロを記述した【A.xls】の【シート1】に、抽出するためのキーワードを入力   ・情報が入っている【B.csv】を参照し、キーワードが    合致した情報を行ごと抽出し、【A.xls】の【シート2】に書き込みしていく ------------ ▼画像添付の説明   ・上の画像 は【A.xls】の【シート1】のキーワード入力イメージ   ・下の画像 は【B.csv】の【シート1】内容。    実際は数万件あるなかから、検索して書き出したいと考えています。    写真上の項目は4項目ですが、実際は16項目ほどあります。 ------------ ▼補足説明   ・キーワードは【A.xls】の【シート1】A行にどんどん入力していく予定です   ・【B.csv】の情報の中で、キーワードは必ずA行に入っています   ・【B.csv】の情報の中で、キーワードに合致するのは、必ず1件のみです   ・まれに【B.csv】の情報の中で、キーワードに合致しない場合があります。    その場合は、何らかの形でわかればと思います ---------- 文章が苦手で非常に分かりにくいかとは思いますが ご教授いただければ幸いです。 どうか宜しくお願い致します。

みんなの回答

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.4

あ、なるほど。Excelで確認できるファイル区分データがないので、 1セル当たりの文字数が超過してるんですね。 だとすると、開くのにこちらのような「テキストファイルを開く」手順で データの区切り位置を外部指定して開くしかないです。「開く作業」は マクロのキー記録で記録できますので、次のファイルからはマクロで 動作させることができます。 http://www.d-ic.com/tool/txtfile_open/

piyoko_a
質問者

お礼

回答が遅くなってしまい、大変失礼いたしました。 教えて頂いた方法で開いてみたのですが、 私の操作が悪いのか、EXCELのバージョンが悪いのか うまく開くことができませんでした。 ですが[区分データ][1セルあたりの文字数超過]など 気になるキーワードを記載いただけていたので、 引き続き、自分で調べてみようと思います。 こんな初心者にお時間を割いていただき、ありがとうございます。 本当に感謝いたします。

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.3

開けないならファイルが壊れているか、正しいフォーマットで 記録されてないわけですから、Excelで読み取れないと思い ますけど。 VBAで処理できるのは、Windows上で正しく開けるファイル だけです。なので、とりあえず「メモ帳」では開けますか?

piyoko_a
質問者

お礼

お返事が遅くなってしまい、失礼いたしました。 下記にもお返事をいただいておりましたが、 とりあえずこちらで、その後の経過をご報告させてください。 結果として自分の行いたかったことはできなかったのですが Libreoffice にて短時間でファイルを開けることがわかり 現在、上記ソフトにて vlookup を行っている状況です。 今後も色々と調べて、改善していきたいと思います。 こんな見ず知らずの私の質問に、貴重なお時間を 割いていただき、本当にありがとうございました。

piyoko_a
質問者

補足

お忙しい中、回答頂きありがとうございます。 メモ帳で試しに数ファイル開いてみましたが、全て開くことができました。 【B.csv】の数項目が、1つのセルに最大8500文字ほど入っており それが数千行続いています。 このデータ量が原因で「ファイルを開く」などの処理に時間がかかる、 またはエラーになってしまうのかと、考えていました。 ※エラーになる場合は、5分以上かかる読み込みに   私が耐え切れずクリックなどをしてしまう場合におきます。 良い改善方法を模索しています。どうか宜しくお願い致します。

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.2

ちょこちょこっと書いてみました。 処理速度を考えず、コードのわかりやすさを第一にしています。 A.xlsのキーワードの先頭位置にカーソルを合わせて処理を開始 してください(ほかのカーソル位置だと処理が変になります)なお、 キーワードの最終行。レコードの最終行は必ず「空白」であること が、この処理の前提になっています。 Sub Macro1() Do Data = Selection.Value Windows("B.csv").Activate Range("A1").Select Do If Selection.Value = Data Then Data2 = Selection.Offset(, 1).Value 'この位置で順に該当するレコードの全データを取得する Windows("A.xls").Activate Selection.Offset(, 1).Value = Data2 'この位置で順に該当するデータをキーワードの横に全部書き出す Exit Do End If Selection.Offset(1).Select If Selection.Value = "" Then Windows("A.xls").Activate Selection.Offset(, 1).Value = "相手なし" 'キーワード相手なしのメッセージを出力 Exit Do End If Loop Until Selection.Value = "" Selection.Offset(1).Select Loop Until Selection.Value = "" End Sub

piyoko_a
質問者

お礼

お返事が遅くなってしまい、失礼いたしました。 結果として自分の行いたかったことはできなかったのですが Libreoffice にて短時間でファイルを開けることがわかり 現在、上記ソフトにて vlookup を行っている状況です。 今後も色々と調べて、改善していきたいと思います。 こんな見ず知らずの私の質問に、貴重なお時間を 割いていただき、本当にありがとうございました。

piyoko_a
質問者

補足

回答いただきありがとうございます。 私の知識として存在しない単語がたくさんあり 驚くばかりです。VBAは難しいですね… 本当にありがとうございます。 実は【B.csv】なのですが、ファイルを開くのに 数分~エラーで開けないという状況となります。 そのため、【B.csv】を開くことなく処理ができればと考えていました。 一番重要な情報を記載せず、申し訳ございませんでした。 もし解決方法があれば、教えて頂ければ幸いです。 何度もお手数をおかけいたします。 すみません、宜しくお願い致します。

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.1

VBAを使わなくていいのなら、「ブックBのA列を昇順でソート しておき、ブックA側でVLOOKUP関数を使えば一発で済む」 話ですけどね。どうしてもVBAを使いたいんですかね? そうなら、ブックAのセルA1を選択している状態で Data=Selection.value と値を取得しておき、ブックBのセルA1から順にDataと同じか をチェックすればいいだけの話だと思います。処理時間はかかり ますが、一件ずつ処理するのが、コードは分かりやすいかと。

piyoko_a
質問者

お礼

お返事が遅くなってしまい、失礼いたしました。 結果として自分の行いたかったことはできなかったのですが Libreoffice にて短時間でファイルを開けることがわかり 現在、上記ソフトにて vlookup を行っている状況です。 今後も色々と調べて、改善していきたいと思います。 こんな見ず知らずの私の質問に、貴重なお時間を 割いていただき、本当にありがとうございました。

piyoko_a
質問者

補足

回答いただきありがとうございます。 実は【B.csv】なのですが、ファイルを開くのに 数分~エラーで開けないという状況となります。 そのため、【B.csv】を開くことなく処理ができればと考えていました。 一番重要な情報を記載せず、申し訳ございませんでした。 もし解決方法があれば、教えて頂ければ幸いです。 何度もお手数をおかけいたします。宜しくお願い致します。

関連するQ&A

  • エクセルのマクロについての質問です。

    ファイルA.xls __A__B__C 1_______1 2_______5 3_______7 4_______4 5_______5 6_______6 ファイルB.csv __A__B__C 1_1__5 2_5__6 3_7__7 ファイルC.csv __A__B__C 1_6__5 2_7__8 3_6__8 のような3つのファイルがあったとして ファイルA.xlsからマクロを実行して __A__B__C 1_1__5__1 2_5__6__5 3_7__7__7 4_6__5__4 5_7__8__5 6_6__8__6 ファイルB.csvをファイルA.xlsのA列とB列に ファイルC.csvをその下の最終行に貼り付けたいと思うのですが どのようにすればいいのでしょうか? 注意点としては、 (1)今は例として3行、3行の6行ですが、実際は1000行以上あり 毎回行数は変わります。 (2)ファイルA.xlsのC列には実際は関数が入っていて、 ファイルB.csvとファイルC.csvを張り付けた情報を計算して表示する ようになっています。

  • エクセルのマクロを知りたい

    エクセルで,たくさんのデータが入力された【シートa】があります。 新しく【シートb】を作成して,そこに空白の表(1)~(10)までを作成します。 (ちなみに表(1)は1行から始まり100行まで,表(2)は101行から始まり200行まで・・・・といった感じです) 【シートb】の表(1)には,【シートa】でA列に「1」が入力されているデータを抽出して,それをB列の昇順に並べて記入しなさい。同様に,表(2)には,【シートa】でA列に「2」が入力されているデータを抽出して,それをB列の昇順に並べて記入しなさい。・・・というのを表(10)まで続けます。 上記のような命令をボタン一つで操作できるようなマクロを教えて欲しいのです。 お願いします。

  • エクセルマクロの質問です。

    例えば、A.xlsというファイルに01.csv,02.csv,・・・,20.csvといういくつかのファイルからデータを取り出すのですが、A.xlsのシート1の1列目に01.csvの1列目を貼り付けて、01.csvの2列目はA.xlsのシート2の1列目に貼り付けるようにシートをずらして行って、02.csvの1列目はA.xlsのシート1の2列目、02.csvの2列目はA.xlsのシート2の2列目というようにしたいのですが、どのようなプログラムがよいのでしょうか? エクセルマクロ初心者なので説明が不十分かも知れませんがよろしくお願いします。

  • Excelのマクロについて

    エクセルのまくろについて教えてください。 私が今やろうとしているのはsheet1に表を作成し、sheet2に見積書を作成します。 見積書に載せる項目はsheet1の表の中から抽出したいです。 そのときの条件としては、sheet1での表の中の計算結果が、  項目  計算結果   A    1   B    0   C    8 このような場合のときに計算結果が「0」になったものの項目はsheet2の見積書の項目には反映しないようにしたいです。 このようにするとsheet2での見積書は作成する条件によって行数が変わるようになります。 なので、自動的に見積書の行を増やしたりなくしたりするようなマクロを組みたいのです。 Excel2000です。 長々と書きましたがよろしくお願いします。

  • EXCELでCSVファイルの読込み

    VBA超初心者でとても困っています。 仕事でEXCELのVBAを使って 現在開いているシートの中に 1つのCSVファイルからデータを読み込むのですが CSVデータの2行目をEXCELのC2へ。 4~10行目までを、EXCELのB5~B14へ マクロを使い、ボタン一つで自動入力させたいのです・・・。 Line Input も、やり方が悪いのかうまくいきません。 ヒントとなるやり方があればぜひ教えてください。

  • マクロ作成方法を教えて下さい。

    抽出マクロを組みたいのですが、うまくできません。 目的)多数の項目の中で、抽出を2回行い、FAXフォーマットにデータが抽出する。以前まで目検や手書きをしていた事を、マクロを使用し簡素化しようと考えています。 項目1 項目2 項目3 項目4 4119 A  11   12 2174 A  11   11 1410 D  12 4152 C  11   12 4152 B  11   11 4155 G  12      (1)項目2で A,B,C,Dであれば別シートへデータごと抽出する (2)(1)の抽出データで項目4が12且つ、項目3が11であれば、別シートへ抽出 (3)(1)の抽出データで項目3が11であれば、別シートへ抽出 (4)(2)、(3)それぞれFAXフォーマットへデータのコピーの貼り付けをする 以上となります。

  • エクセルのマクロで」・・・

    マクロの超初心者です。 1度研修で習った程度です。 a.xlsというブックでマクロを動かし、 既にいくつかシートがあるb.xlsを開いて最後のシートの次に新しいシートを作り、 既にあるc.xlsの1つ目のシートにあるデータをb.xlsの新しく作ったシート に貼り付け、b.xlsとc.xlsのブックは閉じるようにすることはできますか?(b.xls,c.xlsは最初閉じている) どのような感じにa.xlsでマクロを組めばよいのでしょうか? 今起動しているブックではないブックを起動したりできるのかも不明です。

  • エクセルVBAでCSVファイルから取り込みたいのですが・・・

    CSVファイルのデータを取り込むコードを教えていただけないでしょうか。 「共有フォルダ」の中に「作業用.xls」と「090820.csv」があります。csvファイルは日によって名前が変わりますが、必ず一つしか入れないことにしています。 CSVファイルの1行目は見出しです。2行目以降がデータになっています。 A2からI列最終行を「作業用.xls」のsheet1のA6にコピー(取り込み)したいのですが、よろしくお願いします。

  • 複数のcsvファイルをマクロ(VBA)で取り込みたい

    複数のcsvファイルをマクロ(VBA)で取り込みたい csvファイルの中身が、 20090507 120508 osaka 項目1,項目2,項目3,・・・・・,項目10 a1,a2,a3,・・・・・,a10 b1,b2,b3,・・・・・,b10 c1,c2,c3,・・・・・,c10 や 20090507 132529 hokkaido 項目1,項目2,項目3,・・・・・,項目10 d1,d2,d3,・・・・・,d10 e1,e2,e3,・・・・・,e10 f1,f2,f3,・・・・・,f10 となっているcsvファイルが特定のフォルダの中に100以上あります。 このcsvふぁいるの5行目だけをaccessに書き込んでテーブルに追加していきたいと思っています。 項目1,項目2,項目3,・・・・・,項目10 a1,a2,a3,・・・・・,a10 d1,d2,d3,・・・・・,d10 このようなテーブルができればいいのですが・・・ csvファイルを開く→5行目をテーブルに追加→csvファイルを閉じる(削除する)→次のcsvファイルを開く→5行目をテーブルに追加→csvファイルを閉じる(削除する) この流れでいいと思うのですが方法が分かりません。 丸投げですがよろしくお願いします。

  • エクセルのマクロで悩んでます

    はじめて投稿いたします。 現在、エクセル2000でマクロを組んでいるのですが、何日も悩んでそこから動けないので質問させていただきます。 やりたいことは、 (1)検索フォームの入力テキストに記載した数値を読んで検索ボタンを押すと、 (2)データブック.xls内の完全に一致した数値のセルの行をアクティブにして (3)その行のA列からO列の値をコピーして (4)入力ブック.xlsの入力シートのB4:B18に数値だけ貼り付け したいと考えています。 検索フォームは入力ブック.xls内で作成しています。 今のところ、(3)でA列の値を読んで、(4)でB4セルに貼りつけということはできているのですが、複数になるとできていません。 根気よく、同じプログラムを書くのが良いのでしょうか? かなり面倒なので、もっと簡単にかける方法があれば教えてください。

専門家に質問してみよう