- 締切済み
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】の情報の中で、キーワードに合致しない場合があります。 その場合は、何らかの形でわかればと思います ---------- 文章が苦手で非常に分かりにくいかとは思いますが ご教授いただければ幸いです。 どうか宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- FEX2053
- ベストアンサー率37% (7995/21381)
あ、なるほど。Excelで確認できるファイル区分データがないので、 1セル当たりの文字数が超過してるんですね。 だとすると、開くのにこちらのような「テキストファイルを開く」手順で データの区切り位置を外部指定して開くしかないです。「開く作業」は マクロのキー記録で記録できますので、次のファイルからはマクロで 動作させることができます。 http://www.d-ic.com/tool/txtfile_open/
- FEX2053
- ベストアンサー率37% (7995/21381)
開けないならファイルが壊れているか、正しいフォーマットで 記録されてないわけですから、Excelで読み取れないと思い ますけど。 VBAで処理できるのは、Windows上で正しく開けるファイル だけです。なので、とりあえず「メモ帳」では開けますか?
お礼
お返事が遅くなってしまい、失礼いたしました。 下記にもお返事をいただいておりましたが、 とりあえずこちらで、その後の経過をご報告させてください。 結果として自分の行いたかったことはできなかったのですが Libreoffice にて短時間でファイルを開けることがわかり 現在、上記ソフトにて vlookup を行っている状況です。 今後も色々と調べて、改善していきたいと思います。 こんな見ず知らずの私の質問に、貴重なお時間を 割いていただき、本当にありがとうございました。
補足
お忙しい中、回答頂きありがとうございます。 メモ帳で試しに数ファイル開いてみましたが、全て開くことができました。 【B.csv】の数項目が、1つのセルに最大8500文字ほど入っており それが数千行続いています。 このデータ量が原因で「ファイルを開く」などの処理に時間がかかる、 またはエラーになってしまうのかと、考えていました。 ※エラーになる場合は、5分以上かかる読み込みに 私が耐え切れずクリックなどをしてしまう場合におきます。 良い改善方法を模索しています。どうか宜しくお願い致します。
- FEX2053
- ベストアンサー率37% (7995/21381)
ちょこちょこっと書いてみました。 処理速度を考えず、コードのわかりやすさを第一にしています。 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
お礼
お返事が遅くなってしまい、失礼いたしました。 結果として自分の行いたかったことはできなかったのですが Libreoffice にて短時間でファイルを開けることがわかり 現在、上記ソフトにて vlookup を行っている状況です。 今後も色々と調べて、改善していきたいと思います。 こんな見ず知らずの私の質問に、貴重なお時間を 割いていただき、本当にありがとうございました。
補足
回答いただきありがとうございます。 私の知識として存在しない単語がたくさんあり 驚くばかりです。VBAは難しいですね… 本当にありがとうございます。 実は【B.csv】なのですが、ファイルを開くのに 数分~エラーで開けないという状況となります。 そのため、【B.csv】を開くことなく処理ができればと考えていました。 一番重要な情報を記載せず、申し訳ございませんでした。 もし解決方法があれば、教えて頂ければ幸いです。 何度もお手数をおかけいたします。 すみません、宜しくお願い致します。
- FEX2053
- ベストアンサー率37% (7995/21381)
VBAを使わなくていいのなら、「ブックBのA列を昇順でソート しておき、ブックA側でVLOOKUP関数を使えば一発で済む」 話ですけどね。どうしてもVBAを使いたいんですかね? そうなら、ブックAのセルA1を選択している状態で Data=Selection.value と値を取得しておき、ブックBのセルA1から順にDataと同じか をチェックすればいいだけの話だと思います。処理時間はかかり ますが、一件ずつ処理するのが、コードは分かりやすいかと。
お礼
お返事が遅くなってしまい、失礼いたしました。 結果として自分の行いたかったことはできなかったのですが Libreoffice にて短時間でファイルを開けることがわかり 現在、上記ソフトにて vlookup を行っている状況です。 今後も色々と調べて、改善していきたいと思います。 こんな見ず知らずの私の質問に、貴重なお時間を 割いていただき、本当にありがとうございました。
補足
回答いただきありがとうございます。 実は【B.csv】なのですが、ファイルを開くのに 数分~エラーで開けないという状況となります。 そのため、【B.csv】を開くことなく処理ができればと考えていました。 一番重要な情報を記載せず、申し訳ございませんでした。 もし解決方法があれば、教えて頂ければ幸いです。 何度もお手数をおかけいたします。宜しくお願い致します。
お礼
回答が遅くなってしまい、大変失礼いたしました。 教えて頂いた方法で開いてみたのですが、 私の操作が悪いのか、EXCELのバージョンが悪いのか うまく開くことができませんでした。 ですが[区分データ][1セルあたりの文字数超過]など 気になるキーワードを記載いただけていたので、 引き続き、自分で調べてみようと思います。 こんな初心者にお時間を割いていただき、ありがとうございます。 本当に感謝いたします。