Dim A, B
'ファイルパスを指定
A = ThisWorkbook.Path & "\TEST.txt"
'読み込み
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile A 'ファイルに接続
B = .ReadText 'データを読み込む
.Close
End With
'出力
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
'ファイルに書き込み
.WriteText Cells(1, 1) & "," & Cells(1, 2), 1
'BOMを削除する
.Position = 0
.Type = 1
.Position = 3
B = .Read
.Close
.Open
.Write B
'保存するファイルを指定
.SaveToFile A, 2
.Close
End With
Sub TEST1()
Dim A, B
'ファイルパス指定
A = ThisWorkbook.Path & "\TEST.txt"
'テキストファイルを読み込みます。
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile A 'ファイルに接続
B = .ReadText 'データを読み込む
.Close
End With
'セルに入力
Cells(1, 1) = B
End Sub
こちらのUTF-8形式のテキストファイルを読み込んでみます。
では、実行してみます。
データを読み込むことができました。
ただ、1つデータとなっているので、エクセルで扱いづらいです。
まずは、改行区切りで分割してみます。
改行区切りで分割する
UTF-8形式で、テキストファイルから値を読み込んで、「改行区切り」で分割してみます。
文字列を分割する際は、「Split」を使います。
改行毎に分割したいので、区切り文字は「vbCrLf」とします。
Sub TEST2()
Dim A, B, C, D
'ファイルパスの指定
A = ThisWorkbook.Path & "\TEST.txt"
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile A 'ファイルに接続
B = .ReadText 'データを読み込む
.Close
End With
'改行毎にデータを分割
C = Split(B, vbCrLf)
'セルに入力
For i = 0 To 7
Cells(i + 1, 1) = C(i)
Next
End Sub
次のテキストファイルからデータを読み込んでみます。
読み込むテキストファイル
では、実行してみます。
改行区切りで分割できた
テキストファイルからデータを読み込んで、改行毎に分割してセルに入力できました。
ただ、1列になっているので、まだ扱いづらいです。
さらに、コンマ区切りで分割してみます。
改行・コンマ区切りにする
改行区切りと、コンマ区切りで、分割するVBAコードになります。
先ほどと同じように、「Split」を使います。
「コンマ」毎に分割したいので、区切り文字には、「","」を使います。
Sub TEST3()
Dim A, B, C, D
'ファイルパスの指定
A = ThisWorkbook.Path & "\TEST.txt"
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile A 'ファイルに接続
B = .ReadText 'データを読み込み
.Close
End With
'改行毎にデータを分ける
C = Split(B, vbCrLf)
'コンマ毎にデータを分けてデータを保存する
For i = 0 To 7
D = Split(C(i), ",") 'コンマ毎に分割する'セルに入力
Cells(i + 1, 1) = D(0)
Cells(i + 1, 2) = D(1)
Next
End Sub
次のテキストファイルからデータを読み込んでみます。
読み込むテキストファイル
では、実行してみます。
改行区切り、コンマ区切りで分割できた
テキストファイルからデータを読み込んで、改行毎とコンマ毎に分割してセルに入力できました。
これで、エクセル上でデータが扱いやすくなりました。
こんな感じで、テキストファイルからデータを読み込むことができます。
VBAでUTF-8形式テキストファイルへ出力
次は、VBAを使って、UTF-8形式でテキストファイルへ出力してみます。
1行だけ出力する
やりたい内容は、テキストファイルに出力したい、ということになります。
テキストファイルに出力したい
まずは、1行だけを出力してみます。
1行だけ出力してみる
1行だけテキストファイルに出力するVBAコードは、こんな感じになります。
Sub TEST4()
Dim A
'ファイルパスを指定
A = ThisWorkbook.Path & "\TEST.txt"
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
'ファイルに書き込み
.WriteText Cells(1, 1) & "," & Cells(1, 2)
'ファイルに接続
.SaveToFile A, 2
.Close
End With
End Sub
次の表を使って、1行だけテキストファイルに出力してみます。
では、実行してみます。
1行だけ、テキストファイルに出力できました。
ただ、1行だけでは、使い物にならないので、次はすべての行を出力してみます。
すべての行を出力する
すべての行をテキストファイルに出力するには、「For」を使ってループします。
1行出力したら改行したいので、「.WriteText」の2番目の引数に「1」を入力します。
Sub TEST5()
Dim A
'出力するファイルパスを設定
A = ThisWorkbook.Path & "\TEST.txt"
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
'ファイルに書き込み
For i = 1 To 8
.WriteText Cells(i, 1) & "," & Cells(i, 2), 1
Next
'保存するファイルを指定
.SaveToFile A, 2
.Close
End With
End Sub
次の表をテキストファイルに出力してみます。
読み込むテキストファイル
では、実行してみます。
すべての行を出力したい
すべての行をテキストファイルに出力できました。
すべての行を出力したい場合は、こんな感じで「For」を使います。
ただ、まだ問題があって、出力したテキストファイルが「BOM付きのUTF-8」になっています。
BOM付きのUTF-8になっている
「UTF-8」形式で出力したい場合は、「BOM」を削除する必要があります。
では、次で「BOM」を削除して出力してみます。
BOMなしのUTF-8にする
「BOM」を削除して、UTF-8形式で出力するVBAコードなります。
「BOM」を削除するVBAコードを追加しています。
Sub TEST6()
Dim A, B
'出力するファイルパスを設定
A = ThisWorkbook.Path & "\TEST.txt"
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
'ファイルに書き込み
For i = 1 To 8
.WriteText Cells(i, 1) & "," & Cells(i, 2), 1
Next
'BOMを削除する
.Position = 0
.Type = 1
.Position = 3
B = .Read
.Close
.Open
.Write B
'保存するファイルを指定
.SaveToFile A, 2
.Close
End With
End Sub
Sub TEST7()
t = Timer
Dim A, B, C, D
'ファイルパス指定
A = ThisWorkbook.Path & "\TEST1.txt"
'テキストファイルを読み込み
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile A 'ファイルに接続
B = .ReadText 'データを読み込む
.Close
End With
'改行毎に分割
C = Split(B, vbCrLf)
'空の配列を作成
ReDim D(100000)
'値を2倍にする
For i = 0 To 100000
If i = 0 Then
D(i) = C(i)
Else
D(i) = C(i) * 2
End If
Next
'BOMなしUTF-8で出力する
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
'データを書き込み
For i = 0 To 100000
.WriteText D(i), 1
Next
'BOMを削除する
.Position = 0
.Type = 1
.Position = 3
B = .Read
.Close
.Open
.Write B
'保存するファイルを指定
.SaveToFile A, 2
.Close
End With
Debug.Print Timer - t & " 秒"
End Sub