• 締切済み

【VBA・マクロ】csvファイルの操作方法

実験データ(csvファイル)をマクロを使用して編集・操作したいのですが、 データ量が多すぎ(65536行を超えている)て 「すべて読み込めませんでした」と出てしまいます。 そのためデータを一度ワードパッドで開き、必要なデータのみを抽出して 順番にエクセルシート(sheet1)に貼り付けたいと思っています。 多少はマクロを勉強して簡単な操作はできるのですが、 ワードパッドへの操作方法がわかりません。 よろしくお願いいたします。 使用エクセルバージョン:エクセル2000      1列目 2列目 3列目 4列目 1行目  A   C   良品   E 2行目  B   D  不良品   F ※良品となっている行のみのデータをエクセルへ貼り付けたいです。

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.6

#5です。 xl2000でも動作を確認しました。 PentiumM 1.3Gというもっとチープな環境で、初回の実行時間が39秒弱でした。 試験用データ作成の方は、速くする事は考えてないコードですが、22秒位でしたので、試したい方はご参考まで。 なお、行見出しというかフィールド名が含まれていないCSVを対象にしたコードですので、もし含まれている場合は手直しが必要になります。#4のURLをご参照下さい。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

#4です。休みに入ったので、試行してみました。 xl2010でやっていますので、本当は50000ずつ分けても仕方無いのですが... ☆良品のみ抽出して、シートに5万個ずつ切り出すコード。良品データは乱数で生成しているので、50万個弱あります。 Celeron2.4G,WindowsXP SP3です。メモリーは736Mという今時淋しい環境ですが、処理時間は数十秒でした。 Sub test2() Dim CN As Object Dim RS As Object Dim mySQL As String Dim i As Long, dataCount As Long Dim sh As Worksheet Const blockSize As Long = 50000 Const adOpenStatic = 3 Const adLockReadOnly = 1 Set CN = CreateObject("ADODB.Connection") CN.Provider = "Microsoft.Jet.OLEDB.4.0" CN.Properties("Extended Properties") = "Text;HDR=NO" CN.ConnectionString = ThisWorkbook.Path & "\" CN.Open Set RS = CreateObject("ADODB.Recordset") mySQL = "SELECT * FROM sample.csv WHERE [sample#csv].F3 = '良品'" RS.Open mySQL, CN, adOpenStatic, adLockReadOnly dataCount = RS.RecordCount For i = 1 To Int(dataCount / blockSize) + 1 Set sh = ThisWorkbook.Worksheets.Add(after:=Worksheets(ThisWorkbook.Worksheets.Count)) With sh RS.MoveFirst 'すでに取得したデータをスキップ RS.Move (blockSize * (i - 1)) .Range("A1").CopyFromRecordset RS, blockSize End With Set sh = Nothing Next i RS.Close Set RS = Nothing CN.Close Set CN = Nothing End Sub ☆サンプルファイル作成用コード。下記の様な100万個のデータで、18M位になります。 fzu,rsg,不良品,630 eel,ltq,不良品,70 eve,pqh,良品,599 Sub test1() Dim myWords(3) As String, oneLine As String Dim i As Long Dim FSO As Object, myTextFile As Object Set FSO = CreateObject("Scripting.FileSystemObject") Set myTextFile = FSO.CreateTextFile(ThisWorkbook.Path & "\sample.csv") Randomize Time With myTextFile For i = 1 To 1000000 myWords(0) = Chr(97 + Int(Rnd() * 26)) + Chr(97 + Int(Rnd() * 26)) + Chr(97 + Int(Rnd() * 26)) myWords(1) = Chr(97 + Int(Rnd() * 26)) + Chr(97 + Int(Rnd() * 26)) + Chr(97 + Int(Rnd() * 26)) myWords(2) = IIf(Int(Rnd() * 2) = 0, "良品", "不良品") myWords(3) = CStr(Int(Rnd() * 1000 + 1)) oneLine = Join(myWords, ",") .writeline oneLine Next i .Close End With Set FSO = Nothing End Sub

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

質問者様に若干のSQLの知識もしくは覚える気があれば、CSVから良品のデータのみ抽出可能です。 http://home.att.ne.jp/zeta/gen/excel/c04p47.htm ページの中程に、Where条件を指定して抽出する例が載っております。 良品を抽出しても、65536行を超えていたらどうするのか? レコードセットに、80000行(レコード)を読み込んで、50000行ずつシートに書き出す事例をみつけました。一度に読み込む方法で、上限何レコードまで対応可能なものかは分かりませんが。 http://okwave.jp/qa/q4557028.html 以上、ご参考まで。

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.3

No.1です。 私の回答を理解されていますか? CSVファイルをExcel形式で開けば、当然65535行までしか読み込めません。 だから、1行ずつ、通常のテキストファイルとして読み込むと説明したはずですが。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

#1のご回答と似てくるが、CSVファイルは、基本的に1レコード(次の復帰改行が見つかるまで)を変数に入れてくれるステートメントが在る。>多少はマクロを勉強して簡単な操作はできるのですが、といっていながらこんなことも知らないようでは経験不足だよ。 普通は、ReadAll的なものは使わないのだ。 1レコードが何バイト以内などの制限は合ったと思うし、レコード数も、1ファイルでバイト制限があると思うがそういう話ではないだろう。 1レコードを変数に読み込み、Split関数でスプリットし、何番目のフィールドか、注目しているフィールドが、「良品」のコードの行出せ処理をsすれば仕舞いだろう。 Googleででも「VBA CSV 読み込む」で紹介でもしたか。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_020.htmlなど多数。 >ワードパッド などに発想が行っているのは的外れ。 同じMSのソフトでも、VBA的なものが作られているのは限りがあるよ。 何でもソフトがあればVBA的な処理が出来るものではないという根本を判ってない。苦労してMSはオフィス製品の中の限られたソフトにだけ公開している。またVBAがあっても、エクセルぐらい以外は情報も少なく、勉強が難しいのだ(たまにWord、PPTなども質問で出るが、経験者は少なく回答も少ないようだ)

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.1

どのような方法で、CSVファイルを読み込んでいますか? 65535行を超えるファイルは、1行ごとに読み込めば読み込むことは可能なはずです。 但し、ここで言われる”良品”行が65535行を超えないことが前提ですが。 http://www.k1simplify.com/vba/tipsleaf/leaf291.html のCSV_Read2()が参考になると思います。 カンマで分離した配列csvline() のデータで、良品かどうかチェックすればOKでしょう。

y_ako
質問者

補足

csvファイルもしくはエクセルで開いています。 ですが、全データ数が65535行を超えていますので、それ以降のデータ確認ができません。 そのため、ワードパッドで開いて、データの確認をしています。