Excel (VBA) |
|
(指定なし : 指定なし)
テキストファイルのエクセルへの転記
投稿日時: 26/09/18 20:50:35
投稿者: yuiyui0618
|
|---|---|
|
ひとつのフォルダに約250個のテキストファイルがあります。
|
|
|
|
投稿日時: 26/09/19 14:50:52
投稿者: 半平太
|
|---|---|
|
PowerQueryでの処理に向いている様な気がするのですが、
|
|
|
|
投稿日時: 26/09/19 15:06:45
投稿者: simple
|
|---|---|
|
久しぶりの投稿者さんで気づくの遅れました。投稿歓迎です。
|
|
|
|
投稿日時: 26/09/19 20:17:14
投稿者: yuiyui0618
|
|---|---|
|
半平太様、simple様ご回答ありがとうございます。
|
|
|
|
投稿日時: 26/09/19 22:22:40
投稿者: simple
|
|---|---|
|
(1)
0001 0002 ・・・ abcdefg hijklmnop ・・・というように行列を転置した形式で書き込んでいき、 最後に転置(Application.Transpose関数)して元に戻したうえで、 それをワークシートに書き込みます。 (2) 今回は別の方法にトライしてみました。 ・全文字列を読み込む。 ・改行コードで splitしたままのものを、一次元の配列としてワークシートに書き込みます。 ・全ファイルの処理が完成してから、まとめて「区切り位置」機能を使ってB列とC列に展開する という方式です。参考までに提示してみます。 コードを提示しますが、実際データではなく、最初はテストデータで十分にテストして下さい。 こちらのミスもあるかもしれません。 Dim FSO As Object
Dim targetSheet As Worksheet
Sub main()
Const folder As String = "D:\MyDocuments\202609\test"
'対象ファイルが入っているフォルダのパス。'■修正必要
'■尻尾に"\"は不要
'(1)書き込み先シートの定義と初期設定
Set targetSheet = ThisWorkbook.Worksheets("Sheet1") ' ■要確認
With targetSheet
.UsedRange.ClearContents 'いったん消去する ■要注意
.Columns("A:C").NumberFormatLocal = "@"
End With
'(2)ファイルを開いて、targetSheetに書き込む
Dim f As Variant
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each f In FSO.GetFolder(folder).Files '
Call getData(f.Path)
Next
Set FSO = Nothing
'(3)B列に読み込んだ文字列を、「区切り位置」機能を使ってB,C列に展開する
Dim lastRow As Long, rng As Range
With targetSheet
lastRow = .Cells(Rows.Count, "B").End(xlUp).Row
Set rng = .Range([B2], .Cells(lastRow, "B"))
rng.TextToColumns Destination:=.Range("B2"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, _
FieldInfo:=Array(Array(1, 2), Array(2, 2)), TrailingMinusNumbers:=True
End With
End Sub
Function getData(fpath As String)
Dim TextFile As Object, buf As String
Dim buf2, buf3
Dim basename As String
Dim pos As Long
Dim n As Long
basename = FSO.GetBaseName(fpath)
Set TextFile = FSO.OpenTextFile(fpath)
buf = TextFile.ReadAll
buf2 = Split(buf, vbCrLf)
buf3 = Application.Transpose(buf2)
If buf3(UBound(buf3, 1), 1) = "" Then 'データの最終行が改行で終わっている場合
n = UBound(buf3, 1) - 1
Else
n = UBound(buf3, 1)
End If
'シートに書き込む
With targetSheet
pos = .Cells(Rows.Count, "B").End(xlUp).Row + 1
.Cells(pos, "A").Resize(n, 1) = basename
.Cells(pos, "B").Resize(n, 1) = buf3
End With
Set TextFile = Nothing
End Function
|
|
|
|
投稿日時: 26/09/19 22:56:08
投稿者: simple
|
|---|---|
Set rng = .Range([B2], .Cells(lastRow, "B"))は、念のため Set rng = .Range(.Range("B2"), .Cells(lastRow, "B"))に修正して下さい。 |
|
|
|
投稿日時: 26/09/19 23:49:07
投稿者: 半平太
|
|---|---|
|
中間まとめ用にCollectionを使ってみました。
Dim FilePath As String
Dim fileContent As String
Dim fileNumber As Integer
Dim line As String
Dim i As Long
Sub データ取り込み()
Dim COLL As Collection
Dim folderPath As String
Dim fileName As String
Dim fileNameIncell As String
Dim DATA(), DataAry
Dim StartTime
StartTime = Timer
Set COLL = New Collection
folderPath = "C:\TEXT"
' ファイル番号を取得
fileNumber = FreeFile
fileName = Dir(folderPath & "\*.TXT")
Do While fileName <> ""
FilePath = folderPath & "\" & fileName
fileNameIncell = Mid(FilePath, 10, Len(FilePath) - 13)
' テキストファイルを開く(読み取り専用モード)
Open FilePath For Input As fileNumber
' ファイルの中身を1行ずつ読み込み
Do Until EOF(fileNumber)
Line Input #fileNumber, line ' 1行ずつ読み込む
COLL.Add Array(fileNameIncell, Left(line, 4), Right(line, Len(line) - 5))
Loop
fileName = Dir()
Close fileNumber
Loop
i = 1
ReDim DATA(1 To COLL.Count, 1 To 3)
For Each DataAry In COLL
DATA(i, 1) = DataAry(0)
DATA(i, 2) = DataAry(1)
DATA(i, 3) = DataAry(2)
i = i + 1
Next
Columns("A:C").ClearContents
Range("A1").Resize(UBound(DATA), 3) = DATA
MsgBox (Timer - StartTime) & "秒"
End Sub |
|
|
|
投稿日時: 26/09/20 12:26:26
投稿者: yuiyui0618
|
|---|---|
|
半平太様、simple様ご回答ありがとうございます。
|
|
|
|
投稿日時: 26/09/23 16:54:27
投稿者: Suzu
|
|---|---|
|
VBAの中で一つ一つのファイルを開く方法ももちろんありますが、作業ファイルを使っても良いのでしたら、
@echo off
cd /d "%~dp0"
set "EXT=*.txt"
set "OUTPUT=combined.txt"
if exist "%OUTPUT%" del "%OUTPUT%"
for /f "delims=" %%f in ('dir /b /on "%EXT%"') do (
type "%%f" >> "%OUTPUT%"
)
echo %EXT% タイプのファイルを %OUTPUT% に結合しました。
pause
作成された「combined.txt」をExcelで開けば良いかと。 |
|
|
|
投稿日時: 26/09/23 18:21:48
投稿者: yuiyui0618
|
|---|---|
|
Suzu様
|
|
|
|
投稿日時: 26/09/24 08:08:26
投稿者: simple
|
|---|---|
|
yuiyui0618 さんへ
|
|
|
|
投稿日時: 26/09/24 15:23:43
投稿者: Suzu
|
|---|---|
yuiyui0618 さんの引用: ファイルの中身自体は、固定長の様ですので、 ファイル名の文字列の長さは固定長でしょうか? 固定長とは限らない事も考慮し、行末にファイル名を追加する様にするなら、 以下の様になるかと。 @echo off
cd /d "%~dp0"
set "EXT=*.txt"
set "OUTPUT=combined.txt"
if exist "%OUTPUT%" del "%OUTPUT%"
for /f "delims=" %%f in ('dir /b /on "%EXT%"') do (
:: 各ファイルを1行ずつ読み込んで、末尾にファイル名を結合
for /f "usebackq delims=" %%l in ("%%f") do (
echo %%l %%f>> "%OUTPUT%"
)
)
echo %EXT% タイプのファイルを %OUTPUT% に結合しました。
pause |
|
|
|
投稿日時: 26/09/26 07:22:28
投稿者: yuiyui0618
|
|---|---|
|
返事が遅くなってすみません。
|
|




