• ベストアンサー

エクセル2000で65536行を超えるCSVファイルの読み込み方法

Windows2000、エクセル2000です。 今回、約10万行を超えるCSVファイルが送られてきました。 エクセルで開くと当然65536行で切れてしまいます。 やむをえず、拡張子を .txt に変え、メモ帳で開いて分割してエクセルの複数のシートに張ろうとしてみました。 拡張子を .txt に変えれば65536行で切れず、全件表示されます。しかし、このデータをコピーしようとCtrlを押したままマウスでスクロールをしたところ、スクロールはできるのですがデータが膨大なため遅々として先にすすんでくれません。 これじゃらちがあかないので、他の部署のAccsessを使える人にデータをわたして数ファイルのCSVファイルに分割していただきました。 今回はこれで事なきをえたのですが、これからまたこんなことがあった場合、わたしはAccsessを使ったことがないので困ってしまいます。(送付側からは分割したければそっちでやれといわれております。) こんな場合、エクセルではどのような対応をすればいいのでしょうか? (エクセル2007を使えという答えは勘弁してください。)

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

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

別にexcelで開かなくても、wordで開いちゃえばいいじゃないですか。 word上で、適当な行数で切って「書式なし(*.txt)」で保存すれば 済む話です。ナンなら「メモ帳」でも同じことが出来ますよ。

merlionXX
質問者

お礼

CSVってワードで開けるんですね! 知りませんでした。 ためしたところメモ帖で開いたときに比べ、非常にスムーズにスクロールし、適用なところで切って別ファイル保存ができました。 ありがとうございました。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#3の補足 説明の文章とコードが違います。 # A1から入れていくとは思っていますが、そうでなければ、iCol を変えてください。i =1 になっていますが、それを変えても、最初のシートだけです。 コードを直し、iROW, iCOL で最初の位置を決められるようにしました。しかし、iCOL は、256列のままですから、当面、iCOL = 1のままでお願いします。 本来は、  If j > 256 -iCOL Then j = 256 -iCOL で、右の限界を決めなくてはなりませんでした。

merlionXX
質問者

お礼

お礼が遅くなり申し訳ございませんでした。 No2の方のアドバイスでワードで取り込むことができたデータをいままで処理しておりました。 やっと終わりました。 Wendy02さまのいつもながら鮮やかな魔術を見せていただいてありがとうございます。 ためしたところ完璧に取り込めました。今後はこれで大きなCSVが送付されても慌てずに対処できそうです。 コードじっくり勉強させていただきます。 ありがとうございました。

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

参考URLに、A No.3の様に、テキストファイルとして処理する方法と、ADOで接続する方法が紹介されています。 データにユニークなIDの様なものがあれば、SQLでIDの範囲を指定して、複数回に分けて読み込めば良いでしょう。適当なものが無ければ、全てRecordsetに読み込んで、Recordsetに対して処理して分割する事になりますが、これはメモリーを食って得策ではないかもしれません。

参考URL:
http://blog.livedoor.jp/akf0/archives/51387288.html
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 今回も、また、「フリーソフトウェアはなし」という条件付きになりそうですね。 私の記憶では、CSV を処理するための、フリーソフトウェアのものすごく優秀なデータベースがあったと思います。 ただ、この質問は、ここの掲示板でなかったのでしょうか。これは、昔から有名な質問ですから、マクロのコードはあるような気がしましたが、今回、私は、改めて自分で作ってみました。内容的はローテクですが、もう少し、気の利いた方法がないのかなっていうのが、今の私の気持ちです。 試したのは、12万行の郵便番号ファイル(csv)を使いました。(ただし、現行のマクロは、256列までのファイルに限ります、257例以上は、切り落としてしまいます。)上限数を越えるたびに、現在のシートの位置を調べ、右側が足りなければ、シートを増やしてから、インポートしていきます。 ただ、もう少し、インポートが速くならないのか、という気がしています。 そのためには、以下のコードを、このようにしてみたら、とは思ったのですが、当面は、そのままにしました。 Application.ScreenUpdating = False Cells(i, 1).Resize(, j).Value = myAr Application.ScreenUpdating = True (Cells の前のオブジェクトのActiveSheet が入っていないのは、微妙な手抜きなのですが、ActiveSheet にしかインポートしませんから、このままにします) なお、CSV には、クォーテーションマーク("")がある時がありますから、それを抜くためには、Substitute 関数が良いと思います。これを入れても、配列で貼り付けている限りは、自動キャスティングで、文字が数値化はしません。 A1から入れていくとは思っていますが、そうでなければ、iCol を変えてください。i =1 になっていますが、それを変えても、最初のシートだけです。 '--------------------------------------- Sub CSVImport() '最大行65536行を越えるCSV のインポート Dim FileName As String Dim FNo As Integer Dim i As Long Dim buf As String Dim myAr As Variant Dim k As Integer Dim j As Integer Const sSEP As String = "," '区切り文字 Const iROW As Integer = 1 '1行目 Const iCOL As Integer = 1 '1列目から入れる Const iMAX As Long = 40000 '上限数 i = iROW '行の初期値     FileName = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv")   If FileName = "False" Then    Exit Sub   End If      FNo = FreeFile()   Open FileName For Input As #FNo   Do Until EOF(FNo)     Line Input #FNo, buf     ''クォーテーションマーク("")を除く場合は、以下のコメントブロックを外す     'buf = WorksheetFunction.Substitute(buf, """", "")     myAr = Split(buf, sSEP)     j = UBound(myAr) + 1     If j > 256 Then j = 256 '列が、256を越えたら、256までのインポート     'Application.ScreenUpdating = False     Cells(i, iCOL).Resize(, j).Value = myAr     'Application.ScreenUpdating = True     i = i + 1     If i > iMAX Then     k = ActiveSheet.Index     Call CheckSheet(k)     i = iROW     End If   Loop     Close #FNo    End Sub Sub CheckSheet(k As Variant) Dim n As Integer  n = ActiveWorkbook.Sheets.Count  If k = n Then    ActiveWorkbook.Worksheets.Add After:=activeSheet  End If End Sub

  • ann_dv
  • ベストアンサー率43% (528/1223)
回答No.1

csvファイルを分割する目的でわざわざAccessを使う必要性はありません。 参考URLは、CSVファイル分割ソフトのほんの一例です。

参考URL:
http://hioki.jp/soft/csvc100/csvc100_j.html
merlionXX
質問者

お礼

さっそくありがとうございます。 とても便利そうなソフトですね。 ただ、残念ながらわたしの会社では会社の指定外のソフトウエアの導入が禁止されているのでつかえないのです。 こんど自宅で試して見ます。 ありがとうございました。

関連するQ&A