Excel(VBA)で、レコード長の長いCSVファイル読み込み方法

このQ&Aのポイント
  • Excel(VBA)を使用して、レコード長の長いCSVファイルの読み込み方法について教えてください。
  • VBAを使ってExcelでレコード長の長いCSVファイルを読み込みたい場合、どのような方法がありますか?可変データ数の多いCSVファイルを効率的に取り込む方法を教えてください。
  • Excel(VBA)を使って、可変データ数の多いCSVファイルを効率的に読み込む方法について教えてください。
回答を見る
  • ベストアンサー

Excel(VBA)で、レコード長の長いCSVファイル読み込み方法

現在、VBA(EXCEL)の勉強しています。 次のような場合で良い方法(PG)がありましたら、回答お願いします。 csvファイルで、1レコードに可変データが情報として送られてくる場合の、EXCELにその情報を取り込方法です。 しかし、可変データ数が多数の場合、最初にEXCELのシートに展開できない(シートの最大列数以上のデータ)時、その場合の取り込み方法を教えてください。 うまく伝わらないような気がしますので、例を作成しました。 【例】 <画面(別プロセス)> 営業 青井 19 大卒 石井 19 高卒 佐藤 20 高卒 ・ ・ 人事 後藤 21 専卒 橋口 22 大卒 竹田 23 大卒 ・ ・ ・ 上記のような情報がcsvファイルで送られてくる <CSVファイル> 営業,青井,19,大卒,石井,19,高卒,佐藤,20,高卒・・・・・ 人事,後藤,21,専卒,橋口,22,大卒,竹田,23,大卒・・・・・ ・ ・ ・ このCSVを1レコードづつ読み込んで、編集し帳票にしたいと思います。 部(営業、人事)を最初に大項目名としてA列に入れる。 可変データ編集は名前と年齢をつなげセルA列に、学歴をB列に入れる。 <帳票> 営業 青井(19) 大卒 石井(19) 高卒 佐藤(20) 高卒 ・ ・ ・ 人事 後藤(21) 専卒 橋口(22) 大卒 竹田(23) 大卒 このようにしたいと考えてます。 この場合の、VBAでの読み込み編集方法で、良い方法はありますか? 良い方法がありましたら、教えてください。 (ん~うまく伝わるかなぁ~)

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

  • ベストアンサー
noname#140971
noname#140971
回答No.2

1,aaa 2,bbb,ccc 3,ddd,eee,fff 今、このような CSV ファイルがあるとします。 これを1行づつ読み込むサンプルコードは次のようです。 問題は、Mの値によってシートを切り替えるなりすることでしょう。 Private Sub CommandButton1_Click()   Dim I    As Integer   Dim J    As Integer   Dim N    As Integer   Dim M    As Integer   Dim Data  As String   Dim Datas() As String      Do     M = M + 1              ' エクセルの行カウンターをカウントアップ     Data = FileRead("C:\Temp\Test.csv") ' 1行だけ読み込む     Datas() = Split(Data, ",")     ' 読み込んだデータを列に対応する配列に代入     N = UBound(Datas()) + 1       ' 列インデックスの最大値+1 を求める     For I = 1 To N           ' For ループ       J = I - 1            ' 配列インデックス       Me.Cells(M, I) = Datas(J)    ' エクセルに表示     Next I               ' Next I   Loop Until Data = "" End Sub ※[ツール][参照設定] で Microsoft Scripting Runtime にレ点が必要。 Public Function FileRead(ByVal FileName As String, Optional isStop As Boolean = False) As String On Error GoTo Err_FileRead   Static isOpen As Boolean   Static fso  As FileSystemObject   Static fil  As File   Static txs  As TextStream      If Not isOpen Then     isOpen = True     Set fso = New FileSystemObject     Set fil = fso.GetFile(FileName)     Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)   End If   FileRead = txs.ReadLine Exit_FileRead:   If Len(FileRead) = 0 Or isStop Then     isOpen = False     Set txs = Nothing     Set fil = Nothing     Set fso = Nothing   End If   Exit Function Err_FileRead:   Resume Exit_FileRead End Function ただし、実際問題は、そんなに大量のデータを読み込んでも誰も見ないでしょう。 まあ、勉強ということではありかも知れませんが・・・。

NewSQL
質問者

お礼

ありがとうございます。 早速、ためしに作成しました。 とてもよい勉強になりました。

その他の回答 (1)

noname#48759
noname#48759
回答No.1

[シートの最大列数以上のデータ]というのは列IVを超える列数ということでしょうか? でしたらEXCELで扱うことはできません。 シートを分ける等したほうが良いかと思います。

NewSQL
質問者

お礼

勉強として、色々試したくて、このような質問をしました。 確かに列が大量になる場合は、シートを分けた方がいいんですがね・・・ HUsky2007さんの回答で、こういう方法もあると知りました。 わざわざ、回答ありがとうございました。

関連するQ&A

  • SQLServerで項目数が異なるCSVファイルを取り込む方法

    (先ほど古いIDで登録してしまったため、削除して新しいIDで登録しなおしました) お世話になります。 SQLServer2005 を使っています。 行によってデータ型も項目数も異なる CSV ファイルがあり、それを テーブルに読み込みたいと思っています。 (POSのデータです) サイズが比較的大きいので、BULK INSERT を使いたいと思い、 以下のように記述してみました。 BULK INSERT T_hoge FROM 'c:\hoge.csv' WITH (  DATAFILETYPE = 'char',  FIELDTERMINATOR = ',',  ROWTERMINATOR = '\n' ) CSV項目数が可変なので、取り込む側のテーブルの項目数に 余裕を持たせ、1行1レコードで取り込みたいのですが、 改行を無視して取り込まれてしまうようです。 項目数可変のCSVを取り込む方法があれば教えてください。 宜しくお願い致します。

  • csvファイルを読み込んだ時の「ゼロ」の扱い

    すみません、教えてください。 test.csv というファイルに、 佐藤, 東京 田中, 大阪 中西, 京都 というデータが入っていたとして、以下を使って読み込むと、 <?php $file_name = "test.csv"; $fp = fopen( $file_name, 'r' ); $data = array(); while( $ret_csv = fgetcsv( $fp, 256 ) ){ for($col = 0; $col < count( $ret_csv ); $col++ ){ $data[$col][$row] = $ret_csv[$col]; } $row++; } fclose( $fp ); var_dump($data); ?> 以下のように、 [0] ではなく [""] となってしまうのですが、これを [0] にする方法はないでしょうか。 array(2) { [0]=> array(3) { [""]=> string(6) "佐藤" [1]=> string(6) "田中" [2]=> string(6) "中西" } [1]=> array(3) { [""]=> string(6) "東京" [1]=> string(6) "大阪" [2]=> string(7) "京都 " } } よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 1レコードからなるファイルを複数レコードに分割

    可変長の1レコードのみのファイル(固定長のレコードが改行コードなくつながっている)をもとにして、固定長のcsvファイルを作成する方法をお教えください。 具体的には、 項目A(10バイト)、項目B(5バイト)、項目C(20バイト)からなる35バイトのデータが改行コードなくつながっている50000バイトくらいの1レコードを入力して、項目A,B,Cから1レコードが構成されるcsvファイルを作成したいと思います。 よろしくお願いします。

  • エクセルで、できますか?

    1 佐藤 みかん 300 2 佐藤 りんご 300 3 山田 みかん 300 4 石井 みかん 300 5 石井 りんご 300 6 足立 みかん 300 7 山田 みかん 300 8 甲斐 りんご 300 9 甲斐 みかん 300 以上のデータがあります。 みかんだけ買った人の人数、金額 りんごだけ買った人の人数、金額 両方とも買った人の人数、金額 を、わりだす方法を教えて下さい。

  • 複数レコードのデータを1レコードへ

    お世話になります。 現在php+mysqlでシステムを構築しようとしています。 複数レコードのデータを1レコードへまとめる方法を知りたいのです。 元のデータ: 名前,グループ,詳細1,詳細2 佐藤,年齢,18,歳 佐藤,役職,本部長,, 佐藤,・・・・ ・・・ 元のデータは、このように個人の情報が300行ほどの書かれているCSVファイルです。個人ごとに存在します。(今のところ400ほど) これをmysqlにインポートするのですが、普通、そのまま4フィールドのテーブルを作ってインポートするのではなく、個人1人で1レコードのデータを持つようにすると思います。 インポート後のテーブルデータ: 名前 年齢 単位 役職 ・・・・ 佐藤 18  歳  部長 ・・・・ このように変換するには、どのような手順でするのが普通なのでしょうか?? セオリーというか考え方をお教えください。 例)まずtempテーブルにインポート後、それを加工する?? よろしくお願いいたします。

  • 巨大なテキストファイル(可変長)を効率よく読込む方法は?

    Borland C++ Builder 5 を使っています。 30万件以上のレコードが格納されたCSVファイルを読込むプログラムを作っています。 1件当りのレコード長は可変です。(MAX値は余裕を見て200バイトくらい。) 1件ごと決められた処理をする必要がありますので、次のようなソースを書きました。 while(fgets(buf,200,fp31) != NULL){ //CSVの分解とデータ処理 } しかし、さすがに30万件は時間がかかります。 まとめてドッカンと読込む方法もあろうかと思うのですが、1件ごと処理をするためにはどうしたら良いか分かっていません。 何かうまい方法はないものでしょうか? ご指導いただければ幸いです。

  • ExcelへのCSVファイルの取り込み

    当方のExcelの環境は、Excel 2003/2007/2010 が混在しています。 CSVファイルをExcelに取り込んだ際、各セルへ下記のような当方の意図した形式で取り込む方法をご教示頂きたくお願い致します。 下記のようなダブルクォーテーション( " )で囲まれたカンマ( , )区切りのCSVファイルがあるとします。 ※[改行]の部分は、実際には改行コードが入っています。 ※[スペース]の部分は、実際には半角/全角スペースのいずれかが入っています。 "登録番号","登録名","登録内容","部署コード" "0001","山田一郎","・テスト[改行][スペース][スペース]ホゲホゲ,"01" "1002","鈴木次郎","・テスト2","10" "0102","佐藤三郎","","10" このファイルをExcelで開くと、A1~D4の各セルに下記の内容で表示されます。 =========== A1セル:登録番号 B1セル:登録名 C1セル:登録内容 D1セル:部署コード A2セル:1 B2セル:山田一郎 C2セル:・テスト       ホゲホゲ D2セル:1 A3セル:1002 B3セル:鈴木次郎 C3セル:・テスト2 D3セル:10 A4セル:102 B4セル:佐藤三郎 C4セル: D4セル:10 =========== これを下記のようにA2やD2、A4セルの数字部をデータ通りに表示したいです。 =========== A1セル:登録番号 B1セル:登録名 C1セル:登録内容 D1セル:部署コード A2セル:0001 B2セル:山田一郎 C2セル:・テスト       ホゲホゲ D2セル:01 A3セル:1002 B3セル:鈴木次郎 C3セル:・テスト2 D3セル:10 A4セル:0102 B4セル:佐藤三郎 C4セル: D4セル:10 =========== データの取り込みにて区切り文字を"カンマ"にして、A列やD列を"文字列"として読み込む事を考えましたが、「登録内容」の部分に改行が入っている為、下記のように改行後の文字列がA列に入ってしまい、意図した内容での表示が出来ません。 =========== A1セル:登録番号 B1セル:登録名 C1セル:登録内容 D1セル:部署コード A2セル:0001 B2セル:山田一郎 C2セル:・テスト D2セル: A3セル: ホゲホゲ" B3セル:1 C3セル: D3セル: A4セル:1002 B4セル:鈴木次郎 C4セル:・テスト2 D4セル:10 A5セル:0102 B5セル:佐藤三郎 C5セル: D5セル:10 =========== A列、D列は文字列の状態で読み込みつつ、C列の改行は当該セル内で実行する方法をご教示頂きたくお願い致します。

  • phpで、可変項目のcsvデータを読み込みたい

    csvでデータを読み込む方法はネットで見つけたのですが、下記の条件を加えた場合どうすればいいか分かりません。 ネットで見つけた方法は、ファイルを1行ごと読み込み、コンマごとに区切って配列にいれる方法です。 しかし、項目が可変の場合、名前を入れたいところに別のデータが入ったりします。 【条件】 csvの項目名は、 A,B,C,D,E,F とする それぞれの項目は、省略可能(どこが省略されるか分からない) そのため、 A,D,E,F など、項目名が少ないCSVファイルもある。 こんな場合は、どのように処理をすればよいでしょうか? 実際は、項目名が50個ほどあります。 今回の例のように、少なければ何とかできそうなのですが・・・ 【補足・データファイル】 "A","B","C","D","E","F",←項目名 "山田","太郎","東京","15","123-221","男",←データ "山田","次郎","東京","13","124-567","男", ・・・・・・・・・↓続く ・・・・・・・・・

    • ベストアンサー
    • PHP
  • Excelデータ配列の微妙な縦横変換

    頻出質問だったらごめんなさい。一応検索したのですが、見つけれませんでした。 もともと住所録ソフトのデータをタブ区切りで吐き出してそれをExcelで読み込んでいます。 データは↓こんな感じに並んでいます。 名前 部署 内線 メール 佐藤 人事 1111 aaa@x.jp 加藤 庶務 2222 bbb@x.jp 武藤 営業 3333 ccc@x.jp (もちろんデータ項目はもっと多いですが、欠損値はありません) これを↓こんな感じに並び替えたいのです。 名前 部署 内線 メール 佐藤 人事 1111 aaa@x.jp 加藤 庶務 2222 bbb@x.jp 武藤 営業 3333 ccc@x.jp 関数を知らない私にはこの変換って結構難しいんです。300人を越えるデータがあるので一人一人縦横変換して貼付けていくなんていう作業は放棄しております。 どうぞお助けを。

  • C言語でテキストファイルへのランダムアクセス

    こんにちは。 C言語を使い、CSVファイルで特定の通し番号が振られたレコード1行の値を 変数に格納したいのですがそれはできないのでしょうか? いろいろな参考書を確認するとバイナリファイルならランダムアクセスという方法で 任意の場所に直接アクセスできるらしいですが CSVなどのテキストファイルの場合、 一度ファイルの内容をすべて変数に読み込んで 変数内で検索するしかないのでしょうか? レコード数が多い場合でも変数にすべて読み込むしかないのでしょうか? ちなみにこんなファイルです。 001,山田 太郎,yamada tarou,東京,世田谷,08012341234 002,佐藤 二郎,satou jirou,北海道,釧路,09012341234 1カラム目は固定長、そのほかは可変長です。 ランダムアクセスで使うfseek関数はサイズで移動するらしいので 可変長のデータが含まれているとこの関数は使えないんじゃないかと思っています。 2カラム目には半角スペースも入っています。 1000レコードくらいです。 ご存知のかた、アドバイスお願いします。

専門家に質問してみよう