プロが教える店舗&オフィスのセキュリティ対策術

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

こんな場合、エクセルではどのような対応をすればいいのでしょうか?
(エクセル2007を使えという答えは勘弁してください。)

A 回答 (5件)

別にexcelで開かなくても、wordで開いちゃえばいいじゃないですか。



word上で、適当な行数で切って「書式なし(*.txt)」で保存すれば
済む話です。ナンなら「メモ帳」でも同じことが出来ますよ。
    • good
    • 0
この回答へのお礼

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

ありがとうございました。

お礼日時:2008/08/13 15:02

#3の補足


説明の文章とコードが違います。

# A1から入れていくとは思っていますが、そうでなければ、iCol を変えてください。i =1 になっていますが、それを変えても、最初のシートだけです。

コードを直し、iROW, iCOL で最初の位置を決められるようにしました。しかし、iCOL は、256列のままですから、当面、iCOL = 1のままでお願いします。
本来は、

 If j > 256 -iCOL Then j = 256 -iCOL
で、右の限界を決めなくてはなりませんでした。
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございませんでした。
No2の方のアドバイスでワードで取り込むことができたデータをいままで処理しておりました。
やっと終わりました。

Wendy02さまのいつもながら鮮やかな魔術を見せていただいてありがとうございます。
ためしたところ完璧に取り込めました。今後はこれで大きなCSVが送付されても慌てずに対処できそうです。
コードじっくり勉強させていただきます。
ありがとうございました。

お礼日時:2008/08/14 16:27

参考URLに、A No.3の様に、テキストファイルとして処理する方法と、ADOで接続する方法が紹介されています。


データにユニークなIDの様なものがあれば、SQLでIDの範囲を指定して、複数回に分けて読み込めば良いでしょう。適当なものが無ければ、全てRecordsetに読み込んで、Recordsetに対して処理して分割する事になりますが、これはメモリーを食って得策ではないかもしれません。

参考URL:http://blog.livedoor.jp/akf0/archives/51387288.h …
    • good
    • 0

こんにちは。



今回も、また、「フリーソフトウェアはなし」という条件付きになりそうですね。

私の記憶では、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
    • good
    • 1

csvファイルを分割する目的でわざわざAccessを使う必要性はありません。


参考URLは、CSVファイル分割ソフトのほんの一例です。

参考URL:http://hioki.jp/soft/csvc100/csvc100_j.html
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/13 15:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!