• ベストアンサー

困ってます。

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

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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/17068)
回答No.2

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

the-man
質問者

お礼

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

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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

  • 他のExcelファイルのVBAコードを検索したい

    他のExcelファイルに書かれたVBAコードに、ある特定のキーワード(パス名など)が使われているかを自動的に調べるためのVBAを書きたいと思っています。 仕事で使っているマクロが書かれたExcelファイルからある特定の処理をしているマクロを含むものを検索したいのですが、検索するExcelファイルが膨大なため、順番にExcelファイルを開いてVBAコードをチェックしていく工程をマクロ化したいのです。ファイルを順に開いていく処理はマクロ化できるのですが、書かれたVBAコードのチェックをどうしたらよいか悩んでいます。 「VBAコードに対して検索する」または「VBAコードを1行ずつ変数に代入する」、「モジュールシートをテキストファイルに出力する」などの処理が自動化できれば対応できそうなのですが、そのような処理をExcelVBAで作成できるでしょうか。 なお環境はWindowsXPのExcel2003です。 よろしくお願いいたします。

  • 【VBA】テキストファイルを指定行数からの読み込み

    こんばんは。 EXCEL VBAでテキストファイルを読み込む事について質問です。 VBAでテキストファイルをこちらから指定する行数(上から何番目という感じで)からデーターを読み込みたいのですが、どの関数をつかっていいかわからず困っています。 1行ずつ読みこむ「Input Line関数」では、無駄な行まで読み込むので動作が遅くなります。 読み込みたい行はすでにわかっているので、最初からその行に飛んでからデーター読み込みたいと思ってます。 ちなみに指定する行数は、ファイルによって違います。 あらかじめ「Input Line関数」で、ある文字が何行目にあるかを探す行為をあらかじめ行っています。 みなさまのアイデアを拝借したく、よろしくお願いします。

  • excel VBAの分岐の書き方について

    excel VBAの分岐の書き方について 列Aに、 ああ  いいい  うううう  ああ いいい ええ ・・・ のようなデータがあるとします。 このときにVBAのフォームで、 ああ いいい うううう ええ をチェックボックスで選ばせ、該当する行のみに処理を行いそれ以外には処理をしない、というプログラムを考えています。 どのように実装するのが正しい書き方でしょうか? 処理すべき行数は200行程度。ああ、いいい・・・等は10種類ほどで可変です。 in演算子で、配列をみれるような仕掛けがあるといいのですが。。。

  • 50万行のtxtファイルを行数指定で分割したい

    50万行レベルのテキストファイルがあります このファイルをVBAで行数を指定して3つのファイルに分割したいのですが可能でしょうか イメージとしては以下のような形になります ・一行目〜テキストボックス1で指定した行数 ・textbox1で指定した行数〜textbox2で指定した行数 ・textbox2で指定した行数〜最終行 どなたか教えて下さい よろしくお願いします

  • プログラミングのコード量に関する素朴な疑問

    自分がプログラミングを初めてから、ふと思った疑問なのですが、 たとえば、ファイナルファンタジーとかドラクエとかって、どのくらいのコードを書いて、あんなゲームになっているんだろう??なんて思いました。 僕はExcelのVBA機能を使ってプログラムをしているのですが、 ひとつのモジュールで、だいたい、1500行前後、これをWordで文字数をカウントしたら、約3万文字でした。 これ以上書きこむと、そのコードを実行するのに耐えられない時間を要するので、だいたいこの程度で、ひとつのモジュールを終えているんだと思います。 プログラムの書き方や、繰り返し処理の設定の仕方や、僕の場合はExcelベースなので、特にシートとのアクセスの多さでコード量なんてプログラムを組む人それぞれだと思いますが、プログラムを組むプロの人たちが、制限容量の中で頑張ってあんなゲームを作るためには、どんだけの行数、文字数を使ったプログラムを作成するんだろう? と、ふと疑問に思ってしまいました。 別にドラクエなどでなくてもよいのですが、たとえば、このプログラムはこんだけの量(行数だったり、文字数だったり)を要さないと作れなかったんだよー、みたいなことをご存じの方がおりましたら、その逸話などを紹介していただけないでしょうか?? たとえば、僕が実際に検索してみた「素数を生成」するプログラムなどは、多くの方が作成されており、長いものから、短いものまで、同じような結果がでるのに、さまざまでとても興味深いです。 ファミコン時代などは、容量がこれくらいの制限だから、これくらいのコード(文字数とか。。。)しか納められなかったんだよ…、みたいなことも知れたら幸いです。 どうぞ、よろしくお願いいたします。

  • ワード2000のVBAについて

    ワード2000を使っています。 予め、A列に日本語、B列に英語を入力したエクセルファイルを作っておき、ワードファイルから、そのエクセルファイルを開いて、A列の1行目の文字をワード文章で検索し、もし、あれば、B列の1行目の文字に置き換えるという操作を、開いたエクセルの全ての行に対して行うというVBAを作ろうと思っています。 そこで、エクセルファイルを Dialogs(wdDialogFileOpen)で開き、 Selection.Findを使って、 Text に、エクセルファイルのA(n)の文字を代入し、 Replacement.Text に、エクセルファイルのB(n)列を代入し、 nを初期値1から最大行数迄、一つづつ上げていく というコードを組もうと思っているのですが、 エクセルファイルのA1やB1を指定して代入するということはできるのでしょうか? もし、ご存知の方がいらっしゃれば教えてください。 また、ワードのVBAの参考になるHPも、できれば教えてください。お願いします。

  • 複数のEXCELファイルを一度にインポートするには?

    150個のEXCELのファイルがあります。 列はすべて同じデータで、行数だけがファイルによって違います。 だいたいどのファイルも30行ぐらいです。 これをすべてひとつのファイルにまとめたいのですが、どのような処理をすればいいのか、今ひとつ思いつきません。 EXCELのひとつひとつのファイルを開いて、新しいファイルにひたすらコピーしていくには時間がかかるし、Accessにひとつずつインポートしていくにも時間がかかってしまうので、複数のEXCELのファイルを一度にまとめる方法がありましたら、教えていただきたいのですが。。。 とにかく150×30行のデータを一つのファイルにつくりたいのですが、何かいい方法がありましたら、ヒントでもいただけたらお願いします。 Accessはクエリ程度、EXCELは関数を使える程度で、マクロは全く初心者です。 よろしくお願いいたします。

  • Excel VBAにてCSVファイルを読みたい

    ExcelにてCSVファイルを読んで処理をしたい。 ただし、CSVファイルをExcelでopenすると遅いので、 VBAにてファイルとして読み込みで処理をしたいのですが、 皆さんは、どのように行っていますか? ※CSVファイルは、テキスト区切り→"(ダブルコーテーション)です  テキスト区切り無しであれば、1行読んで、カンマをsplitすれば良いと思いますが。。。。

  • Excel VBAが徐々に遅くなる

    エクセルのVBAであるテキストファイルを読み込み、計算してCSVで吐き出すというプログラムを組んでいます。 質問はその計算スピードが徐々に遅くなってしまうということです。 計算し始めは大体1テキストファイルを読み込んでCSVに吐き出すのに1分くらいで済むのですが、3,4時間回してると1テキストファイル⇒CSVに2,30分かかってしまいます。 シートが増えていたりグラフを追加したりはしていません。 また、VBAの変数もできるだけ初期化するようにしてます。 読み込んでいくテキストファイルのサイズもそんなに変わらないです。 何か考えられる原因はないでしょうか? ご教授宜しくお願いします。

  • エクセルVBAが対応できるプログラムの大きさ

     エクセルVBAでプログラムの行数が2000行近くになるとプロシージャが大きすぎますとなり、実行できません。これには対処する方法はあるでしょうか。また、エクセル2013ではもっと大きなプロシージャにも対応しているのでしょうか。  よろしくお願いいたします。

専門家に質問してみよう