
VBA初心者です。よろしくご教授のほどお願いします。
エクセルのシートに読み込んだCSVファイルのデータを転写する下記のVBAを作ったところ
テストではうまくいくのですが、本来の転写先である40Mぐらいあるワークブックで試す
と、途中で読み込みをストップしてしまいます。
どのように対処したら良いのでしょうか。
(CSVデータは13フィールド×5000行ぐらいです。)
Open "C:\data\a.csv" For Input As #1
Do Until EOF(1)
Line Input #1, buf
tmp = Split(buf, ",")
For i = 0 To 12
Worksheets("deta-a").Cells(n, i + 1).Value = tmp(i)
Next i
n = n + 1
Loop
Close #1
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
こんにちは。
>取り込み先のエクセルブックが40Mあるのです。
そういうことでしたか。想像つきませんでしたね。
>新規のエクセルブックにコードをコピペして実行すると2秒ぐらいで完了します。
それに、Excel のバージョンをお聞きしていなかったのです。
40Mというのは巨大なサイズなのです。
OS とExcelのVersionの関係では、もう無理かもしれません。例えば、Excel 2000とか2002など。
私が、最初に使ったCSVファイルを、Excelファイル Xlsxに保存しなおしても、11M程度です。
私は、Exce 2010なのですが、そのファイルサイズで、さらに上乗せはせず、データファイルとしての利用以外にはしません。
それに、再計算や他のマクロが連動して動いているのではないでしょうか。
Application.EnableEvents =False
これだけでは足りない場合があります。
実際には、最低限、この程度は加えていらっしゃいますか?
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'Application.EnableEvents =False '場合による
'マクロコード
'Application.EnableEvents = True
Application..Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
他にも
Application.Interactive = False 'マクロが終わるまで一切を受け付けない設定(特殊)
Application.DisplayAlerts = False
があります。
しかし、「取り込み先」ファイル自体に、すでに問題が発生しているような気がします。あえてそのブック・ファイルを使うにしても、単なるデータファイルなら、完全にマクロも、場合によっては書式もなくして保管したほうがよいでしょうね。マクロも外部のブックやアドインから行うようにします。
No.2
- 回答日時:
こんばんは。
#1の回答者です。
私が最初に考えた回答は、まったく違うものでしたが、いきなり書くよりも、コードをみて、コード自体を指摘したほうがよいと思ったからです。今は、やっぱりそうだったかな、というところです。
>sleep 1でCPUを少し休ませることも実験したのですが、結果は同じでした。
Sleep 1 では、1/1000 秒ですから、ほとんど意味はありませんね。
Sleep 500 ~ 1000ぐらいなら、効き目があるかもしれませんが、DoEvents も入れたほうがよいかもしれません。
最初の案は、直接、エラーを回避する方法ではありません。
第1案
お話の様子で、最初、
On Error Goto ErrHandler はご存知だと思いますが、エラートラップを仕掛けして、このエラーが発生した時に、MsgBox などで、i の値(エラーを出した行数)を調べればよいと考えました。
たぶん、Next まで通ってなければ、そのものズバリの行数ですから、テキスト・エディタで、その行の所を調べるわけです。その時に、もしかしたら、テキストでは読めない部分が存在していないか、ということです。
それにしても、一体、コードのどこでエラーが発生しているかも、特定できたほうがよいでしょうね。
もし、iの値が分かったなら、そこから、また読み込みしていけば、と考えました。
……別案、第4案に続く
第2案
あまりお勧めではないのですが、WorksheetFunctio のClean 関数を用いることで、バイナリーコードを抜くということです。
Line Input #FNo, buf 'の次の行
buf = WorksheetFunction.Clean(buf) '←
バイナリーとは言っても、せいぜい、エスケープコードレベルでも、気休めにしかはなりませんが、最も期待度が低い一番簡単な方法です。
第3案
鈍足ですが、TextStreem のFileSystemObject で、OpenTextFile(ファイル名)のオブジェクトから、
ReadLineで読み込んでみる方法があります。
第4案
回答#1で使った、ZIP_ALL.CSV というのは、全国の郵便番号とその住所のファイルで、11 M程度ですが、なかなか大きなファイルです。それでも、40Mはこの4倍近いわけで、巨大なファイルには違いありません。それが原因かとも考えました。
そこで、Text分割という方法も考えてみたら、と思いました。Window7辺りでも、ファイル分割ツールは備えてはいますが、ダウンロードサイトのVector辺りには、Divという名前のアプリも存在しているようです。
連続して、分割で読み込んだらできるかもしれません。
WindFallerさん こんにちは
csvデータそのものは、13×5000程度なので500kもありません。取り込み先のエクセルブックが40Mあるのです。いつまで経っても終わらないので、ブレークしてみるとその度ごとにブレークポイントが違います。新規のエクセルブックにコードをコピペして実行すると2秒ぐらいで完了します。ちなみにPCはノートでメモリは4Gです。
No.1
- 回答日時:
こんばんは。
> Worksheets("deta-a").Cells(n, i + 1).Value = tmp(i)
全文がないので、n の初期値は気になるけれども、同じようには書かないまでも、他は、そんなに間違っているとは思えません。
ただ、ここの部分はちょっと気になります。
>For i = 0 To 12
この部分は、12とハードコーディング(キメウチ)していますが、大丈夫ですか?
区切り数が12よりも超えていればよいのですが、12より以下ですと、ハングするはずです。
CSVファイルで、40Mというのも、ちょっと気になります。
これは、私が試してみたコードです。以下の※の部分をごらんください。
'//
Sub TestMacro2()
Dim myPath As String
Dim fn As String
Dim i As Long
Dim n As Long
Dim tmp As Variant
Dim FNo As Integer
myPath = "C:\temp\"
fn = "ZIP_ALL.csv"
n = 1
FNo = FreeFile()
Application.ScreenUpdating = False
Open myPath & fn For Input As #FNo
Do Until EOF(FNo)
Line Input #FNo, buf
tmp = Split(buf, ",")
For i = 0 To UBound(tmp) '←※こんな風にします。
Cells(n, i + 1).Value = tmp(i)
Next i
n = n + 1
Loop
Close #FNo
Application.ScreenUpdating = True
End Sub
'//
WindFallerさん こんにちは!
早々にご教授いただきありがとうございました。
教えて頂いたコードでやってみたのですが、やはり40Mのエクセルファイルでは途中でハングしてしまいます。まっさらのエクセルファイルだと3秒ぐらいで書き込みが終わるのですが。。。。
sleep 1でCPUを少し休ませることも実験したのですが、結果は同じでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ワード+エクセルのマクロ
-
エクセルのプロパティーでセキ...
-
Word文書:頁数カウント
-
ファイルのアクセス回数について
-
ExcelブックをGoogleスプレッド...
-
多数のエクセルファイルからデ...
-
エクセルで、フィルタかけたま...
-
EXCELからACCESSへデータをイン...
-
エクセルのマクロを記述したフ...
-
エクセル UserForm 呼び出しで...
-
EXCEL。違うバージョンの使用
-
エクセルでcsvファイルを開いて...
-
エクセルのマクロの記録でcs...
-
シートをコピーするマクロ
-
photoshop CC2019で画像の形式...
-
エクセルVBAでCSVファイ...
-
エクセルvba お世話になります...
-
Dドライブから外付けHDへコピー...
-
バイナリデーター内の文字を検索
-
EXCEL VBAにおけるサンプルコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルのプロパティーでセキ...
-
ファイルのアクセス回数について
-
ExcelブックをGoogleスプレッド...
-
Wordで差込印刷した後に別々の...
-
Excel csv保存 列数が異なる場...
-
マクロ実行後、表示がおかしくなる
-
エクセル UserForm 呼び出しで...
-
エクセルファイル名に更新日時...
-
EXCEL 検索時の設定
-
サブフォルダから部分一致のエ...
-
PowerPoint 2002でファイル名を...
-
【Excel VBA】ファイルを保存し...
-
大量のCSVファイルをExcel形式...
-
複数のexcelのファイルを一括で...
-
実行時エラー52
-
エクセルのマクロで行と列の削...
-
For~Nextルーチンで最初の1回...
-
エクセルでcsvファイルを開いて...
-
VBAでエクセルで作成したフ...
-
Word2010で閉じるボタン押下後...
おすすめ情報