• ベストアンサー

VBA 大きなtxtテキストファイルを開く方法

VBA excelで大きなtxtファイルを開きたいのです!65500行(excelの行のMax)以上の場合sheetを分けてtxtのデータを全部開く場合にどうしたら良いのかどたなかアドバイスをお願いします。txtファイルを開くプログラムは作成した事があるのですが今回必要としている作業はほぼ65500行以上あるデータです。txtファイル名はその都度違います。データ量も一定ではありません。(行数は多いのですが、列は5列ほどのデータです)現在はマニュアルでエクセルにコピペしている状態です。ヒントを頂ければ幸いです。よろしくお願いします。

  • kiny
  • お礼率66% (4/6)

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

  • ベストアンサー
回答No.5

ANo.4です。 VBAの画面で、[ツール]->[参照設定]で、[Microsoft Scripting Runtime]にチェックを入れてください。 それと、 ws.Cells(row, col).Resize(1, UBound(c) + 1) = c '1列全データ を、以下に変更してください。(改行のみの行の場合エラーになるので) If UBound(c) > -1 Then ws.Cells(row, col).Resize(1, UBound(c) + 1) = c '1列全データ End If

kiny
質問者

お礼

fumufumu_2006さん どうもありがとうございました!!全て読み込む事が出来ました!コードの内容は初心者の私には解読出来ない部分が多々あるのですが、少しずつでも理解出来るよう勉強したいと思います。 お陰様でかなりの作業の簡略化が出来ます。何度も回答を頂き本当にありがとうございました!

その他の回答 (4)

回答No.4

1シートに読み込みます。 コマンドボタンを2つ用意してください CommandButton1は読み込み開始。 CommandButton2は読み込み中止。 読み込み経過をステータスバーに表示します。 Option Explicit Const fileName = "c:\ken_all.csv" 'ファイル名 Const dataSheetName = "Sheet2" 'データシート名 Const rowsNumber = 65536 '最後の行(最大65536だが、区切りのいい50000とかにもできる) Const colOfs = 5 '2列目になった場合の列オフセット 'Const fieldDelimiter = "," 'カンマ区切りの場合 Const fieldDelimiter = vbTab 'TAB区切りの場合 Private abortFlag As Boolean '中止フラグ Private Sub CommandButton1_Click() Dim d() As String '読み込み Dim fso As New FileSystemObject d() = Split(fso.OpenTextFile(fileName).ReadAll, vbCrLf) Set fso = Nothing MsgBox "読み込み完了" '転送開始 Dim ws As Worksheet Dim c() As String Dim row As Long Dim col As Long Dim i As Long Set ws = Sheets(dataSheetName) '転送シート ws.Cells.Clear row = 1 col = 1 abortFlag = False 'Application.ScreenUpdating = False '転送中表示しない(若干速くなるが、中止ボタンも押せない) For i = 0 To UBound(d) 'ステータス表示と中止チェック If (i Mod 100) = 0 Then DoEvents Application.StatusBar = i & "/" & UBound(d) If abortFlag = True Then MsgBox "中止しました" Exit For End If End If c = Split(d(i), fieldDelimiter) 'ws.Cells(row, col).Resize(1, 4) = c '1行4列に固定する場合 ws.Cells(row, col).Resize(1, UBound(c) + 1) = c '1列全データ row = row + 1 If row > rowsNumber Then row = 1 col = col + colOfs End If Next Application.StatusBar = i & "/" & UBound(d) Application.ScreenUpdating = True Application.StatusBar = False MsgBox "終了" End Sub '中止ボタン Private Sub CommandButton2_Click() abortFlag = True End Sub

kiny
質問者

お礼

こんにちは。 fumufumu_2006さんの教えてくださったコードを打ってやってみたのですが、Dim fso As New FileSystemObject が反転して ”コンパイルエラー:ユーザー定義型は定義されていません”とのエラーが出てしまいました。これはどう回避したら良いのでしょうか?初歩的な質問でしたら大変申し訳ないのですがご教示いただけると助かります。どうか宜しくお願いいたします。

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

こんな質問なぜ出るの? TEXファイルの、1レコードをLine Inputなどで読む都度、カウンター変数を1アップして、6万を超える行になったら、別シートや、同一シートの別列に移す先を買えればよいのでは。 なお1レコード読む都度、スペース(やCSVならカンマなど)等で文字列をスプリットし、項目数だけ、「列に項目分離後のデータ」を代入すればよい。 ーー >txtファイル名はその都度違います 毎回名が変わるというのか 複数のtxtファイルを集合させるのか。 前者なら操作者に実行後最初に入れさせる。 後者ならプログラムにでも名前を持つか、同一フォルダ内とかで選別するか、サブ番号で増えていくとか手を打てばよい。 対象の名前や所属にルールがあるかどうかをいつも菅変えること。 質問者は、処理進行・流れに関するロジックの訓練が不足しているようだ。レコードという考えも非常に大切。

kiny
質問者

お礼

回答をいただきどうもありがとうございました。VBAを勉強し始めてまだ浅いので質問が稚拙ですみません。 >TEXファイルの、1レコードをLine Inputなどで読む都度、カウンター変数を1アップして、6万を超える行になったら、別シートや、同一シートの別列に移す先を買えればよいのでは。 なお1レコード読む都度、スペース(やCSVならカンマなど)等で文字列をスプリットし、項目数だけ、「列に項目分離後のデータ」を代入すればよい。 ↑自分のやりたい事のイメージはimogasiさんが書いて下さっている感じなのですが、具体的にどういう記述をしていったら良いのかが分からず困っています。 TAB区切りで読み込んで4列のテキストデータが大体10万行~40万行ほどになります。 自分では、startrow:=65500、131000、・・・として個々に開いたら良いのか?と思ってやってみたのですがこれでは開く事が出来ませんでした。 別列にペーストが出来て全部のデータを一つのシート上に開く事が出来るとその後の処理に便利なのですが。 具体的にどう記述していけば良いのかご教示いただけると非常に助かります。どうかよろしくお願いいたします。

回答No.2

3つ方法があるのではないかと思います。 1.は配列に取り込んで、必要な部分をCELLに転写する。(文字列配列の添え字の制限はもっと大きいので) 2.テキストファイルのデータベースとして扱い、必要な部分をCELLに転写する。(ほとんど制限なくなります) 3.Excel2007を使う。(何も考えずにできます) ちなみに、一番手軽な1の方法で、全国郵便番号データ(約12万件)を読んでみました。(下記の全国一括) http://www.post.japanpost.jp/zipcode/dl/kogaki.html Sub test() Dim d() As String Dim fso As New FileSystemObject d() = Split(fso.OpenTextFile("c:\ken_all.csv").ReadAll, vbCrLf) Set fso = Nothing MsgBox UBound(d) & " 行" End Sub

kiny
質問者

お礼

回答どうもありがとうございました。今、回答を拝見して自宅のPCで(excel2007)開いてみたのですが、この大量な郵便番号データが本当にすんなり開けました、、、。知りませんでした。 来週会社のPC(XP)で教えて下さったコードでトライしてみます!ぶ厚い参考書を読んだり随分調べてみたのですがなかなか良い方法が見つからなかったので非常に助かります。(VBA初心者でまだ良く理解出来ていないので近い答えに辿りつかないのだと思いますが) 来週改めてお礼のメッセージ入れさせて頂きます。どうもありがとうございました。

kiny
質問者

補足

こんにちは。 fumufumu_2006さんの教えてくださったコードを打ってやってみたのですが、Dim fso As New FileSystemObject が反転して ”コンパイルエラー:ユーザー定義型は定義されていません”とのエラーが出てしまいました。これはどう回避したら良いのでしょうか?初歩的な質問でしたら大変申し訳ないのですがご教示いただけると助かります。どうか宜しくお願いいたします。

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.1

>txtファイルを開くプログラムは作成した事があるのですが これができているのなら、 転記する行番号が65537になったらシートを一つ増やして、 行番号を65536で割った余りの行に転記する、とすればいい のではないでしょうか? Dim i As Long i = 65537 MsgBox "Sheet:" & i \ 65536 + 1 & vbCrLf & "行:" & i Mod 65536

関連するQ&A

  • エクセルの各シートに複数のtxtファイルを取り込む

    Excel2013を用いたデータ整理をしているのですが,複数のファイルを扱う上でマクロを用いた効率化をしたいと思い,質問させていただきました. いま,Folder1 というフォルダに,text1 から text40 までの 40個のtxtファイルがあります. これらのファイルを,エクセル上であらかじめ作成してある Sheet1 から Sheet40 にそれぞれ貼り付けたいと考えています. txtファイルは,4列で構成されており,タブでそれぞれ区切られています. 行数は20,481行です. txtの中には,0 の値が入った箇所もあるため,その情報が消えないで貼り付けられると望ましいです. また,タブのところでしっかり区切られ,違うセルに貼り付けられると,ありがたいです. 質問は以上です. お手数ですが,よろしくお願いします.

  • vbaでテキストファイル(*.txt)を取込みたい

    vba初心者です。 Application.Dialogs(xlDialogOpen).Showで選択したテキストファイル(***.txt)をテキストファイルウィザードで、タブ、カンマ、スペース区切りで、エクセルファイルに取り込むマクロを組みたいのですが? 何度やってもうまくいきません。 ご教示願えないでしょうか! excel2002を使用してます。 よろしくお願いします。

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

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

  • ExcelでtxtファイルをVBAで読み込む方法

    スペース区切りのテキストファイル(拡張子はtxt)が有ります。 データは、数字ですが上桁には0が入っています。 00001 0003 010222 302033 00025 等のデータです。 このファイルを、ウイザードを使わずにVBAにて直接文字列(テキスト)として読み込むコマンドを失念してしまいました。 教えて下さい。宜しくお願い致します。

  • エクセル2003のVBAを教えてパート3

    kドライブのVBA練習フォルダにある、全てのテキストデータファイル(拡張子.txt)を、エクセルに繋げて取り込こむ(指定のエクセルの1シートに全テキストデータを繋げて取り込む)方法がわかりません。どなたか教えてください。データは、A列にのみに入ります。 テキストデータファイルの数は、1~4ファイルと色々な場合があります。また、行数も1ファイル10行~ 400行と色々です。 次のように、決められた1つのデータなら、プログラムに「元データ.txt」と入力する方法で出来るのでっすが。 Sub テキストファイルの読み込み() '1ファイルのとき  Dim buf As String  Dim cnt As Long  Open "k:\VBA練習\元データ.txt" For Input As #1   Do Until EOF(1)    Line Input #1, buf    cnt = cnt + 1    Cells(cnt, 1) = buf   Loop End Sub

  • エクセルからtxtファイルへの変換

    宜しくお願いします。 txtファイルがあります。 中には、14桁の数字があります。 データが膨大なので編集しやすいようにエクセルで読み込みます。 この数字以外の一部を変更します。(1行削除または1列全部同じデータに修正等) 最後にTAB区切りのtxtファイルで保存すると、この14桁の数字が丸められてしまいます。(例56000500000058⇒56000000000000) 書式の表示形式を文字列にするのはなぜか設定してからセルをダブルクリックしないと元の数字列にならないので5000行もあるデータの編集等やってられません。 何かよい方法ありませんか。 要は、5000行もあるtxtファイルの編集を簡単に行ないたいのです。 たとえば、ある列の5000行をいっせいに0から1に変更したいとか。 簡単そうでなかなか思い浮かびません。

  • エクセルの関数、VBAの使い分け

    エクセルでデータを管理しているのですが現在5つのシートで各シートが10列7000行程度データが入っていてファイルサイズが10MBを超えています。 データの行数は今後も増えていく予定で、最大行(約65000行)まで使いたいと思っているのですが、そうなるとファイルサイズが100Mぐらいになってしまいそうなのですが使用上問題はないでしょうか? 関数を多用しているのですがそれをVBAに置き換えるとファイルサイズを小さく出来るでしょうか?もし、VBAに変えた場合に使用上、関数に比べ不便が出るようなことはないでしょうか?

  • 複数のcsvファイルを1つのEXCELファイルにマージするVBAを教えてください

    csvファイル数は700~1000個程度でひとつのフォルダに格納されています。 このファイルをEXCEL形式で開くと、1行目にフィールド名(A~Z列で固定)、2行目以降にデータが入っています。行数はファイルにより1~100行程度で変動します。 このファイルを1つのエクセルファイルの同一シートに結合(マージ)するVBAがほしいです。 ここで、(できればですが)EXCELにマージするにあたり、1行目のみフィールドの値、2行目以降にそれぞれのcsvの2行目以降データの値を入れていくようにしたいです。つまり、フィールド名の行が何行も出てくるのを避けたいです。 申し訳ございませんが、ご指導いただけたら幸いです。よろしくお願いします。

  • VBA 開いているシート上にテキストファイルを開く

     今晩は、質問させていただきます。どうぞよろしくお願いいたします。  環境:Win7+Excel2007 でございます。  今開いております「Book1」上に「シート1」「シート2」があるといたしまして、 「シート2」上に、「C:\ファイル1.txt」(←1000行程ございます)を 「1行ずつ読み込むのではなく、Workbooks.OpenTextのように一度に開く」事は可能でございますでしょうか??  行数が多いのでReadLineをいたしますよりは、何か「開いているエクセルファイル上にテキストファイルをドラッグして開いた時のような方法」はないかな、と検索いたしておりまして、 OpenTextを見つけて試しましたが、新規エクセルファイル上で開いてしまいます。。。  もし何かよさそうな方法がございましたら、是非ともアドバイスいただきたく どうぞよろしくお願いいたします。

  • Excel VBAで列ごとのデータをテキストファイルへ書くには?

    エクセルのシート(たとえばSheet1)が以下のようになっているとします。 A B C D E F 1 商品A 11111111 あいうえお 3 1000 2 商品B 22222222 かくくけこ 1 2500 3 商品C 33333333 さしすせそ 2 3500 ・ ・ これを決まった列ごとにテキストファイル(固定ファイル名)に書き出すということは、エクセルのVBAで可能でしょうか? テキストファイルの内容は以下のようにしたいのです。 E列を数量として、その分だけのテキスト行を書き出したいのですが… <<bbb.txt>> 商品A 商品A 商品A 商品B 商品C 商品C ・ ・ <<ccc.txt>> 11111111 11111111 11111111 22222222 33333333 33333333 ・ ・ <<fff.txt>> 1000 1000 1000 2500 3500 3500 ・ ・ また、このようなことが参考になるHPがあればお教え願いたいのですが。 以上よろしくお願いします。

専門家に質問してみよう