- 締切済み
excelVBA CSVの読み込み処理について
excel2000を使用しております。 約10万行のcsvファイルを2万行づつシートを分けて読み込んで行きたいですが 可能でしょうか? (1) テキストインポートダイアログを開いてcsvファイルを指定。 (2) 2万行づつシートに順次入力を行う。 お手数ですがご教授お願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- end-u
- ベストアンサー率79% (496/625)
mitarashiさんご紹介のスレッドリンク http://okwave.jp/qa/q4557028.html?order=asc このレス#1のCopyFromRecordsetメソッドの引数MaxRowsを使用する方法が便利だと思います。 でもそのお礼欄に以下の記述があります。 >'EOFがTrueになるので、最初に戻す。 >objRes.MoveFirst >'すでに取得したデータを飛ばす。 >objRes.Move (50000 * i) これは不要ですね。 MaxRowsを指定して分割して読み込んだ場合はEOFはTrueになりません。 http://okwave.jp/qa/q5715216.html?order=asc 再掲 Sub CSV分割読み込み() Const LIMIT As Long = 20000 '1Sheetあたりの分割数 Dim wkCon As Object 'ADODB.Connection Dim wkRst As Object 'ADODB.Recordset Dim wkPath As String Dim wkCsv As String Dim wkSQL As String Dim ws As Worksheet Dim p As Long Dim x x = Application.GetOpenFilename("csvFiles,*.csv") If VarType(x) = vbBoolean Then MsgBox "cancel": Exit Sub ' With Application ' .ScreenUpdating = False ' .EnableEvents = False ' .Calculation = xlCalculationManual ' End With p = InStrRev(x, "\") wkPath = Left$(x, p) wkCsv = Mid$(x, p + 1) wkSQL = "SELECT * FROM [" & wkCsv & "];" On Error GoTo conErr Set wkCon = CreateObject("ADODB.Connection") With wkCon .Provider = "Microsoft.Jet.OLEDB.4.0" .Properties("Extended Properties") = "TEXT;HDR=no;FMT=Delimited" .Open wkPath End With On Error GoTo rsErr Set wkRst = CreateObject("ADODB.Recordset") wkRst.Open wkSQL, wkCon Do While Not wkRst.EOF Set ws = Sheets.Add ws.Range("A1").CopyFromRecordset wkRst, LIMIT Set ws = Nothing Loop wkRst.Close rsErr: wkCon.Close conErr: Set wkRst = Nothing Set wkCon = Nothing With Err() If .Number <> 0 Then Debug.Print .Number, .Description End If End With With Application .Calculation = xlCalculationAutomatic .EnableEvents = True .ScreenUpdating = True End With End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
こんな類型の課題を質問しているようではVBAの初心者なのだろう。 それより (1)出来合いのテキストエディタにでも読みこませて20000行ごとにコピーしエクセルの各シートに貼り付ける ことを考えてはどうか。 そしてシートの操作の、データー区切り位置ー区切り文字をカンマにしてデータ各列に分離する (2)VBAにこだわるなら、「テキストファイル VBA」ででも照会して勉強のこと。それさえやってないのではないか。 難しいことをせず、開始レコード数から20000レコードを各シートのA列に読み込ます (3)そしてデーター区切り位置ー区切り文字をカンマにしてデータ各列に分離する (4)5回の操作を行う。 にとどめておくのがよかろう。 ーー 参考 Sub test01() Application.ScreenUpdating = False Open "test01.csv" For Input As #1 strt = Val(InputBox("開始=")) tanni = 20 '20レコードごとのテスト用 i = 0 Do While Not EOF(1) Line Input #1, a i = i + 1 If i >= strt And i < strt + tanni Then MsgBox i & " " & a '手sヅト確認用。本番では削除。 ActiveSheet.Cells(i - strt + 1, "A") = a Else End If Loop Close #1 Application.ScreenUpdating = False End Sub 本質問は、丸投げ依頼なので、わざと操作も必要な風にして、VBAは初等的(したがって多少面倒)な方法にしている。 20,000レコードごとに次のシートに移って全体を自動化するのはたやすいのだが。
- mitarashi
- ベストアンサー率59% (574/965)
下記URLのNo.5がご参考になると存じます。 mySQL = "SELECT * FROM sample.csv WHERE [sample#csv].F3 = '良品'" のWHERE以降の抽出条件を取っ払えば、全件読み込みます。 http://okwave.jp/qa/q7205971.html