• ベストアンサー

困ってます。

エクセルで、テキストファイルを読み込むプログラムをVBAで作ろうとしています。 ネットで見つけたコードで実現可能ですが、行数が多くなると、 時間がものすごくかかり、また途中で止まってしまう場合があります。 (大体15万行ぐらい) 途中で止まらず、極力早く処理できるお勧めのプログラムはないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

#1他です。 最後に、私が調べて、作ってみたコードを上げてみます。 処理時間が辛抱できないレベルか、どうか、結果を教えてくだされば幸いです。 ーー 標準モジュールにコピペして、実行。 きゅうBasic時代からある、Line InputとVBAのTexttocolumnsを使っています。 (注意) ただし質問者の場合に合わせて、数か所修正する必要があります。 ・ファイルのフルパス名 ・最終結果を置く列(下記 H列ーー>?) ・FieldInfo:= 以下の部分ー→各列の数とそのデータタイプの設定。   1は数値、2は文字列、 ーーー Sub test05() '--画面更新の抑止など With Application .EnableEvents = False .ScreenUpdating = False .Cursor = xlWait .Calculation = xlManual End With '-- Dim dt As Variant Open "C:\Users\XX\ドキュメント\Documents\csvデータ例5.csv" For Input As #1 i = 1 '---レコードの読み込み繰り返し While Not EOF(1) Line Input #1, d 'MsgBox d d = Replace(d, """", "") ActiveSheet.Range("A" & i) = d 'A列に読んだまま一旦データセット '------各列のデータタイプの設定 Range("A" & i).TextToColumns _ Destination:=Range("H" & i), _ DataType:=xlDelimited, _ Comma:=True, _ FieldInfo:=Array( _ Array(1, 1), _ Array(2, 2), _ Array(3, 1), _ Array(4, 2), _ Array(5, 1) _ ) '------- i = i + 1 '次の行へ Wend '---- Close #1 Application.ScreenUpdating = True End Sub ーー 以下参考。 下記はコードはコードが簡単だが、フィールドのデータ性格が文字列になってしまう。 下記の「1をかけて数値化」以下のコードが、うざったいし、速度低下を招きそうだ。 A,B,C,D,E列の例なので、一部修正が必要だが。 Sub test02() With Application .EnableEvents = False .ScreenUpdating = False .Cursor = xlWait .Calculation = xlManual End With '-- Dim dt As Variant Open "C:\Users\xx\ドキュメント\Documents\csvデータ例5.csv" For Input As #1 i = 1 While Not EOF(1) Line Input #1, d 'MsgBox d d = Replace(d, """", "") dt = Split(d, ",") ActiveSheet.Range("A" & i & ":E" & i) = dt i = i + 1 Wend Close #1 With Application .ScreenUpdating = True End With '----数値の列のデータは、1をかけて数値化 Range("M1").Copy Range("A1:A10").PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, SkipBlanks:=False, Transpose:=False Range("c1:c10").PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, SkipBlanks:=False, Transpose:=False Range("E1:E10").PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, SkipBlanks:=False, Transpose:=False End Sub 各列にデータを分散するのに、質問者が「ネットで見つけたコード」での ForNextの繰り返しが、好みに合わなかったので。でもその繰り返しが スピードの低下原因ではないと思うが。 ーーー 参考 https://excelwork.info/excel/vbatexttocolumns/ セルのデータを区切り文字で複数のセルに分割する(TextToColumns メソッド)

the-man
質問者

お礼

丁寧にご回答ありがとうございます。 もう少し、VBAの勉強もしてみます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

#1です。補足有難うございます。 処理時間に影響しそうなのは、ファイルが数種類あるようですね。1本のファイルで10万件ぐらいかと思っていました。 ーー >ネットで見つけたコード は今初めて見ましたが、私が#1の回答後すぐ自作したものとほとんど変わりありません。私が挙げたタイプの(1)+多少(2)を加えらタイプですね。 ーー テキストファイルにもデータ項目の表現に数種あって、普通は数値はダブルコート無し、文字列は””で囲む、タイプが主流と思いますが、逆のようで、意外ですね。しかしこの点は、処理時間に影響しないでしょう。 ””を省いてしまえばよいかもしれません。 ーー >ネットで見つけたコード では、ScreenUpdatingをFalseにするコードが入っていません。 これは入れてみる価値があると思います。  上記の作成者は、常識と思って省いたのかもしれない。 私も今までの回答で、メイン話題ではないので、よく添えるのを忘れています。

the-man
質問者

お礼

ありがとうございます。 読み取るテキストファイルは、複数ありますが、 1つの場合、どのようにコードを直せばよいでしょうか? >では、ScreenUpdatingをFalseにするコードが入っていません。 分かりました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

高速化テクニックを議論するのは、上級スキルの人だと思う。 また質問説明が鋭くない。 >大体15万行ぐ 少なくはないが、取り立てて多いというレコード数でもない。 >テキストファイル どんなものか1-2レコード例示するのが筋だろう。CSVファイルとかね。 メモ帳にでも読ませて、少数行を質問にコピペするとか。 ーー ExcelVBA関連で、テキストファイルを読むコードとしては、下記のようなものを目にする。 「ネットで見つけたコード」は、そのうちどれかな。 (1)旧Basic (2)Basic6.0系 エクセルVBA系 (3)FSO (4)ADO系 この方法が遅いという議論はテキストファイルでは聞いたことがない。 ーー 質問には参考までに、「>ネットで見つけたコード」をかかげて 質問するのが筋だろう。(そんなに行数はないはず)それも示さないで、遅いです、と言っても、読者には、問題点もわからないから、答えようがないのと違いますか。 ーー ネットで見つけたコード」には、 ・Application.ScreenUpdating = False は入っているか 参考 http://officetanaka.net/excel/vba/speed/s1.htm 「VBA高速化テクニックー画面を止める」 ・シートの自動計算は止めてあるか ーー 他に、配列の利用などが、高速化で議論される。

the-man
質問者

お礼

>また質問説明が鋭くない。 言葉不足で申し訳ありません。 例えば、テキストデータの中身は下記のような感じで、15万行ぐらいあります。 <店舗:東京> A-1 電球,"10","1" A-2 テレビ,"20","2" A-3 エアコン,"30","3" A-4 コンロ,"40","4" A-5 せんぷうき,"50","5" ・ ・ ・ A-3000 電卓,"60","6" /店舗:大阪/ A-1-1 砂糖,"100","11" A-2-1 塩,"200","22" A-3-1 とうがらし,"300","13" A-4-1 わさび,"400","20" A-5-1 こしょう,"500","33" ・ ・ ・ A-1000-1 ショウガ,"600","10" ★店舗:北海道★ A-10 セリーヌ,"99","1" A-20 ガブリエル,"98","2" A-30 エマニエル,"97","3" A-40 マイケル,"96","4" A-50 ガガ,"95","2" ・ ・ ・ A-600 少女A,"94","1" ネットで借用させていただいたプログラムは、 https://www.239-programing.com/excel-vba/basic/basic092.htmlです。 読み込み例1です。

関連するQ&A