VBAでCSVファイルを分割する方法

このQ&Aのポイント
  • VBAを使ってCSVファイルを一定のレコード数ごとに分割する方法について教えてください。他の方法でも構いませんが、VBAを使って実現したいです。
  • サンプルコードやヒントを教えていただけると助かります。
  • 分割する際にヘッダーも含めたいです。例えば、2つのレコードごとに分割する場合、各ファイルにはヘッダー行と2つのデータ行が含まれるようにしたいです。
回答を見る
  • ベストアンサー

VBAでCSVファイルを分割したい

VBAを利用して、あるCSVファイルを一定のレコード数ごとに新しいファイルにファイル分割したいです。 やりたいことは、以下のようなイメージです。 関連サイトなどを参考に自分なりに取り組んでみましたが、なかなかうまくいきません。 VBAでなくても実現できそうですが、ここまでやったので勉強のためにもVBAでやりたいです。 サンプルコードなど教えていただけるとうれしいです。 ヒントでも結構ですので、よろしくおねがいします。 (2レコードずつ分割する例) sample.csv ヘッダ1,ヘッダ2,ヘッダ3,ヘッダ4 aaa@aa.aa,123,あいうえ,111-111 bbb@bb.bb,456,かきくけ,222-222 ccc@cc.cc,789,さしすせ,333-333 ddd@dd.dd,012,たちつて,444-444 eee@ee.ee,345,なにぬね,555-555 fff@ff.ff,678,たちつて,666-666 ↓↓↓ ☆sample_1.csv ヘッダ1,ヘッダ2,ヘッダ3,ヘッダ4   →各ファイルにヘッダも入れたいです。 aaa@aa.aa,123,あいうえ,111-111 bbb@bb.bb,456,かきくけ,222-222 ☆sample_2.csv ヘッダ1,ヘッダ2,ヘッダ3,ヘッダ4 ccc@cc.cc,789,さしすせ,333-333 ddd@dd.dd,012,たちつて,444-444 ☆sample_3.csv ヘッダ1,ヘッダ2,ヘッダ3,ヘッダ4 eee@ee.ee,345,なにぬね,555-555 fff@ff.ff,678,たちつて,666-666

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

シートに貼り付けて……なんてやると日付のデータなどが勝手にExcelによって変更されてしまいますので、テキストとしてLine Inputで一行づつ読み込んで配列に格納し、その後で別々なファイルに書きだしてやる方が良いかと思います。 Sub Sample()   Dim nFF As Integer   Dim sLine As String   Dim sCsv() As String      'CSVを1行ごと配列に取り込む   nFF = FreeFile   Open "C:\Temp\Sample.csv" For Input As #nFF   i = 0   Do While Not EOF(1)     Line Input #nFF, sLine     ReDim Preserve sCsv(i)     sCsv(i) = sLine     i = i + 1   Loop   Close #nFF   '2レコードづつ違うファイルに   j = 1   For k = 1 To UBound(sCsv) Step 2     nFF = FreeFile     Open "C:\Temp\Sample_" & j & ".csv" For Output As #nFF     Print #nFF, sCsv(0) 'ヘッダ     Print #nFF, sCsv(k)     Print #nFF, sCsv(k + 1)     j = j + 1     Close #nFF   Next k End Sub

falcon0109
質問者

お礼

ご回答ありがとうございます! いただいたプログラムを参考にさせていただき、 無事解決しました。 本当にありがとうございます!

関連するQ&A

  • CSVファイルをAccessに取りこみたい

    以下のような2つのCSVファイルがあるとします。 【hoge1.csv】 aaa,bbb,ccc,ddd 1,2,3,4 【hoge2.csv】 aaa,bbb,ddd,eee,fff 1,2,4,5,6 Accessをあまり使用したことがないので教えていただきたいのですが、 hoge1.csv、hoge2.csvを、以下のような形で Accessの1つのテーブルにインポートする事はできるのでしょうか? ---------------------------- | aaa | bbb | ccc | ddd | eee | fff | | 1 | 2 | 3 | 4 |  |  | | 1 | 2 |  | 4 | 5 | 6 | ---------------------------- ※「aaa」「bbb」…をフィールド名としたいです vb等でプログラムを自作するしかないのでしょうか? 何か良い方法がありましたら教えてください。お願いします。

  • VBAでCSV内にある改行を取る方法

    あるシステムが吐くcsvファイルの項目の中に改行が入っているものがあります。 例) 01,aaa,bbb(改行)bbb,ccc(改行) 02,ddd,eee,fff(改行) 03,ggg(改行)ggg,hhh,iii(改行) このCSVファイルをエクセルのマクロで読み込んでシートに展開したい のですが、項目中にある改行で別レコードを認識してしまいます。 結果) A B C D ---+---+---+--- 01 aaa bbb  bbb ccc 02 ddd eee fff 03 ggg ggg hhh iii これを以下のようにしたいのですが・・・ A B C D ---+------+------+---- 01 aaa bbbbbb ccc 02 ddd eee fff 03 gggggg hhh iii どうやればよいでしょうか? ご教授お願いいたします。

  • CSVデータをツリー表示させたい

    業務で、WEBサイトにCSVデータを表示させたいと考えています。 CSVデータは、毎日更新されるもので、行数も日々変更されます。 項目の中に「レベル」という項目があり、この「レベル」の値を使って、 ツリー表示出来ないかと考えています。 希望としては、決められたフォルダに決められたファイル名で、 CSVデータを置けば、自動的にWEB上にツリー表示されるという ことです。 J-query等で、これを実現出来るプラグインが無いか探しているのですが、 なかなか希望に合うものが見つからず、困っています。 (CSVをWEB表示するものは見つかるのですが、ツリー表示出来る ものが見つかりません) 何か、良い方法があれば、ご教示頂けませんでしょうか? 例 コード  レベル 品名  規格 ・・・・    コード     レベル 品名  規格 ・・・・  1234    1   AAA   aaa       -1234       1    AAA   aaa 2345    2   BBB   bbb        ∟2345     2    BBB  bbb 3456    3   CCC   ccc          ∟3456   3    CCC  ccc 4567    3   DDD   ddd          ∟4567   3    DDD  ddd 5678    3   EEE   eee           ∟5678   3    EEE  eee 6789    4   FFF   fff             ∟6789  4    FFF   fff 7890    3   GGG  ggg           ∟7890   3    GGG  ggg

  • CSVに外部テキストファイルを列として追加する方法

    こんにちは。 CSVファイル(base.csv)の先頭列に、別のテキストファイル(add.txt)の中身を新規の列として挿入したいと考えているのですが、よい方法がわかりません。。。 どうのような方法を使えば対応することができるでしょうか? どうぞよろしくお願いいたします。 ■CSVファイル(master.csv) title,developer_name,seller_name,primary_genre_name,application_url AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE ■テキストファイル(add.txt) id 000 111 222 333 ↓ ■目標としたファイル(master.csv) id,title,developer_name,seller_name,primary_genre_name,application_url 000,AAA,BBB,CCC,DDD,EEE 111,AAA,BBB,CCC,DDD,EEE 222,AAA,BBB,CCC,DDD,EEE 333,AAA,BBB,CCC,DDD,EEE

  • ファイル分割2

    前回ファイル分割について質問させていただいた者です。 ファイル名 あいうえお.txt 内容 <A>AAA <B>BBB <C>CCC <D>DDD <E>EEE <F>FFF というファイルを ファイル名 あいうえお1.csv A,B AAA,BBB ファイル名 あいうえお2.csv C,D CCC,DDD ファイル名 あいうえお3.csv E,F EEE,FFF という感じで変換させたいと思っております。 A,B,C,D,E,F AAA,BBB,CCC,DDD,EEE,FFF に変換するプログラムは my $mae = my $filename = shift @ARGV; my $ato = "$filename.csv"; open(IN,"$mae") || die "Can't open!"; my @datas = <IN>; close (IN); my (@ichi,@ni); foreach (@datas){ if ($_ =~ /^<(.*)>(.*)$/){ push(@ichi,$1); push(@ni,$2); } } my $ichi = join(",",@ichi); my $ni = join(",",@ni); open (IN,">$ato") || die "Can't open!"; eval 'flock(IN,2);'; seek (IN,0,0); print IN ("$ichi\n"); print IN ("$ni\n"); eval 'flock(IN,8);'; close (IN); exit; こんな感じで作成したのですが、前回教えていただいた3つファイルに分割するプログラムをどのように追加するか わかりません。 ほんとにあほみたいなことを聞いているとは思いますが、 教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • VBA シート1だけを保存する

    VBA シート1だけを保存する こんにちは、VBA初めてまもない初心者です よろしくお願いします 動作環境として、OS:XP excel:excel2007 を使用しています VBA で CSV データを取込む際にCSV データのとある項目以降から 2行目にして更にセルを結合しようと思っていたのですが どうやら、VBAだとワンアクションじゃ出来ないことに気がつきました。 例:    ※1行の例です。実際にはこのCSVデータが1000行近く有ります (CSV data) "AAA","BBB","CCC","DDD","EEE","FFF"         ↓ (VBAのみではワンアクションでは出来ませんでした) (excel)       A   B   C   D              1行目 AAA BBB CCC DDD 2行目   EEE     FFF    //EEEは[2A,2B]のセル、 FFFは[2C,2D]のセル ですので、やり方を切り替えて 1・1度CSVデータをエクセルシート1に取込む 2・シート2でセルの枠の結合やサイズ等を変更しながら、シート1の内容を参照する (注意:コピーではなく参照です) 3・シート2の部分だけを保存する、もしくはシート1の内容を削除する 1-3のような手順で、処理を行う事が出来るのでしょうか? アドバイス頂けたらと思います。<(_ _)>

  • C言語による「テキストファイルの読み書き(fprintf)」について

    C言語による「テキストファイルの読み書き(fprintf)」について質問です ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。 以下のように作りました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { FILE *fp; fp = fopen("test.csv","r+"); fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n"); fclose(fp); return 0; } ------------------------------------------------------------ このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。) 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える) AAA,BBB,CCC,DDD,EEE 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり) 希望する動作としては コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj のようになるようにしたいのですがどのようにすればよいのでしょうか。 よろしくお願いします。 (使用ソフト:Borland C++ Compiler, Cpad) 参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html

  • ACCESS2007コンボボックスについて

    ACCESS2007で質問です。 コンボボックスを連動させて、入力を効率よくする方法を教えて頂きたいのです。 データとしては テーブル 1 章  編 A AA A BB A CC B DD B EE C FF テーブル 2 編  分類 AA AAA AA BBB AA  CCC BB DDD CC EEE CC FFF CC GGG DD HHH EE I I I FF JJJ テーブル 3 分類 細目 AAA AAAA BBB BBBB BBB CCCC BBB DDDD CCC EEEE CCC FFFF DDD GGGG EEE HHHH FFF I I I I GGG JJJJ ・・・・・ と、あとテーブルがいくつか続いて テーブル X 条件X   数値情報 AAAAAA 1234 BBBBBB 2345 CCCCCC 9876 DDDDDD 1379 FFFFFF 8462 ・・・・・・・ というツリー状の階層データで構成されます。 最終的にはテーブルXの右側の数字を拾っていく表を作成したいのです。 AAAAAA ~ FFFFFF 等に関する数値データについては最終的には数千になると思いますので、途中でツリーを追いながら入力したいと思っています。 (テーブル2や3でもいきなり20程度の分岐が発生するときもあるので・・・) ネットや書籍で、「コンボボックスの連動」という制御が可能ということでしたので、色々やっております。 フォームにおいて、コンボボックスの1段目はウィザード等で簡単に作成できましたが、2段目が出来ません。 コンボボックスを作成後、プロパティシートの集合値ソースにDLOOKUPや、SELECTを用いた構文を作成すればよいのかと思うのですが、良い方法が分かりません。やりたい事がそのまま載っている本などもあるのですが、2007以前のバージョンだったりして、操作方法からしてよく分からないこともあります。 2段目が出来れば3、4段目も同じ要領だと思いますので、何とかなるかなと思っています。 ACCESSをいじり始めて10日程度の初心者で、用語自体も調べながらの状況ですが、よろしくお願いいたします。

  • CSVファイルをperlプログラムで処理する場合

    すみません、度々perl初心者のものです。 CSVファイルを1行ずつ読み込んで処理をしたい場合、 1項目内のデータの中に改行がある場合、 どのような方法で対処出来るでしょうか? 例えば "aaa,bbb,ccc ddd,eee,fff" 上記のようにcccとdddの間に改行が入ってるため 本当は1レコードのはずなのに2レコードとして 処理を行ってしまう。 perlで何かやり方はあるのでしょうか? csvを加工するのもよいのですが、データが多量に あるため、プログラム上でなんとかしたいと思うのですが。。。 すみません、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Excel VBA サブディレクトリの取得について

    Excel VBA についての質問です。 私は、VBAの初心者です。 フォルダ選択ダイアログを開き、あるフォルダを選択させます。 選択したフォルダ配下のファイルとサブフォルダにあるファイル一覧とそのファイルのパス取得したいです。 【例】D:\TEMP\AAA フォルダを選択 D:\TEMP\AAA  D:\TEMP\AAA\BBB\CCC.txt D:\TEMP\AAA\BBB\DDD\EEE.txt D:\TEMP\AAA\BBB\DDD\FFF.txt GGG.txt が存在する。 まず、フォルダAAAまで選択されたら、 以下の結果がエクセルに出力したいです。 BBB         CCC.txt BBB\DDD        EEE.txt BBB\DDD        FFF.txt               GGG.txt うまく伝えないかもしれないですが、ご教授お願いいたします。

専門家に質問してみよう