エクセル2000です。
現在CSV形式のファイルをもらい、エクセルVBAで1行づつエクセルに取り込み、加工しています。(CODEは、かなり省略していますが下記の通り)
データは将来的には何万件におよぶことも考えられます。
ためしに65536を超えるデータを読み込ませたところ65536を超えたところでやはりエラーになりました。Workbooks.Openでエクセル形式で開いているので65536を超える部分は無視されるからだと思います。
このような場合には、どうやってCSVファイルからデータを読み込めばよいのでしょうか?(なお、エクセルは当分2007にはなりそうもありません。アクセスはまったく使えません。)
Sub TEST01()
Set cf = Workbooks.Open(Filename:=ThisWorkbook.Path & "\test.csv")
Set zerro = cf.Sheets(1).Range("A1:AX1")
ThisWorkbook.Sheets("Sheet1").Activate
Do Until zerro.Cells(1).Value = ""
ThisWorkbook.Sheets("Sheet1").Range("A1:AX1").Value = zerro.Value
'処理マクロ省略
Set zerro = zerro.Offset(1)
Loop
End Sub
No.1ベストアンサー
- 回答日時:
一括で読み込もうとするからダメなのであって、1行ずつ読み込むようにすれば何行にでも対応できると思います。
こんなページを見つけました:
http://www.k1simplify.com/vba/tipsleaf/leaf291.h …
上記ページのプログラムは全行読み込んでいますが、ループのところをちょっと加工すれば(行数をカウントして65536を超えたら新しいシートを作ってそっちに書き込むなど)、長大なレコード数に対応できると思います。
ただ、処理の内容にもよりますがExcelでは65536行を超えるデータを1枚のワークシートに保持できませんから、たとえばピボットテーブルなどを作りたい場合はどうしようもありません。
合計を集計するだけとかなら問題ないですけど。
やはり最終的にはAccessを導入すべきかと思います。
この回答への補足
ご教示のページ、参考にしてなんとか出来ました。
有難うございました。
Sub CSV_Read3()
Dim FileNamePath As String
Dim textline, csvline() As String
Dim Rowcnt, ColumNum As Integer
Dim ch1 As Long
MsgBox "作業開始後、中断したい場合には、Ctrlキー+Breakキーを押してください。" _
, vbInformation, " (´^∇^)σ"
FileNamePath = ThisWorkbook.Path & "\test.csv"
ch1 = FreeFile '空いているファイル番号を取得
Open FileNamePath For Input As #ch1 'FileNamePath のファイルをオープン
On Error GoTo erLine 'エラーが発生したらファイルを閉じる
Application.EnableCancelKey = xlErrorHandler
Do While Not EOF(ch1) 'ファイルの終端かどうかを確認
Line Input #ch1, textline '1行読み込み
textline = Replace(textline, """", "") 'ダブルクォーテーションを削除
csvline() = Split(textline, ",") 'カンマで分離
Range(Cells(1, 1), _
Cells(1, UBound(csvline()) + 1)) = csvline() '配列渡しでセルに代入
'VBA処理省略
Application.StatusBar = Cells(1, 1)
Loop
erLine:
If Err.Number = 18 Then
MsgBox "中断キーが押されました。" & Chr(10) & _
"終了します。" _
& Chr(10) & "バイバイ。", vbCritical, " ( ; ゜Д゜)"
ElseIf Err.Number <> 0 Then
MsgBox Err.Number & ":" & Err.Description
End If
Close #ch1 'ファイルを閉じる
Application.StatusBar = ""
Application.EnableCancelKey = xlInterrupt
End Sub
ありがとうございます。
やりたいことは、いわば差込印刷に毛の生えたようなものなので、1行ずつ読みこみ、その分の処理が終われば消去して、また次の行を読み込んでくればいいのです。
ご教示のページ、参考にしてみます。
No.9
- 回答日時:
#2 です。
>だから65,536行よりも大きいCSVをまるごとインポートすることではありません。
サイトを紹介しただけで、そのものズバリではありません。
細かな事情は分かりませんが、それをヒントにして、インポートして、Excelに表示しなくても、そのままOutput を組み合わせて出力してしまえば、ワークシートに出す必要もありませんね。また、外部オートメーションの必要もありませんね。
merlionXX さんなら、インポートが出来れば、エクスポートもお分かりになるかと思います。後は、ご自身でお考えください。
No.8
- 回答日時:
merlionXXさまのことですのでご存じとは思いますが、FileSystemObjectを利用する方法もありますね。
UNICODEなら OpenAsTextStream(1, 0) だったと思います
Sub TextImport()
Dim FSO, buf As String
Dim idx As Long
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.GetFile("z:\OnDemandScanLog.txt").OpenAsTextStream(1, -2)
Do
buf = .ReadLine
Cells(1, 1).Value = buf
' 差し込み印刷(?)処理 挿入
Loop Until .AtEndOfStream
.Close
End With
Set FSO = Nothing
End Sub
No.7
- 回答日時:
補足:
中途で読み込みを強制終了したい場合は、
FileRead "", True
でOKです。
No.6
- 回答日時:
エクセルの根本的制約事項として、不可能とはっきりしていることを、いまさら聞いても無駄でしょう。
>2007にはなりそうもありません
上司でも相談したの。新製品も出て、2万円前後の金で解決することではないの。ただ今のパソコンのスペックは問題だが。それに設計思想が100万行になっただけで、処理反応時間が快適かどうかはべつですが。
情報処理に、コストがかかることは認識されているのでしょうかね。
ーーー
もうひとつ
(1)6万の続きを、同一シート別列に読み込むと、後の処理の重大な障害になるか。
(2)6万の続きを、別シートに読み込むと、重大な障害になるか。
そういうことが、言及されてないが。
(1)(2)をやる場合、VBAでCSVファイルをよむプログラムを探すか作らないといけないが、旧BASICのころから行われている簡単なコードなので、WEBを照会すれば、沢山転がっている。
No.5
- 回答日時:
<Book2.csv>
1,A
2,B
3,C
4,D
5,E
6,F
7,G
このような csv ファイルを1行づつ読み込んで、Sheet(1)、Sheet(2)、Sheet(3)等に2行づつ転記。
Private Sub CommandButton1_Click()
Dim I As Integer
Dim N As Integer
Dim R As Integer
Dim intCount As Integer
Dim intSheet_New As Integer
Dim intSheet_Now As Integer
Dim Datas As String
Dim strValues() As String
Do
Datas = FileRead("C:\temp\Book2.csv") ' 1行だけ読み込む
If Len(Datas) > 2 Then ' 終端の判断
intCount = intCount + 1 ' カウントアップ
intSheet_New = (intCount + 1) \ 2 ' シートインデックス確定
If intSheet_New <> intSheet_Now Then ' ニューシート移行時の行インデックス(R)の初期化
R = 0
intSheet_Now = intSheet_New
End If
strValues() = Split(Datas, ",") ' 各セルデータに分割
R = R + 1 ' 行カウントアップ
N = UBound(strValues()) ' 列数取得
For I = 0 To N
Worksheets(intSheet_Now).Activate ' シートアクティブ
ActiveSheet.Cells(R, I + 1) = strValues(I) ' データ転記
Next I
Else
Exit Do
End If
Loop Until (0)
End Sub
ポイントは、1行づつ順次に読み込む FileRead関数を利用していることです。
<標準モジュール>
Option Explicit
Public Function FileRead(ByVal FileName As String, Optional isStop As Boolean = False) As String
On Error GoTo Err_FileRead
Static isOpen As Boolean
Static fso As FileSystemObject
Static fil As File
Static txs As TextStream
If Not isOpen Then
isOpen = True
Set fso = New FileSystemObject
Set fil = fso.GetFile(FileName)
Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)
End If
FileRead = txs.ReadLine
Exit_FileRead:
If Len(FileRead) = 0 Or isStop Then
isOpen = False
Set txs = Nothing
Set fil = Nothing
Set fso = Nothing
End If
Exit Function
Err_FileRead:
Resume Exit_FileRead
End Function
※Microsoft scripting runtime 参照設定が必要。
No.3
- 回答日時:
エクセルにお任せで読み込む方法は無いので、全てをVBAで制御する必要があります。
ファイルの OPEN 文を使って指定ファイルを開き、
INPUT/LINEINPUT 文を使って1行ずつ読み込みます。
65536行を超える場合は、カウンターを使って設定した読込範囲をチェックしながら読み込む必要があります。
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …
No.2
- 回答日時:
こんにちは。
以下でお分かりになると思いますが、
65,536行よりも大きいテキストファイルは、Excel97,Excel2000, Excel2002, Excel2003
では、インポートできません。
http://support.microsoft.com/default.aspx?scid=k …
Open FileName For Input As #FileNum
で、65,536行を越えたら、Worksheets.Add して、再びインポートしていきます。
ありがとうございます。
やりたいことは、いわば差込印刷に毛の生えたようなものなので、1行ずつ読みこみ、その分の処理が終われば消去して、また次の行を読み込んでくればいいのです。
だから65,536行よりも大きいCSVをまるごとインポートすることではありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
3分あったら何をしますか?
カップ麺にお湯を入れて、できるまでの3分間で皆さんは何をしていますか?
-
2024年に成し遂げたこと
今年も残すところわずか。 皆さんが今年達成したことを教えていただきたいです。 どんな小さなものでも構いません。
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
店員も客も斜め上を行くデパートの福袋
シュールを通り越して店員も客も斜め上を行くデパートの福袋に入ってそうなものを教えて下さい。 よかったらレビューもしてください。
-
エクセル2000で65536行を超えるCSVファイルの読み込み方法
Excel(エクセル)
-
Excel 2007で6万5536行以上のデータ
その他(Microsoft Office)
-
【ExcelVBA】300万件越えCSVから条件を満たす行だけ抽出するには?
Visual Basic(VBA)
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでエクセルシートを更新...
-
excelで、セル内に文字が入力さ...
-
エクセルのシートを同時に行削...
-
「24日の0時」って・・・
-
エクセルのチェックボックスを...
-
自己推薦書についてです! 自己...
-
エクセルで最高値、最低値の日...
-
エクセルで日付別にシートを分...
-
VBA 入力日付を取得し、今日ま...
-
マクロボタンを押すと、ファイ...
-
重複を除外したカウント方法を...
-
Facebookで投稿日時を変更できない
-
回覧板の日付について質問です...
-
エクセル マクロで指定日にメ...
-
PDFファイルに日付を名前にして...
-
宀や广など、部首だけを入力す...
-
「時間」、「期日」、「日付」...
-
日付の大小の表現
-
DIORのオンラインショップの購...
-
差込印刷 縦書きで和暦(漢数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでエクセルシートを更新...
-
excelで、セル内に文字が入力さ...
-
エクセルのシートを同時に行削...
-
【エクセル】シートのロックで...
-
表示倍率を変更させない方法
-
エクセルで、2つのシートにある...
-
エクセルの担当者別にシートを...
-
エクセルVBAで65536レコードを...
-
Excelで、表に小計と合計を入れ...
-
エクセルVBAの文字列の部分一致...
-
エクセルVBAでデータ検索について
-
Excelのマクロで、開いた時に、...
-
マクロを業務で生かしたい!
-
エクセル、日々の集計整理方法。
-
エクセルで別シート、または別...
-
エクセル◎○の人は、一つ昇格し...
-
エクセルシートの統合
-
エクセル表作成についてお分か...
-
シートを串刺しで抽出したいの...
-
エクセル スクロールバー
おすすめ情報