アプリ版:「スタンプのみでお礼する」機能のリリースについて

200万行のCSVファイルをエクセルに読み込みたいです。Rows.Countを超えるので、2回に分けて
半分読み込み
処理
残り半分読み込み
処理
のようにしたいのです。どうすればいいでしょうか?

参考までに、検索したところ下記のQ&Aは見つかりました。
https://oshiete.goo.ne.jp/qa/3407338.html
ただ、これは途中の任意の1行を読み込む方法です。

100万行のファイルを2個作る等のようなとんちの利いた回答はナシでお願いします。
他に無ければしますが。。。

質問者からの補足コメント

  • 動作確認ok。
    パスのみ入力すべき所にファイル名も入れてしまい、エラーとなってました。

    No.4の回答に寄せられた補足コメントです。 補足日時:2015/06/15 17:30

A 回答 (6件)

使えそうな項目が無いですね・・・。


ExcelでCSVファイルを読み込むときに頭を悩ませるデータ型の変更、
(電話番号の前ゼロ消失、
郵便番号が日付になったり計算されてしまう・・・が無さそうなのでマシかも)

CSVファイルのフルパスが
D:\SampleData\てすと.csv
で、
タイトル行が無い場合のコードです。パスとファイル名は適宜書き換えてください。
20行程度の小さなテストデータで問題なかったら本番でお試しを。
数分かかるかと思います。

Sub Test()
Dim Cn As Object
Dim Rs As Object
Dim i As Long, k As Long, j As Integer

Set Cn = CreateObject("ADODB.Connection")

With Cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = _
"Data Source=D:\SampleData;" _
& "Extended Properties='text;HDR=NO;" _
& "FMT=Delimited'"
.Open
End With

Set Rs = CreateObject("ADODB.Recordset")
Rs.CursorLocation = 3 'adUseClient
Rs.Open "SELECT * FROM てすと.csv", Cn, 0, 1, 1

MsgBox "項目数は" & Rs.Fields.Count _
& vbNewLine _
& "行数は" & Rs.RecordCount

Application.ScreenUpdating = False
Sheets(1).Range("A1").CopyFromRecordset Rs, 10 '←本番では1000000に

'残りはシート2に
Rs.absolutePosition = 11 '←本番では1000001に
Do Until Rs.EOF
k = k + 1
If k > 1048576 Then
MsgBox "最大行数を超えました。もう無理!"
Exit Do
End If
For j = 1 To Rs.Fields.Count
Sheets(2).Cells(k, j) = Rs.Fields(j - 1)
Next
Rs.movenext
Loop
Application.ScreenUpdating = True
Rs.Close: Set Rs = Nothing
Set Cn = Nothing
End Sub
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。
まだテスト出来てません。8列目に商品ごとに連番をつけられそうです。
8列目
1
1

5万行

2
2
2
5万行

使えそうでしょうか?

お礼日時:2015/06/11 19:53

念のため、Cドライブ直下にファイルを置いて試しましたが問題ありませんでした。


ただ、Windows Vista?以降からはCドライブ直下はUAC(User Account Control)の制約を受けますので
その為かもしれません。
フォルダを作成し、C:\Temp\Book1.csv などにしてみたらどうですか?

前略
With Cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = _
"Data Source=C:\temp\;" _
& "Extended Properties='text;HDR=NO;" _
& "FMT=Delimited'"
.Open
End With

Set Rs = CreateObject("ADODB.Recordset")
Rs.CursorLocation = 3 'adUseClient
Rs.Open "SELECT * FROM Book1.csv", Cn, 0, 1, 1
後略

"Data Source=C:\temp\;" _ は"Data Source=C:\temp;" _ と
最後の\が無くても動きますが付けといてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
本番ファイルで動作確認出来ました。
パスだけ入力する所にファイル名も入れてしまった為に、エラーになってました。

お礼日時:2015/06/15 17:27

とりあえず小さいデータ(20行位)でお試しください。


不都合があれば考えます。
こちらでダミーデータ(Yosoo.co.jp?で取得)
2004/1/5 0:00:00,1301,"極洋",171,172,169,169,384000
2004/1/6 0:00:00,1301,"極洋",170,170,166,167,475000
・・・
が180万行で行ったところ
レコードオープン 20秒
CopyFromRecordset終了 5秒
シート2への転記 162秒
合計3分位(4年前の中堅PC、Win7 64bit & Excel2010 32bit)
でした。

なお、シート1では
2004/1/5 1301 極洋 171 172 169 169 384000
シート2では
37666 4667 アイサンテクノロジー 105 105 105 105 1000
のように日付時刻型のデータが実数になりました。
また、
シート1とシート2内の使用セルをクリア(Ctrl + A で Delete)しても
xlsxファイルのサイズは6MB程度、
中身が無い?のに開きなおすのに1・2秒かかるようになりました。
この辺は未経験です。

>8列目に商品ごとに連番をつけられそうです。
必ず1商品に付き5万行であるなら抽出条件に設定すれば可能かと。
    • good
    • 0
この回答へのお礼

やってみましたが、エラーでした。
実行時エラー
「パス'C:\Book1.CSV'は正しくありません。パス名に間違いないことと、ファイルがおかれたサーバーに接続していることを確認してください。」
.Openの行で発生します。ファイルの場所と名前を変えただけなんですが。。。データはエクセルで作ってCSVで保存したものです。

1商品につき常に5万行ではありません。行数は上下します。残念。

お礼日時:2015/06/12 20:31

そちらのCSVファイルがまったく不明ですが


大体半分くらいに分けられるモノ
連番や男女などの項目があれば簡単ですが
項目名の有無・使えそうな項目はありますか?

レコード数に関してはOpenするまえに
rs.CursorLocation = 3 'adUseClient
を記述すれば、rs.recordcount で取得できます。

現状のコードを提示してくだされば具体的な回答も可能かも?
    • good
    • 0
この回答へのお礼

ありがとうございます。
何となく分かって来ました。単純な行数の概念がなく、あくまでデータを見て識別するのでしょうか?

⚫6~7列
⚫2列目に商品名の文字列、同一文字列が5万行程度続き、次の商品名に変わる
⚫1列目は上記商品名の通し番号。1~5万程度。商品名が変わると1にリセット。

残りの列は数字の羅列です。

お礼日時:2015/06/10 19:22

こんにちは


質問者様がご提示されたリンク先の回答者No.3様のSQL文のWHEREの部分を

 WHERE 連番<='500000'
 WHERE 連番>'500000'

の様にすることで、その後のDo ~ Loopで前半、後半にわけて読み出すことができましたよ。

こんな使い方ができるのですね、勉強になりました。
    • good
    • 0
この回答へのお礼

ありがとうございます。
質問文からは漏れてましたが、全体の行数は解らないでしょうか?

お礼日時:2015/06/10 07:16

キーエンスの販促資料?の「とる・みる・使う…」というやつの中に


「CSVファイルを分割で読み込む」と言うのがあります。
キーエンスに電話したら大喜びで持ってくると思います……

他にも結構いいこと書いてあります。キーエンスの電話攻撃がうざいけど。
    • good
    • 0
この回答へのお礼

ありがとうございます。
キーエンスからの購入予定はありません。

お礼日時:2015/06/09 22:18

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A