0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【VBA】ファイルの読み込み(CreateObject関数/Line Input # ステートメント)

Last updated at Posted at 2022-08-07

VBAでファイルの読み込みを行う際に、改行コード/文字コードでLine Input # ステートメントのファイルの読み方・文字化け等が発生する事を学習しましたので、検証結果も兼ねて備忘として残しておきます。
※UTF-8の文字コードだと、文字化けするのでCreateObject関数を使用する事も覚えました。

今回検証に使用するファイルは、以下のような文字が記載されています。

image.png

改行コードがCRLFの場合は、Line Input # ステートメントを使用したファイル読み込みは一行ずつ読み込みを行います。
下記のような感じです。シンプルに転記を行いたい場合は、これでよいと思います。

Animation.gif

LFの場合は一行ではなく、全文読み込みを行います。
下記のような感じです。転記する場合は用途によりますが、私はsplitで改行コードやカンマ等で区切りました。

Animation.gif

文字コードがUTF-8の場合は文字化けしますので、後期するCreateObject関数を使用します。
下のような感じで、ひらがなや漢字が文字化けします。

Animation.gif

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

以上です。
何かの参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?