Excelシートに複数のtxtファイルを取り込む方法

このQ&Aのポイント
  • Excel2013を使用してデータ整理を行う際に、複数のtxtファイルを効率的に取り込む方法を教えてください。
  • 具体的には、Folder1というフォルダ内に40個のtxtファイルがあり、これらをSheet1からSheet40に貼り付けたいと考えています。
  • txtファイルは4列構成であり、20,481行あります。また、0の値が含まれている場合もあります。どのように貼り付けると効果的でしょうか?
回答を見る
  • ベストアンサー

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

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

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

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

早い話、作ってくれという事ですよね(笑)。 他さまよりかなり単純ですが、充分動きます。 [保存場所]には、「folder1」がある場所を 1文字も漏らさずに指定してくださいね。 Sub Nantoka() Dim TagSH As Worksheet, SHNo As String   Application.ScreenUpdating = False   Application.DisplayAlerts = False   For Each TagSH In Worksheets     SHNo = Mid(TagSH.Name, 6, 2)     Workbooks.OpenText Filename:="C:\[保存場所]\Folder1\text" & SHNo & ".txt", _         DataType:=xlDelimited, _         Tab:=True, _         FieldInfo:=Array(Array(1, 1), Array(2, 1), _              Array(3, 1), Array(4, 1)), _         TrailingMinusNumbers:=True     Cells.Copy TagSH.Cells     ActiveWorkbook.Close savechanges:=False   Next   Application.DisplayAlerts = True   Application.ScreenUpdating = True End sub とりあえず・・2万行を行単位で書き写すより、 テキストファイルを開いて全部コピーして、 エクセルに貼り付けて、テキストファイルを閉じる、 を繰り返した方が早いよ、多分。 そのかわり、他の作業とか一切考えてないけれど。 質問文には「他の作業」について触れてないしOKでしょ。 という発想ですね。 パソコンの能力に依るかもしれませんが、 多分、数秒~数分で終わると思いますよ。 テキストファイル40個なら多分・・30秒くらいかなぁと思うのですが。 10分待っても終わらなければ残念ながらフリーズしています。

aneu2165
質問者

お礼

ご回答ありがとうございます. お陰様で行いたかった作業が実現しました. 誠にありがとうございました.

その他の回答 (5)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.6

Sub Test() Dim myPath As String, i As Long myPath = "C:\Folder1" Application.ScreenUpdating = False For i = 1 To 40 With Worksheets(i).QueryTables.Add(Connection:= _ "TEXT;" & myPath & "\text" & i & ".txt", Destination:=Worksheets(i).Range("A1")) .TextFilePlatform = 932 .TextFileParseType = xlDelimited .TextFileTabDelimiter = True .Refresh .Delete End With Next Application.ScreenUpdating = True MsgBox "取込み完了!!" End Sub

aneu2165
質問者

お礼

ご回答ありがとうございます. このマクロで行いたかった作業ができました. ありがとうございました. 回答順から,申し訳ありませんがNo.5の方をベストアンサーとさせていただきました.

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

実際のファイルでテストできないので、下記コードに不安はある。 WEBの記事の探し方や利用する考え方なりを参考にしてください。 よくあるパターンの質問だが、質問者には本質問は、荷が重いと思われる。 本当にまる写しのコードでないとダメなのかもしれないと思いつつ書いたが。 (1)準備 テキストファイルのある対象のフォルダのフルパス名を調べてメモする。 その中に対象外のテキストファイルがないことを確認する。 混じっていると、排除するコードは質問者には作れないだろうから、手動で 別フォルダに移す。 ーー 書き出すExcelのブックのシートの数だけシートを作る方法。 そのブックを開いてVBAで下記を実行。下記の3のところを必要数にする。 以下コードは、すべて標準モジュールにコードを作る。 Sub test01() Sheets.Add Count:=3 End Sub (2)そのフォルダのテキストファイル名を、シート院エクス番号iの1シートのA1セルに、 1テキストファイルの名前書き出す。ファイル名しか書き出ししないのは、準備テスト段階です。 Sub test03() Dim strPath As String strPath = ThisWorkbook.Path MsgBox strPath 'FileSystemオブジェクト変数の準備 Dim objFSO As Object Set objFSO = CreateObject("Scripting.FileSystemObject") 'FileSystemObject Dim objFile As Object 'ファイルを格納するオブジェクト変数 i = 1 For Each objFile In objFSO.getfolder(strPath).Files ex = objFSO.GetExtensionName(objFile) MsgBox ex If ex = "txt" Then 'MsgBox i 'MsgBox ex 'MsgBox objFile.Name '--- With ThisWorkbook With .Worksheets(i) .Cells(1, "A") = objFile.Name End With End With i = i + 1 End If If i > 5 Then Exit Sub 'テストのためなので、5テキストに限って実行し、打ち切り。 Next objFile End Sub (3)テキストファイルの各レコードをエクセルシートに読み込み。 http://qiita.com/ktyubeshi/items/199fd3efcf48e67645f1 より拝借。 下記は、一部変えてます。 Sub ReadTabDelimitedTextFile() 'タブ区切りファイルを全て文字列として読み込む 1つのテキストファイル名をメモする。そのファイルでテストする。ーーー>文字列Xとする Dim FileName As String Dim i As Long Dim Cnt As Long Dim Buf As Variant Dim FileNo As Integer Dim SplitString As Variant 'ファイルダイアログを表示 'FileName = Application.GetOpenFilename("テキストファイル,*.txt")   FileName = Application.GetOpenFilename("テキストファイル,X.txt") <--ここを現実のものに変える If FileName <> "False" Then '全セル選択して書式を文字列にセットする Cells.Select Selection.NumberFormatLocal = "@" Cells(1, 1).Select '空いているファイル番号を取得 FileNo = FreeFile() Buf = Space(FileLen(FileName)) 'ファイルを開いてbufに1行読み込み ' → タブで配列に分割 ' → セルに書き出し Open FileName For Input As #FileNo Do Until EOF(FileNo) Line Input #FileNo, Buf Cnt = Cnt + 1 SplitString = Split(Buf, vbTab) For i = 0 To UBound(SplitString) Cells(Cnt, i + 1) = SplitString(i) Next i Loop Close #FileNo 'そのままでは数式等が使えなくなるため、書式を標準に戻す Cells.Select Selection.NumberFormatLocal = "G/標準" Cells(1, 1).Select Else 'ファイルダイアログをキャンセルされた場合何もしない End If End Sub (4)プログラムが止まらずに、うまく行って、シートを見て、内容的にOKなら、上記のコードを(3)の .Cells(1, "A") = objFile.Name の部分に上書き張り付ける。 そして(3)の fileName = Application.GetOpenFilename("テキストファイル,X.txt") <--ここを現実のものに変える のXの部分を、(2)のobjFile.Nameに変える。 FileName = Application.GetOpenFilename("テキストファイル,objFile.name & " .txt") のように。 また、(2)でif i > 5 Then Exit Sub の部分は、テストのためなので、この行は、削除する。 (5)実行 シートについて内容を確認する。

aneu2165
質問者

お礼

ご回答ありがとうございます. プログラムに細かい説明も添えていただき,素人の身としては助かりました. ありがとうございました.

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

2 です、補足拝見しました Sub Main の最初に Application.ScreenUpdating = False 最後に Application.ScreenUpdating = True を入れると、動作中に画面の表示動作を停止させますので多少は早くなるのでは?

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

#1 です 前回の私のアドバイスが勘違いしてたかもしれません 相変わらず泥臭い書き方ですが新たに書き直してみました Option Explicit Dim fn As String, sn As String Sub Main() Dim pn As String, n As Integer, rtn As Integer pn = "f:\test\" text ファイルのフォルダ名 For n = 1 To 40 fn = pn & "text" & n & ".txt" If ExistFile(fn) Then ' ファイルの存在チェック sn = "Sheet" & n If ExistSheet(sn) Then ' Worksheet の存在チェック Call test2 Else rtn = MsgBox("WorkSheet " & sn & " が見当たりませんキャンセルしますか?", vbYesNo) If rtn = vbYes Then Exit For End If Else rtn = MsgBox("入力ファイル " & fn & " が見当たりませんキャンセルしますか?", vbYesNo) If rtn = vbYes Then Exit For End If Next n MsgBox "処理終了" 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 '----------------------------------------------------- ' ファイルのの存在チェック Function ExistFile(fn As String) As Integer Dim f As Integer On Error Resume Next f = FreeFile() Open fn For Input As f Close f If Err Then ExistFile = False Else ExistFile = True End If On Error GoTo 0 End Function ' ---------------------------------------------------- ' ワークシートの存在チェック Function ExistSheet(sn As String) As Integer Dim x As Object ExistSheet = False For Each x In Worksheets If UCase$(x.Name) = UCase$(sn) Then ExistSheet = True Exit For End If Next End Function

aneu2165
質問者

補足

ご回答ありがとうございます. 早速試したところ,実行は正常にされました. ですが,各ファイルの容量が大きいせいか,1シート辺り3分程度と処理に相当な時間がかかってしまっています. クォリティが落ちてもかまいませんので,処理速度を速めるのにどこか改良できる箇所があれば,ご教示願います. 無理を言って申し訳ありませんが,よろしくお願い致します.

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

これで解決できなかったのですか? 解決できなかったのならその問題点を書いた方がいいアドバイスが付くと思いますが・・・ https://okwave.jp/qa/q9368534.html そのあたりを明確にしないと同じようなアドバイスしかつかないと思います

aneu2165
質問者

補足

ご回答ありがとうございます. 以前の問題はお陰様で解決いたしました. 今回,行っている作業プロセスの微妙な変更がありまして,そうすると前回教えていただいたマクロは使用できなかったため,再び質問をさせていただきました. 下手な書き方をしてしまい申し訳ないのですが,テキストの読み込みの際に,今回は新しいシートを作りそこにテキストファイルを貼り付けていくのではなく,あらかじめ作ってある複数のシートにテキストファイルを貼り付けていく,という違いがあります. これを可能とするマクロをぜひ教えていただきたいです. よろしくお願い致します. このあたりを明確にせずに質問してしまい,申し訳ありませんでした.

関連するQ&A

  • エクセルの各シートに複数の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 これらを解決した上で,ファイルを取り込む方法を教えていただきたいです. お手数ですが,よろしくお願い致します.

  • 複数のエクセルファイルを1つのエクセルファイルのシートにコピーをマクロ

    複数のエクセルファイルを1つのエクセルファイルのシートにコピーをマクロで行いたい。 マイドキュメントのデーターというフォルダ内に エクセルファイルA(シート名みかん) エクセルファイルB(シート名りんご) エクセルファイルC(シート名バナナ) エクセルファイルD(シート名ぶどう) エクセルファイルE(シート名いちご) があります。 雛形は同じです。すべてA列~F列までデータが入っています。 行数はファイルによって違います。 また毎日自動で上書き更新され、毎日行数が変わります。 エクセルファイルZがあります。シートが7個あります。 ・変換 ・集計 ・みかん ・りんご ・バナナ ・ぶどう ・いちご エクセルファイルZを開きます。(各シートには昨日のデータが貼り付けてあります。) マイドキュメントのデーターフォルダも開いておきます。 エクセルファイルZにおいて「マクロの記録」を起動。 エクセルファイルZの 【みかん】~【いちご】までの5シートを全データDELETEします。 開いてあるフォルダ「データー」の中からエクセルファイルAを開きます。 (タスクバーにいます) ファイルAのシート【みかん】の全データ選択して エクセルファイルZの【みかん】というシートのA1セルにカーソルを あわせて貼り付けします。 開いてあるフォルダ「データー」の中からエクセルファイルBを開きます。 (タスクバーにいます) ファイルBのシート【りんご】の全データ選択して エクセルファイルZの【りんご】というシートのA1セルにカーソルを あわせて貼り付けします。 これと同じ操作を【バナナ】【ぶどう】【いちご】も行います。 エクセルファイルZにおいて「マクロの記録」を終了させます。 マクロができあがりました。 ファイルZを上書き保存して終了。再立ち上げで記録したマクロを実行。 エラーにはなりませんが、ファイルZの5種類各シートに ファイルA~Eのデータが貼りつきません。 何か無理な事をしているのでしょうか? もしかしてシート名が同じだと駄目?とためしにファイルZのシート名【みかん】~【いちご】を 【みかんZ】~【いちごZ】に変更してマクロを再記録しても 駄目でした。 よろしくお願いします。

  • フォルダ内全ファイルをシート毎に貼付方法について

    VBA仙人様ご教授お願い致します。 1フォルダに数十のログファイル(.txt)が格納されています。 1ファイルは3~5万行記述あります。 これを1つのExcelファイルにしたいと思っています。 VBA流れとして (1)ログ格納フォルダを選択 (2)ログファイル名を取得 (3)既存Excelファイルに(2)で取得したファイル名(.txt除いた)で順次シートを追加 (4)ログファイル=シートとなるようにファイル読み込み/貼り付け (5)ログファイルを閉じる VBAイメージ 格納フォルダ:C:\test \test内    :A001.txt,A002.txt,B003.txt・・・・・・・・Z051.txt(このフォルダにはログのみ格納) C:デスクトップ\集計マクロ.excel (VBAの記述のあるExcelシートにはSheet1のみが存在) VBA前 集計マクロ.excel/Sheet1 VBA実行後 集計マクロ.excel/Sheet1,A001,A002,B003,D004・・・・・・・・・Z051が追加、シート毎にログ情報記載 単一ファイルの読み込み/ファイル名をシート名に付与/情報コピペ/ファイル閉じについては、 作成できたのですが、複数ファイルの場合のファイル名を順次取得し、シート名として付与するなど objやValiant変数などで試行錯誤しましたが解決できず、こちらに質問されていただきました>< このVBAで作成されたシートからの集計マクロについては完成していますが、 その手前でつまづいています>< ご教授のほどお願い致します><

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

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

  • エクセルで複数ファイルのシートから一つのシートへ結合したい

    エクセル上で、 Aフォルダ内にファイルBook1~数十個があり、Book1にはシート名「sh1」、Book2にはシート名「st2」のみがぞれぞれあります。シート内のデータ数はバラバラで何行のデータがあるか不明ですが、列数は同一です。 このファイルすべてを開かずに、今開いている、「加工.xls」のsheet1にまとめたいと思っています。(sh1の下にsh2、その下にsh3・・・を繰り返して、「加工.xls」のsheet1に貼り付ける。行間は空けず一覧表にする。フォルダ内のファイルが無くなったら終了する。)こんな感じのをマクロでやりたいと思っています。 ファイルを開かないで行う方法は、何とか過去の質問を調べてApplication.ExecuteExcel4Macroを使ってやろうとしていますが、応用が利きませんでした。開いていないファイルの最終行をどう取得選択してsheet1に持ってくればよいか分からず悩んでいます。 よろしくお願いいたします。

  • 複数のエクセルファイルのシートを1枚のシートに

    100個以上のエクセル(CSV)ファイルの1枚目のシートに同じ書式のファイルが多数(100個程度)有るのですが、これを1枚のシートにまとめる方法は無いのでしょうか? 一枚のシートの行数は数行~50行以下で、全部のデータを1枚に纏めてデータ処理したいのですが、一括は無理でも出来るだけ簡単に出来る方法をお願いします。 尚、当方VBAは不得手で、あまり長いと(長くなくても)動くまでの試行錯誤の手間ひまで100枚のファイルのシートへのコピペが終わってしまう程度の実力ですので、ご配慮?お願い致します。

  • ExcelのマクロでSheetに記載のファイル名に変更するには

    Excel2003のマクロで、Sheet1のセルb1~b***(***の値はマクロで末尾を認識させたい)に記載されているファイル名をDドライブのフォルダ名「TEST1」から検索してAAのセルC1~C***に記載のファイル名にリネームするマクロで、「TEST1」フォルダにSheet1のセルに記載のファイルがない場合はエラーにしないで無視して次に進むようにしたいのですが、初心者でうまくできません。ご指導宜しくお願いします。

  • エクセルの各シートに複数のテキストファイルを取り込むには?

    はじめまして。データの整理で困っています。 お力をお借りできたらと思います。 複数のテキストファイルがあります。 これらをエクセルのシートに取り込み、 各シート名を取り込んだファイル名としたいのですが、 何か良い方法はないでしょうか? 例えば、 No1_1001_1.txt、No1_1001_2.txt、No1_1002_1.txt、... というファイル群を Data_No1.xls のSheet1 <- No1_1001_1.txt Data_No1.xls のSheet2 <- No1_1001_2.txt Data_No1.xls のSheet3 <- No1_1001_3.txt ... というようにしたいのですが。よろしくお願いします。

  • エクセル:複数シートの一括処理

    お世話になります。 エクセルで1つのブックに複数のシートがあります。 書式は同じですが行数がそれぞれ違います。 A列で、データが入力されている一番下のセルの次の行から、エクセルの最終行である65536行までの行を全て選択して「削除」をしたいのです。(行の削除)しかも全シート一括で。 A列でデータが入っている一番下のセルがA550だった場合、551行~65536行までを全て選択→削除を行う。 これらの作業をするためのマクロを教えてください。

  • 複数のtxtの特定部分を抽出し、一つのxlsファイルにまとめたいです。

    複数のtxtの特定部分を抽出し、一つのxlsファイルにまとめたいです。 皆様のお知恵をお借りできませんでしょうか? 現在約1000行からなる同一体裁のtxtファイルを多数所持しております。 中身はタブで区切ってあったので、タブをコンマに変換し、CSVファイルを作りました。 これらのファイルを15~20ファイルごとにフォルダ分けしてあります。 このCSVファイルをエクセルで開いたところ、 うちB601:B802に必要な情報が入っていました。 この情報を以下のような要領で入力したまとめxlsファイルを作りたいです。 A列 1行目 一つ目のCSVのファイル名(フォルダ内のCSVを名前順で並べたときに1番上のもの) 2行目~203行目 一つ目のCSVのファイルのB601:B802 B列 1行目 2つ目のCSVのファイル名(名前順で2番目のもの) 2行目~203行目 2つ目のCSVのファイルのB601:B802 (以後15~20ファイル分、O~T列まで。20ファイル以上にも対応できると嬉しいです。) このxlsファイルを最低でも20個作る予定です。 VBAマクロできっと出来るはずと思い、昨日9時間ほど調べたのですが、習得には至ってません。 例えば1つのCSVのB601:B802をコピーするマクロは作成できますが、 それをまとめファイルのA2に貼り付け、 まとめファイルのA1にCSVのファイル名を挿入し、 さらに同様の抽出をフォルダ内の別のファイルに連続して行い、 挿入部位が被らないようにまとめファイルB列以降に貼り付けさせることができません。 http://www.asahi-net.or.jp/~zn3y-ngi/YNxv252.htmlや http://oshiete1.goo.ne.jp/kotaeru.php3?q=359726や http://www.excel.studio-kazu.jp/kw/20080428180002.htmlなどを 応用できないか試してみましたが結局よくわからない状態です。 おそらくこちらの説明が不十分で答えにくい質問なのではないかと思いますが、 どなたかお答えいただければ幸いです。 また、勉強してから出直せ!的なことであれば勉強したいとおもいますので、 お勧めの書籍、サイトを教えていただければ幸いです。 どうかよろしくお願いいたします。

専門家に質問してみよう