解決済みの質問
Windows2000、エクセル2000です。
今回、約10万行を超えるCSVファイルが送られてきました。
エクセルで開くと当然65536行で切れてしまいます。
やむをえず、拡張子を .txt に変え、メモ帳で開いて分割してエクセルの複数のシートに張ろうとしてみました。
拡張子を .txt に変えれば65536行で切れず、全件表示されます。しかし、このデータをコピーしようとCtrlを押したままマウスでスクロールをしたところ、スクロールはできるのですがデータが膨大なため遅々として先にすすんでくれません。
これじゃらちがあかないので、他の部署のAccsessを使える人にデータをわたして数ファイルのCSVファイルに分割していただきました。
今回はこれで事なきをえたのですが、これからまたこんなことがあった場合、わたしはAccsessを使ったことがないので困ってしまいます。(送付側からは分割したければそっちでやれといわれております。)
こんな場合、エクセルではどのような対応をすればいいのでしょうか?
(エクセル2007を使えという答えは勘弁してください。)
投稿日時 - 2008-08-13 13:23:56
2人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(4件中 1~4件目)
#3の補足
説明の文章とコードが違います。
# A1から入れていくとは思っていますが、そうでなければ、iCol を変えてください。i =1 になっていますが、それを変えても、最初のシートだけです。
コードを直し、iROW, iCOL で最初の位置を決められるようにしました。しかし、iCOL は、256列のままですから、当面、iCOL = 1のままでお願いします。
本来は、
If j > 256 -iCOL Then j = 256 -iCOL
で、右の限界を決めなくてはなりませんでした。
投稿日時 - 2008-08-13 17:50:26
お礼
お礼が遅くなり申し訳ございませんでした。
No2の方のアドバイスでワードで取り込むことができたデータをいままで処理しておりました。
やっと終わりました。
Wendy02さまのいつもながら鮮やかな魔術を見せていただいてありがとうございます。
ためしたところ完璧に取り込めました。今後はこれで大きなCSVが送付されても慌てずに対処できそうです。
コードじっくり勉強させていただきます。
ありがとうございました。
投稿日時 - 2008-08-14 16:27:50
参考URLに、A No.3の様に、テキストファイルとして処理する方法と、ADOで接続する方法が紹介されています。
データにユニークなIDの様なものがあれば、SQLでIDの範囲を指定して、複数回に分けて読み込めば良いでしょう。適当なものが無ければ、全てRecordsetに読み込んで、Recordsetに対して処理して分割する事になりますが、これはメモリーを食って得策ではないかもしれません。
参考URL:http://blog.livedoor.jp/akf0/archives/51387288.html
投稿日時 - 2008-08-13 14:34:36
こんにちは。
今回も、また、「フリーソフトウェアはなし」という条件付きになりそうですね。
私の記憶では、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
投稿日時 - 2008-08-13 14:28:06
csvファイルを分割する目的でわざわざAccessを使う必要性はありません。
参考URLは、CSVファイル分割ソフトのほんの一例です。
参考URL:http://hioki.jp/soft/csvc100/csvc100_j.html
投稿日時 - 2008-08-13 13:29:49
お礼
さっそくありがとうございます。
とても便利そうなソフトですね。
ただ、残念ながらわたしの会社では会社の指定外のソフトウエアの導入が禁止されているのでつかえないのです。
こんど自宅で試して見ます。
ありがとうございました。
投稿日時 - 2008-08-13 15:00:07
OKWaveのオススメ
おすすめリンク