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

このQ&Aのポイント
  • Excel2013を用いたデータ整理でわからない部分があるため,エクセルの各シートに複数のテキストファイルを取り込む方法を教えてください。
  • 同じフォルダに入った複数のテキストファイルをエクセルの複数のシートにそれぞれ取り込みたいです。具体的には、テキストファイル名に基づいてファイルをシートに取り込む方法を教えてください。
  • エクセルの各シートに複数のテキストファイルを取り込む方法について教えてください。テキストファイルは四列で構成されており、タブで区切られています。行数は約20,000です。
回答を見る
  • ベストアンサー

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

はじめまして. Excel2013を用いたデータ整理でわからない部分があるため, 質問させていただきました. 同じフォルダに入った,複数(40個程度)のテキストファイルを, エクセルの複数のシートにそれぞれ取り込みたいと考えています. 具体的には,同じフォルダに入っている, A001.txt, A002.txt, A003.txt, .... というテキストファイル群を, Data_A.xlsxのSheet1にA001.txt       Sheet2にA002.txt       Sheet3にA003.txt といったように取り込みたいです. テキストファイルは, X_座標 Y_座標 X_速度 Y_速度 の四列で構成されており,タブでそれぞれ区切られています. 行数は20,000程度です. 以前,同様の質問をされた方の回答にありました以下のマクロを実行してみたのですが, ・タブで区切られず,一つのセルに四列分の文字が入力される. ・0の情報が消えてしまう. という二つの問題が発生しました. Sub ReadTextFiles()   Const DirName = "C:\TEMP"   '上記で指定されたフォルダに存在するファイルで、   '拡張子がtxtのものをすべて1シートとして読み込む   Dim fs, dir, fc, f1, stream As Object   Set fs = CreateObject("Scripting.FileSystemObject")   Set dir = fs.GetFolder(DirName)   Set fc = dir.Files   For Each f1 In fc     If LCase(fs.GetExtensionName(f1.Name)) = "txt" Then       Worksheets.Add after:=Worksheets(Worksheets.Count)       Sheets(Worksheets.Count).Name = f1.Name       Set stream = f1.OpenAsTextStream       Do While stream.AtEndOfStream <> True         Cells(stream.Line, 1) = stream.ReadLine       Loop       stream.Close     End If   Next End Sub これらを解決した上で,ファイルを取り込む方法を教えていただきたいです. お手数ですが,よろしくお願い致します.

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

  • ベストアンサー
  • mt2015
  • ベストアンサー率49% (258/524)
回答No.3

ANo.2です。 テキストは3つではなくもっとたくさんあるのですね。 失礼しました。 新しいシートを追加して、シート名をテキストファイル名に変更したうえでデータを貼り付けるようにしました。 #テキストファイル名と同名のシートが存在するとエラーになります。 Sub Sample()   Dim sPath As String   Dim sFile As String   Dim sText As String   sPath = "C:\TEMP\"   sFile = Dir(sPath & "*.txt")   Do While sFile <> ""     ActiveWorkbook.Worksheets.Add After:=Sheets(Sheets.Count)     ActiveSheet.Name = Replace(sFile, ".txt", "")     sText = "TEXT;" & sPath & sFile     With ActiveSheet.QueryTables.Add(Connection:=sText, Destination:=Range("$A$1"))       .TextFilePlatform = 932       .TextFileTabDelimiter = True       .Refresh       .Delete     End With     sFile = Dir()   Loop End Sub

aneu2165
質問者

補足

ご回答ありがとうございます. 早速試してみたのですが,マクロを実行しても反応がありませんでした. 恐らく,こちらでパスの名前等を任意に変更するのができていないのが問題と思われます. くだらない質問ですが,このプログラムでこちらが任意に変更すべき部分はどこになるでしょうか? ご回答よろしくお願い致します.

その他の回答 (3)

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.4

> くだらない質問ですが,このプログラムでこちらが任意に変更すべき部分はどこになるでしょうか? sPath = "C:\TEMP\" ←この部分をtxtファイルが入っているパスに書き換えてください(最後の\も忘れずに) #サイト上では逆スラッシュになっていますが、PC上では半角の¥です(日本語OSの場合)。

aneu2165
質問者

お礼

ご指摘の箇所を修正したところ,正常にマクロがはたらき欲しかった結果が得られました. 丁寧なご回答をして頂き,誠にありがとうございました.

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.2

こんな感じでどうでしょう。 QueryTables.Add を使いました。 Sub Test()   Dim ws As Worksheet   Dim qt As QueryTable   Dim sText As String      For i = 1 To 3     sText = "TEXT;C:\TEMP\A" & Format(i, "000") & ".txt"     Set ws = Worksheets("Sheet" & i)     ws.Cells.Clear     Set qt = ws.QueryTables.Add(Connection:=sText, Destination:=ws.Range("A1"))     With qt       .TextFilePlatform = 932       .TextFileTabDelimiter = True       .Refresh       .Delete     End With   Next i End Sub

  • emsuja
  • ベストアンサー率50% (1034/2055)
回答No.1

少々泥臭い書き方ですが、こんな書き方では? Option Explicit Dim sn As String, fn As String Sub test() Dim pn As String pn = ThisWorkbook.Path fn = pn & "\aaa001.txt" sn = "sheet1" Call test2 fn = pn & "\aaa002.txt" sn = "sheet2" Call test2 pn = ThisWorkbook.Path fn = pn & "\aaa003.txt" sn = "sheet3" Call test2 fn = pn & "\aaa004.txt" sn = "sheet4" Call test2 End Sub Sub test2() Dim f As Integer, w As String, d() As String, r As Long, c As Integer With Worksheets(sn) f = FreeFile Open fn For Input As f Do Until EOF(f) Line Input #(f), w d() = Split(w, vbTab) r = r + 1 For c = 0 To UBound(d) .Cells(r, c + 1).Value = d(c) Next Loop Close f End With End Sub

aneu2165
質問者

お礼

迅速なご回答,誠にありがとうございました.

関連するQ&A

  • 複数ファイルをエクセルに取り込む方法

    複数のテキストファイルを各シート毎にエクセルマクロを用いて貼りつけたいです。 【テキストの内容】 AAA BBB CCC DDD・・・ EEE FFF GGG HHH・・・ III JJJ KKK LLL・・・ ・ ・ ・ 上記のようなようなデータが書かれた複数のテキストファイルを各シート毎に張り付けるマクロを探していたところ 下記のようなものを見つけました。 しかし、 マクロを動かした所、一つのセルに一行分が入ってしまいます。 例)セルA1に AAA BBB CCC DDDが貼り付けられてしまう セルA2に EEE FFF GGG HHHが貼り付けられてしまう 可能であればスペース区切りでセルA、セルB、セルCに分けたいです。 例)セルA1に AAAが貼り付けられる セルB1に BBBが貼り付けられる セルC2に CCCが貼り付けられる スペース区切りで張り付けらる方法をご教示ください。 =========================== Sub ReadTextFiles() Const DirName = "C:\TEMP" '上記で指定されたフォルダに存在するファイルで、 '拡張子がtxtのものをすべて1シートとして読み込む Dim fs, dir, fc, f1, stream As Object Set fs = CreateObject("Scripting.FileSystemObject") Set dir = fs.GetFolder(DirName) Set fc = dir.Files For Each f1 In fc If LCase(fs.GetExtensionName(f1.Name)) = "txt" Then Worksheets.Add after:=Worksheets(Worksheets.Count) Sheets(Worksheets.Count).Name = f1.Name Set stream = f1.OpenAsTextStream Do While stream.AtEndOfStream <> True Cells(stream.Line, 1) = stream.ReadLine Loop stream.Close End If Next End Sub ===========================

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

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

  • 一つのテキストファイルと複数のファイルの結合

    よろしくお願いします.ディレクトリ内の一つのテキストファイル(joint.txt)と複数のファイルの結合を行ごとに隣へ結合するプログラムを作成しています.ここで以下のプログラムを作成したのですが,うまくいかないため,誤っている部分をご指摘願えないでしょうか. my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); open(FILE, $dir) or die "$dir: $!"; open(FILE2,"joint.txt"); my @file = <FILE>; my @file2 = <FILE2>; close(FILE); close(FILE2); foreach my $line (@file) { foreach my $line2 (@file2) { chomp $line2; $line = "$line2.",".$line"; } } open(NEWFILE, "> $dir") or die "$dir: $!"; print NEWFILE @file; print NEWFILE @file2; close(NEWFILE); } closedir(DIR);

    • ベストアンサー
    • Perl
  • 複数のファイルのsheet1だけをまとめるには

    sub UsedRangeをOffsetする() Dim rng先 As Range Dim PathMacrobook As String Dim Name元book As String Dim 元Book As Workbook Dim 元Sheet As Worksheet Set rng先 = Workbooks("BOOKALL.xls").Worksheets(1).Range("A2") PathMacrobook = ThisWorkbook.Path & "\" Name元book = Dir(PathMacrobook & "*.xls") Do While Not Name元book = "" If Name元book = ThisWorkbook.Name Then ElseIf Name元book = "BOOKALL.xls" Then Else Set 元Book = Workbooks.Open(PathMacrobook & Name元book) For Each 元Sheet In 元Book.Worksheets With 元Sheet.UsedRange .Offset(1).Copy rng先 Set rng先 = rng先.Offset(.Rows.Count - 1, 0) End With Next 元Book.Close False End If Name元book = Dir() Loop End Sub このコードではフォルダにあるブックのすべてのシートをBOOKALLのシート1に 上書きコピーしてしまう事がわかりました。 やりたい事 オープンするブックのsheet1だけを、.end(xlup)を使って一覧にしたいです。。 どの様にしたらよいでしょうか?

  • プログラムの高速化

    いつもお世話になっております.以下のプログラムをできるだけ高速化したいと思います. use warnings; use strict; my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); open(FILE, $dir) or die "$dir: $!"; while (my $line = <FILE>) { my ($a,$b,$c,$d,$e,$f) = split( /,/ , $line ); my $name = $a.",".$b; open(NEWFILE, ">> ./out/$name.txt") or die "$dir: $!"; print NEWFILE $line; close(NEWFILE); } } close(FILE); closedir(DIR); やっていることは,ディレクトリ内のテキストファイルを読み込んでいって,splitでカンマ区切りにした,$a,$bをファイル名として下のディレクトリのoutに保存していくというものです. ファイル数が数千あり,各ファイルも数千行となるため,このソースを高速化する方法はありますでしょうか.ご回答よろしくお願いします.

    • ベストアンサー
    • Perl
  • 複数のtxtファイルをエクセルに貼りつける方法 2

    前回質問した者です。 http://okwave.jp/qa/q7062908.html ある特定のフォルダ内に複数のフォルダがあり、その中の各フォルダには、txtファイルが複数あります。 VBAを使ってエクセルのA列にフォルダ名、B列にtxtファイル名、C列にはtxtファイルの内容を入れたいです。(今はコピペを手動で行っています) フォルダA ↓ フォルダ1、フォルダ2、フォルダ3、・・・・ ↓ 各フォルダにはtxtファイル(改行あり) VBAは解らないのですが、自分なりに検索してみて、以下のコードを見つけました。 しかし、以下の場合はA列にtxtファイルの内容しか入らず、また、特定のフォルダのみしか反映されません。 そこで、フォルダAのパスだけを指定して、A列にフォルダ名、B列にtxtファイル名、C列にはtxtファイルの内容を入れるにはどうすればいいのでしょうか? Sub Macro() Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim FolderPath As String 'ここのアドレスをファイルが格納されているフォルダのパスに変えてください FolderPath = "H:\Documents and Settings\asano\デスクトップ\TEST" Dim myFile As Object Dim i As Long i = 1 For Each myFile In fso.GetFolder(FolderPath).Files Cells(i, 1).Value = fso.OpenTextFile(myFile.Path).ReadAll() i = i + 1 Next End Sub

  • ディレクトリ内のテキストファイルに対する同一処理

    よろしくお願いします。現在Linuxの環境でテキスト処理をしております。 ディレクトリ内にファイル名の異なった以下のような大量ファイルがあります。 a.txt 0,1,2,3,4,5,6,7 1,2,3,4,5,6,7,8 b.txt 2,3,4,5,6,7,8,9 3,4,5,6,7,8,9,10 これらのファイルをカンマでsplitし、左から2番目の数にだけ1を引き,下のディレクトリであるoutに出力させます。出力は以下のようになります。 ./out/a.txt 0,0,2,3,4,5,6,7 1,2,3,4,5,6,7,8 ./out/b.txt 2,2,4,5,6,7,8,9 3,4,5,6,7,8,9,10 そこで以下のようなPerlのプログラムを作成しました。 use strict; use warnings; my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); print $dir, "\n"; open(FILE, $dir) or die "$dir: $!"; my @file = <FILE>; foreach $line (@file) { my ($a,$b,$c,$d,$e,$f,$g,$h) = split(/,/, $line);      my $b = $b - 1; close(FILE); } open(NEWFILE, "> ./out/$dir") or die "$dir: $!"; print NEWFILE @file; close(NEWFILE); } closedir(DIR); ですが、出力は完了するのですが、元のファイルから計算がされていません。どこがどう間違えているのかご指摘よろしくお願い申し上げます。

    • ベストアンサー
    • Perl
  • 下のディレクトリ(3つ)に含まれる同じファイル名のテキストを結合し,カレントディレクトリに出力する

    いつもお世話になっております.環境はWindows XPのActiveperlです. やりたいことは「下のディレクトリ(3つ)に含まれる同じファイル名のテキストを結合し,カレントディレクトリに出力する」ことです.具体的にはいかのようにしたいと思っています. 現在のディレクトリ/a/1.txt a b c 現在のディレクトリ/b/1.txt d e f 現在のディレクトリ/c/1.txt g h i 現在のディレクトリ/1.txt a b c d e f g h i ここで私は以下のプログラムを作成しました. use strict; use warnings; my $dirname1 = './a/'; my $dirname2 = './b/'; my $dirname3 = './c/'; opendir(DIR1, $dirname1) or die "$dirname1: $!"; while (my $dir1 = readdir(DIR1)) { next unless (-f $dir1); next unless ($dir1 =~ /\.txt$/); opendir(DIR2, $dirname2) or die "$dirname2: $!"; while (my $dir2 = readdir(DIR2)) { next unless (-f $dir2); next unless ($dir2 =~ /\.txt$/); opendir(DIR3, $dirname3) or die "$dirname3: $!"; while (my $dir3 = readdir(DIR3)) { next unless (-f $dir3); next unless ($dir3 =~ /\.txt$/); if (($dir1 == $dir2) && ($dir2 == $dir3)){ open(FILE1, $dir1) or die "$dir1: $!"; my $line1 = <FILE1>; close(FILE1); open(FILE2, $dir2) or die "$dir2: $!"; my $line2 = <FILE2>; close(FILE2); open(FILE3, $dir3) or die "$dir3: $!"; my $line3 = <FILE3>; close(FILE3); my $joint_line = $line1.$line2.$line3; open(NEWFILE, "> $dir1") or die "$dir1: $!"; print NEWFILE $joint_line; close(NEWFILE); } } } } closedir(DIR1); closedir(DIR2); closedir(DIR3); ですが,以下のようなエラーが発生しています. closedir() attempted on invalid dirhandle DIR2 at joint.pl line 51. closedir() attempted on invalid dirhandle DIR3 at joint.pl line 52. ディレクトリハンドルが使われているけれど閉じているか実際にはディレクトリハンドルでは無い時にこれらの警告が発行されるとこの警告がでるようですが,どのようにしたら解決できるのでしょうか.よろしくお願いします.

  • 複数テキストファイルをエクセルで開く

    度々の質問申し訳ございません。 複数のテキストファイルが入ったフォルダ内のすべてのテキストデータをエクセルの1シートで開きたいです。 他の方の同じような質問の御回答に以下のようなマクロが有りました。 Sub macro1() Dim myPath As String Dim myFile As String Dim n, c, s '初期化 myPath = ThisWorkbook.Path & "\" myFile = Dir(myPath & "*.txt") '受入準備 On Error Resume Next Worksheets.Add before:=Worksheets(1) ActiveSheet.Name = Format(Date, "yyyymmdd") On Error GoTo 0 'ファイルの巡回 Do Until myFile = "" n = n + 1 Cells(n, "A") = myFile 'データの読み出し Open myPath & myFile For Input As #1 c = 1 Do Until EOF(1) Line Input #1, s c = c + 1 Cells(n, c) = s Loop Close #1 myFile = Dir() Loop End Sub これを利用させていただいて、テキストファイルを開いたのですが、こちらのマクロですとテキストデータの1列目しか開く事が出来ません。(図参照) 1列目2列目共に開くには何処を変更すれば良いですか? マクロはまったく理解できないので、何卒宜しくお願い致します。 また、できればエクセルの横方向に開くのではなく、縦方向に開けるようにして頂けると非常にありがたいです。 何卒宜しくお願い致します。

  • Excelで複数のテキストファイルを1枚のシートに

    Excelで複数のテキストファイルを1枚のシートに追加したいのですが可能でしょうか? VBAや別ソフトを複数使ってもかまいません。 2列のテキストファイルが複数ありA列目は共通でB列目がそれぞれ異なります。 data01.txt、data02.txt…と50ぐらいのファイルがあり、それぞれ A  B 10 1.24 20 2.56 30 2.46 :  : となっています。これをひとまとめにして A      B     C ・・・ data01  data02   data03・・・ data50 10     1.24    1.35 ・・・ 2.24 20     2.56    2.22 ・・・ 1.34 30     2.46    3.23 ・・・ 5.45 :       :      : といった表にしたいのです。 お願いします。

専門家に質問してみよう