• 締切済み

フォルダ内にあるテキストファイル複数行転記について

Excel VBAにて、フォルダ内のテキストファイルの複数行をExcelに転記するにはどうしたら良いでしょうか。 WEBサイトで似たようなものがありましたが、このマクロは2行目のみの転記です。 実際は14、18、28、32行目を転記したいです。 +αで条件を追加すると以下のようになります。 ①フォルダ内には100件近くのテキストファイルがあり、全て順番に処理をしていく ②抽出したい行にはタブで数字が5つほど並んでいます。(画像の用な感じです。) ③28、32行目は転記しデータを区切った後、左側2つの数字は削除したいです。(全てのテキストファイルに適用) ④特に空白行は作らず、下に追加していく。(A1から開始) ⑤シートを新しく追加する。 Excelはo365を使用しています。 参考にしたマクロは以下のものです。 初心者の為、すみませんが教えてください。よろしくお願いします。 ******************************************** '指定フォルダの全テキストの任意行を取得 Sub GetAllTextData() 'フォルダ指定用のダイアログを表示します With Application.FileDialog(msoFileDialogFolderPicker) 'カレントディレクトリを指定します .InitialFileName = ThisWorkbook.Path '設定しなかったら終了します If .Show = False Then Exit Sub '設定したフォルダを表示します Dim Fname Fname = .SelectedItems(1) End With '参照設定 Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") Dim FilePath As Variant ReDim FilePath(1 To 100) As Variant '指定フォルダ内の.txtファイルを探索します i = 0 For Each File In FSO.GetFolder(Fname).Files If InStr(File.Name, ".txt") > 0 Then i = i + 1 FilePath(i) = File.Path 'ファイルのフルパスを取得 End If Next '配列の大きさは状況に応じ変更してください Dim Hozon, GetData As Variant ReDim GetData(1 To 100, 1 To 100) As Variant '全テキストファイルの任意行のデータを取得する m = 0 For k = 1 To UBound(FilePath, 1) 'テキストファイルが存在する場合に実行 If IsEmpty(FilePath(k)) = False Then '保存する配列を空にする ReDim Hozon(1 To 100, 1 To 100) As Variant 'テキストを開いて配列にデータを保存 Open FilePath(k) For Input As #1 i = 0 'テキストをすべて取得する Do Until EOF(1) Line Input #1, buf i = i + 1 'コンマ区切りでデータを取得する a = Split(buf, ",") For j = 0 To UBound(a, 1) Hozon(i, j + 1) = a(j) Next Loop Close #1 '▼取得したいデータに応じ変更してください '任意行の値を取得する i = 2 '2行目のデータを取得 m = m + 1 For j = 1 To UBound(Hozon, 2) GetData(m, j) = Hozon(i, j) Next End If Next 'データ貼り付け With ActiveSheet .Range(.Cells(2, 1), .Cells(2, 1).Offset(UBound(GetData, 1) - 1, UBound(GetData, 2) - 1)) = GetData End With End Sub (参考サイト:https://daitaideit.com/vba-get-alltext/

noname#253191
noname#253191

みんなの回答

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

フォルダ内にあるテキストファイル複数行転記について ==>すべてのファイルを対象にするのだね。 Excel VBAにて、フォルダ内のテキストファイルの複数行をExcelに転記するにはどうしたら良いでしょうか。 ==>エクセルVBAを使う、のだね。 1テキストファイルをエクセルシートに読み込むのは、都合が悪いのかな? そして、望む項目を、エクセルのシートに書き出すのだね。 1テキストファイルあたり抜出該当が、複数行=複数レコードあるということか?どういう単位で複数行に分けるのか? ①フォルダ内には100件近くのテキストファイルがあり、全て順番に処理をしていく ==>各テキストファイルには、その中に、データ項目のようなものがあって、データ区切り(カンマ、タブ、空白などが多い)はあるのか、無いのか。文章のように文字列、数などが並んでいるのか? ②抽出したい行にはタブで数字が5つほど並んでいます。(画像の用な感じです。) ==>数字が5つほど、 の「ほど」は扱いづらいのだか、どういう状態か? ③28、32行目は転記しデータを区切った後、左側2つの数字は削除したいです。(全てのテキストファイルに適用) ==>(全てのテキストファイルに適用)は質問の全文にかかわるのではないのか? 「28、32行目」は検出が難しいのだが。(注1) ④特に空白行は作らず、下に追加していく。(A1から開始) ==>エクセルシート(決めた1シート)に上の行から行的に、列挙していくということだろうね。書かずもがなと思う。 >(A1から開始)は、アウトプット行ポインターを使えば、初期値設定によってで、自由に設定できる。 ⑤シートを新しく追加する。 コードが出来上がってからでも、簡単に変えられる。 注1)レコード番号を指定してファイルのレコード1つを読むことも、ないではないが、固定長でないと難しいようだ。

  • SI299792
  • ベストアンサー率48% (714/1475)
回答No.1

画像を見る限り、A~E列を転記すればいいみたいですが、それでもいいですか。 .txt、カンマ区切りですか。 文字コードはシフトジス(Ansi)専用です。 貴方の上げたプログラムは、長く複雑て理解できないので、自作しました。 Option Explicit ' Sub Macro1()   Dim Path As String   Dim File As Variant   Dim RInp As Long   Dim ROut As Long   Dim Colu As Integer '   With Application.FileDialog(msoFileDialogFolderPicker)     .InitialFileName = ThisWorkbook.Path '     If .Show = False Then       End     End If     Path = .SelectedItems(1)   End With   File = Dir(Path & "\*.txt")   [A:E].ClearContents   Application.ScreenUpdating = False '   Do While File > ""     Open Path & "\" & File For Input As #1     RInp = 0 '     Do While Not EOF(1)       RInp = RInp + 1       Line Input #1, File              If RInp = 14 Or RInp = 18 Or RInp = 28 Or RInp = 32 Then         File = Split(File, ",")         ROut = ROut + 1 '         For Colu = 1 To 5           Cells(ROut, Colu) = File(Colu - 1)         Next Colu       End If     Loop     Close     File = Dir   Loop End Sub

関連するQ&A

  • 配列に格納したデータを指定行以下に転記する方法

    excel2000を使っています。 以下のコードだと最終行にデータが転記されます。これを4行目に確定して、転記したいのです。常に4行目つまりA列4行目以下に上書きしたいのです。 その場合コードをどのように変更すべきでしょうか? Sub 配列() With ActiveSheet ' 配列に格納 --------------------------- Dim i As Integer Dim LastRow As Long Dim SaleAry As Variant ' 配列に格納 --------------------------- SaleAry = Array(.Range("t4"), .Range("e5"), .Range("g5"), .Range("o5")) End With ' 転記 --------------------------- With Worksheets("daityou") LastRow = .Range("A65536").End(xlUp).Row For i = 0 To UBound(SaleAry) .Cells(LastRow + 1, i + 1).Value = SaleAry(i) ' Next i End With Set SaleAry = Nothing End Sub

  • エクセルに二つのテキストファイルをインポートしたい

    エクセルのsheet1の1行目にタイトルがあります。 ボタンのクリックイベントで、テキストファイル2つをインポートしたいのですが。 ・テキストファイルの名前は、固定ではありません ・テキストファイルの保存先は、デスクトップで、ファイルの選択は自分でしたい ・テキストファイルの一行目は、タイトル行なので、二行目以降をインポートしたい 行数は固定ではありません ・タブ区切りです 複数選択はできなく、1ファイルでタイトル行も含めるのであれば下記コードできたのですが。 どなたか、ご教示いただけますでしょうか・・・・ よろしくお願いいたします。 ----------------------------------------------------- Sub ReadTextFile() 'タブ区切りファイルを全て文字列として読み込む 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") If FileName <> "False" Then '全セル選択して書式を文字列にセットする Cells.Select Selection.NumberFormatLocal = "@" Cells(1, 6).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 Else End If End Sub -----------------------------------------------------

  • excelファイルを検索してセル内容を転記する方法

    VBA初心者です。 Aというディレクトリがあり、その中に1,2,3,4というフォルダがあります。 1には「apple1.csv」、「orange1.csv」、「banana1.csv」 2には「apple2.csv」、「orange2.csv」、「banana1.csv」 ・・・ 4には「apple4.csv」、「orange4.csv」、「banana4.csv」 が入っています。 この1から4のフォルダのapple1,apple2,apple3,apple4のファイルをとりだし、それぞれのA1~A10セルを新たなファイルに自動転記する(apple1はA1~A10,apple2はB10~B10・・・)といった具合のマクロを組みたいと思っています。 あるフォルダの中のexcelファイルであれば、以下のソースコードを用いてコピーしたいファイルを選択してセルを転記しているのですが、今回のように、ディレクトリがいくつもあり、その各ディレクトリ中のファイル名の共通項を検索してそのセルを転記する方法が全く分かりません。 どなたかわかる方アドバイスをお願いします。 Sub ブック保存() Dim j As Integer Dim ファイル一覧 As Variant ファイル名一覧 = Application.GetOpenFilename("apple,*.xlsm", MultiSelect:=True) If VarType(ファイル名一覧) = vbBoolean Then Exit Sub Application.EnableEvents = False For i = 1 To UBound(ファイル名一覧) Set ブック = Workbooks.Open(ファイル名一覧(i)) With ThisWorkbook.Worksheets(1) For j = 1 To 10 .Cells(j, i) = ブック.Worksheets(1).Cells(j, 1).Value Next End With ブック.Close Next Application.EnableEvents = True End Sub

  • VBAでtextファイルを作成

    マクロ・VBA初心者です。 ご教授お願いします!! 経費精算のExcelデータを画像のような「"",]で区切ったテキストファイルを作成するマクロを作りたいと考えてます。 完成イメージ:マクロのボタンを押すとテキストファイルの形でフォルダに作成される。もしくは、マクロボタンを押すとテキストファイルの形で区切ったものが表示されるものを作りたいです。 *経費精算データに関してA列からX列まであり、集計データにより列にデータを埋めていく作業が入っております。なので、A列からX1列まででデータが記入されている範囲で集計できるようにしたいと考えております。 現在は、勉強しつつ組み立てた結果、 CSVのExcelファイルをフォルダの中に作成できるようになりました。 (コードは下記に記載します) ただ、テキストファイルが作れるコードができていないのが問題です。 このコードをどのように変えればよいのか? もしくは、別のコードで出来るようならば教えていただけると嬉しく思います。 宜しくお願いします。 ______________________________ 〈コード〉 Option Explicit Sub ExcelファイルCSV形式作成() '変数宣言 Dim filePath As String Dim i As Long Dim maxRow As Long Dim fileNo As Integer '初期値設定 filePath = ActiveWorkbook.Path & "\経費計算エクセル(CSV保存).csv" maxRow = Range("A1").End(xlDown).Row '最終行取得 fileNo = FreeFile 'FreeFile関数で使用可能なファイル番号取得 'ファイル開く Open filePath For Output As #fileNo '最終行までループ For i = 1 To maxRow '列の数は決め打ち Write #fileNo, Cells(i, 1), Cells(i, 2), Cells(i, 3), Cells(i, 4), Cells(i, 5), Cells(i, 6); Cells(i, 7), Cells(i, 8), Cells(i, 9); Cells(i, 10), Cells(i, 11), Cells(i, 12); Cells(i, 13), Cells(i, 14), Cells(i, 15); Cells(i, 16), Cells(i, 17), Cells(i, 18); Cells(i, 19), Cells(i, 20), Cells(i, 21); Cells(i, 22), Cells(i, 23), Cells(i, 24) Next i 'ファイル閉じる Close #fileNo End Sub ______________________________________ 以上です。 本当に困ってます。よろしくお願します。

  • Excelマクロでフォルダ内のCSVファイルを一括で読み込ませるには?

    Excelファイルと同階層にあるCSVファイルを読み込ませるマクロを作ってみたのですが、正常に動作しません。 アドバイスいただければ幸いです。 Excel2003を使用しています。 Sub 同階層フォルダ内のCSV読込_Click() Dim fname As String 'ファイル名 Dim pathname As String 'パス名 Dim dat(1 To 4) As Variant '読み込んだデータ Dim rr As Long '対象行番号 Dim i As Integer '列のオフセット Dim j As Integer 'ファイル識別番号のオフセット '同階層フォルダ内のCSVファイルを参照 pathname = ".\*.csv" fname = Dir(pathname, vbNormal) 'データを挿入する行番号 rr = 2 '該当するファイルがある間 Do While fname <> "" j = 0 j = j + 1 'ファイルを開く Open fname For Input As #j 'ファイルの終端まで Do Until EOF(j) 'データを取得 Input #j, dat(1), dat(2), dat(3), dat(4) '読み込んだデータをセルに出力 For i = 1 To 4 Cells(rr, i).Value = dat(i) Next '行番号を更新 rr = rr + 1 Loop Close #j 'フォルダ内の次のファイルを検索 fname = Dir() Loop End Sub

  • フォルダ内の複数のテキストファイルから指定行の抽出

    あるフォルダ内に入っているテキストファイルの2行目を全て抽出して一つのファイルにまとめたいのですが、どのような方法があるのでしょうか? perlなどのスクリプトを教えてもらえればと思います。

    • ベストアンサー
    • Perl
  • 複数行を最終行に転記

    ブックから他ブックへの複数行を最終行に転記したいと考えております。 1日1行であれば転記出来るものの、1日が複数行となると1日の最終行のみが転記され困っております。 縦カレンダー仕様 ・月初ではなく日曜始まりの為前月含むこともあり ・1日につき各4行づつ ・4行すべて毎日データーが入るわけではなく時々入る程度 スケジュール表仕様 ・日曜始まりの一週間毎のシート ・1日につき9行分 1か月分だと長いので1週目分だけですが… Activ bookを縦カレンダー(入力用シート) Thisbookをスケジュール表(転記先シート) Sub 転記_Click() Dim WBK1 As Workbook,WBK2 As Workbook Dim SH1 As Worksheet,SH2 As Worksheet Dim myRow1 As Long,myRow2 As Long,myRow3 As Long,myRow4 As Long_ myRow5 As Long,myRow6 As Long,myRow7 As Long Set WBK1 = ThisWorkbook '縦カレンダー Set WBK2 = ActiveWorkbook 'スケジュール表 Set SH1 = WBK1.Worksheets("1週目") 'スケジュール表 Set SH2 = WBK2.Worksheets("3月") '縦カレンダー Set SH3 = WBK1.Worksheets("2週目") 'スケジュール表 Set SH4 = WBK1.Worksheets("3週目") 'スケジュール表 Set SH5 = WBK1.Worksheets("4週目") 'スケジュール表 Set SH6 = WBK1.Worksheets("5週目") 'スケジュール表 Set SH7 = WBK1.Worksheets("6週目") 'スケジュール表 With SH1 myRow1 = SH1.Range("C1").End(xlDown).Row '日 myRow2 = SH1.Range("C12").End(xlDown).Row '月 myRow3 = SH1.Range("C23").End(xlDown).Row '火 myRow4 = SH1.Range("C34").End(xlDown).Row '水 myRow5 = SH1.Range("C45").End(xlDown).Row '木 myRow6 = SH1.Range("C56").End(xlDown).Row '金 myRow7 = SH1.Range("C67").End(xlDown).Row '土 SH1.Range("C" & myRow1 + 1 & ":J" & myRow1 + 1).Value = SH2.Range("C3:J6").Value '日 SH1.Range("C" & myRow2 + 1 & ":J" & myRow2 + 1).Value = SH2.Range("C7:J10").Value '月 SH1.Range("C" & myRow3 + 1 & ":J" & myRow3 + 1).Value = SH2.Range("C11:J14").Value '火 SH1.Range("C" & myRow4 + 1 & ":J" & myRow4 + 1).Value = SH2.Range("C15:J18").Value '水 SH1.Range("C" & myRow5 + 1 & ":J" & myRow5 + 1).Value = SH2.Range("C19:J22").Value '木 SH1.Range("C" & myRow6 + 1 & ":J" & myRow6 + 1).Value = SH2.Range("C23:J26").Value '金 SH1.Range("C" & myRow7 + 1 & ":J" & myRow7 + 1).Value = SH2.Range("C27:J30").Value '土   End With End Sub

  • VBA ファイル:列の値をエクセル:行に転記

    下記内容のテキストファイルがあります(12行)。 2;SIDE-Z; 1;16.0769 3;SIDE-Z; 1;16.0700 4;SIDE-Z; 1;16.0655 5;SIDE-Z; 1;16.0692 6;SIDE-Z; 1;5.5960 7;SIDE-Z; 1;5.5947 8;SIDE-Z; 1;5.5894 9;SIDE-Z; 1;5.5900 10;SIDE-Z; 1;15.7398 11;SIDE-Z; 1;15.7394 12;SIDE-Z; 1;15.7375 13;SIDE-Z; 1;15.7384 この内、セミコロンで区切った四列目をエクセルの行(12列) に転記したいと考えています。 エクセル 1      2       3      4      5      6     7....... 16.0769 16.0700 16.0655 16.0692 5.5960 5.5947 現在自分で記述しているプログラムでは、テキストファイルをセミコロンで 区切った一行分を読み込み、表示データが格納されている要素を指定しています。 この方法ではやろうとしている事が出来ないのは解っているのですが、良い方法が 解りません。 ご教授頂けると幸いです。 【ソースコード】 Sub データ抽出() Dim myFSO As New FileSystemObject Dim myTextFile As TextStream Dim mySalesData As Variant Dim I As Integer Set myTextFile = myFSO.OpenTextFile _ ("C:\Documents and Settings\PC045\デスクトップ\テキスト\sample 20110210.txt") Worksheets("sample").Activate I = 6 With myTextFile Do Until .AtEndOfStream = True mySalesData = Split(.ReadLine, ";") Cells(I, 4).Value = mySalesData(0) Cells(I, 5).Value = mySalesData(1) Cells(I, 6).Value = mySalesData(2) Cells(I, 7).Value = mySalesData(3) I = I + 1 Loop .Close End With End Sub

  • ブックの転記で計算式も転記したい

    ブックの転記で計算式も転記したい データを転記するマクロを作成しました。 【知りたいこと】 その1: 転記元となるブックを毎回「master」という名前に変更してから作業をしています。 この一手間を省きたいと考えているのですが、開いているもう一つのブックを自動で 転記元の〔mst〕と認識させて作業を進めるにはどうしたら良いでしょうか? その2: 転記先のD列に、転記元(master)E列の数式を転記させるにはどうしたら良いでしょうか? このE列には、数値の値だったり、足し算・引き算・割り算などの計算式が混在しています。 また、転記先の書式は保ち、値もしくは計算式だけを転記したい。 宜しくお願い致します。 ---------------------------------------------------------- Sub 値の転記() Dim ent As Worksheet, mst As Worksheet Dim i As Integer, j As Integer Dim lstCel As Integer Set ent = Workbooks("転記先").ActiveSheet Set mst = Workbooks("master").ActiveSheet   '←★その1:このブック名の指定 lstCel = mst.Cells(Rows.Count, "B").End(xlUp).Row For i = 1 To lstCel ent.Cells(j + 2, "A") = mst.Cells(i + 2, "A") ent.Cells(j + 2, "B") = mst.Cells(i + 2, "B") ent.Cells(j + 2, "C") = mst.Cells(i + 2, "D") ent.Cells(j + 2, "D") = mst.Cells(i + 2, "E")'←★その2:ここだけ数式を転記 j = j + 1 Next i End Sub ----------------------------------------------------------

  • フォルダ内の複数ブックのデータとブック名を転記する

    フォルダの中に複数のExcelファイル(ブック)が入っており、 それら全てのブックデータの転記を一括して行うマクロを現在使用しています。(後述) <現在の利用状況> ・フォルダの中に複数のExcelファイル(ブック)が入っている。ファイルにつきシートは1つ(ひな形は同じ) ・ファイルを確認するまでデータが何行入っているか分からない ・貼り付ける際はシートの上部は意図的に消している <改善希望> ・どのファイルから貼り付けたか分かるように、A列にファイル名を追記したい(どの行にも) ・できれば先頭の3文字のみ VBA勉強中の初心者ですが、なるべく早く実装しないといけないので、困っています。。。。 ご教示頂けます様お願いいたします。 ========================= Sub データ集計() '集計シートを変数に格納 Dim ws As Worksheet Set ws = ActiveSheet '集計シートの最終行を取得 Dim LastRow As Long LastRow = ws.Cells(Rows.Count, 5).End(xlUp).Row MsgBox "このブックと同じフォルダにあるブックを全て統合します" 'このブックの保存されているフォルダのパス(番地;ディレクトリ)を変数に取得 Dim thisPath As String thisPath = ThisWorkbook.Path 'ディレクトリにあるExcelのファイル名を取得 Dim fileName As String fileName = Dir(thisPath & "\" & "*.xlsx") Dim i As Long 'ファイル名が無くなるまで繰り返す Do While fileName <> "" '開くワークブックを変数に代入 Dim bufBook As Workbook Set bufBook = Workbooks.Open(thisPath & "\" & fileName) '開いたブックの第1シートの全データ --> 集計シートの最終行 bufBook.Worksheets(1).Range("B14").CurrentRegion.Copy Destination:=ws.Range("B" & LastRow) '最初のループ以外では、タイトル行を削除しておく Dim LastRowSecond As Long LastRowSecond = LastRow + 13 If i > 0 Then ws.Rows(LastRow & ":" & LastRowSecond).Delete End If '開いたブックを閉じる bufBook.Close SaveChanges:=False '集計シートの最終行を再取得しておく LastRow = ws.Cells(Rows.Count, 7).End(xlUp).Row + 1 '次のファイル名が取り出される。 fileName = Dir() i = i + 1 Loop End Sub

専門家に質問してみよう