VBAでファイルの読み込みを行う際に、改行コード/文字コードでLine Input # ステートメントのファイルの読み方・文字化け等が発生する事を学習しましたので、検証結果も兼ねて備忘として残しておきます。
※UTF-8の文字コードだと、文字化けするのでCreateObject関数を使用する事も覚えました。
今回検証に使用するファイルは、以下のような文字が記載されています。
改行コードがCRLFの場合は、Line Input # ステートメントを使用したファイル読み込みは一行ずつ読み込みを行います。
下記のような感じです。シンプルに転記を行いたい場合は、これでよいと思います。
LFの場合は一行ではなく、全文読み込みを行います。
下記のような感じです。転記する場合は用途によりますが、私はsplitで改行コードやカンマ等で区切りました。
文字コードがUTF-8の場合は文字化けしますので、後期するCreateObject関数を使用します。
下のような感じで、ひらがなや漢字が文字化けします。
CreateObject関数については、ReadText メソッドで全文取得を行えるようです。
また、String = Stream.ReadText ( NumChars) が構文となるようで、ReadText (-2)で一行単位で読み込みを行えました。今回は、ReadTextで全文読み取ってspiltで対応しました。
Charsetで文字コードの指定を行えます、
※下記を参照致しました。
Stream オブジェクト (ADO)
'一行ずつ読み込み
Do
tmp(i) = .ReadText(-2)
If tmp(i) = "" Then
Exit Do
End If
i = i + 1
Loop
'全文読み込み
Set Stream = CreateObject("ADDOB.Stream")
With Stream
.Charset = "UTF-8"
.Open
.LoadFromFile (File_Pass)
Do
tmp(i) = .ReadText(-2)
If tmp(i) = "" Then
Exit Do
End If
i = i + 1
Loop
End With
たまに使う機能なので、下記にサンプルコード載せておきます。
'CreateObject関数
Dim File_Pass As String
Dim Stream As Object
Dim tmp As Variant
File_Pass = Dir(ThisWorkbook.Path & "\*.csv")
File_Pass = ThisWorkbook.Path & "\" & File_Pass
Set Stream = CreateObject("ADODB.Stream")
With Stream
.Charset = "Shift_Jis"
.Open
.LoadFromFile (File_Pass)
tmp = .ReadText
tmp = Split(tmp, vbLf)
End With
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Line Input # ステートメント
Dim File_Pass As String
Dim tmp As Variant
File_Pass = Dir(ThisWorkbook.Path & "\LF_test.csv")
File_Pass = ThisWorkbook.Path & "\" & File_Pass
Open File_Pass For Input As #1
Do Until EOF(1)
Line Input #1, tmp
tmp = Split(tmp, vbLf)
Loop
Close #1
以上です。
何かの参考になれば幸いです。