テキストファイルのリーダーやライターで必要になる
「ファイル名を入力して、ファイルを開いて読み取る」を
試してみる。


従来BASICでは
 DIM A 
 INPUT "(文字)" ; A
 または
 INPUT  A

---------------------
リスト-01
VBAでは
上の形のINPUTは使えなかった。
それで、InputBoxを使う。

Dim FName As String
FName = InputBox("ファイル名は?")
Debug.Print FName
(イミディエイトWindowに表示)
これはうまくいった。

---------------------
テスト用文字ファイルを用意。
"E:\Test.Txt"
---------------------
"E:\Test.Txt"は
1234567890abcd
(空行)
12345678
---------------------

' Learn MSより VBA 引用
Line Input #ファイル番号, 変数名
Line Input ステートメントは、

復帰(Chr(13))、または復帰改行(Chr(13)+Chr(10))のシーケンスが出現するまで

1文字ずつファイルから読み取ります。
復帰改行のシーケンスは、
(文字列に追加されるのでなく)スキップされます。

注:"TESTFILE"は数行のサンプルデータを含むテキストファイル。
Dim TextLine
Open "TESTFILE" For Input As #1 'Open File
Do while Not EOF(1)    ' Loop until end of file.
    Line Input #1, TextLine)    'Read Line into variable.
    Debug.Print TextLine        Print to the Immediate winodw.
Loop
Close #1    'Close file.

---------------------
これを利用して:
リスト-02
Public Sub test()
Dim TextLine

Open "E:\Test.Txt" For Input As #1 'Open File
Do While Not EOF(1) ' Loop until end of file.
    Line Input #1, TextLine    'Read Line into variable.
    Debug.Print LenB(TextLine)
' バイト数をみると行末のCrLfが消えている。
    Debug.Print TextLine       ' Print to the Immediate winodw.
Stop
Loop
Close #1    'Close file.
End Sub

---------------------
結果は
 28
1234567890abcd
 0
(空行)
16
12345678
' バイト数をみると行末のCrLfが消えている。
==========================================
08/25追記:
(S-JIS)なのに、読み取ったら1行目が28バイト。
Unicodeになっていることに、今になって気づいた!!
==========================================

---------------------

リスト-01 とリスト-02
を組み合わせると
リスト-03
Public Sub test()
Dim TextLine

Dim FName As String
' ""は付けないこと。
FName = InputBox("ファイル名は?")
Debug.Print FName

Open FName For Input As #1 'Open File
' エラー処理が必要!
'stop

Do While Not EOF(1) ' Loop until end of file.
    Line Input #1, TextLine    'Read Line into variable.
    Debug.Print LenB(TextLine)
' バイト数をみると行末のCrLfが消えている。
    Debug.Print TextLine       ' Print to the Immediate winodw.
'Stop
Loop
Close #1    'Close file.
End Sub

---------------------
' エラー処理が必要!

今よく使われる
TRY ~ CATCH はなぜか使えなかったので
On Error Goto を使った。

『VBAエキスパート試験問題集』を参考に
https://vba-nav.com/excelvba/open/


リスト-04
Public Sub test()
    Dim TextLine
    Dim FName As String
' ""は付けないこと。
    FName = InputBox("ファイル名は?")
    Debug.Print FName

    Dim fileNum As integer

        fileNum = FreeFile ' 次に使用可能なファイル番号を取得する

    On Error Goto ErrorHandler

    Open FName For Input As fileNum 'Open File
' 存在しないと「ファイル名が不正です!」となる


    Do While Not EOF(fileNum) ' Loop until end of file.
        Line Input #fileNum, TextLine    'Read Line into variable.
'      ここは # 必要
        Debug.Print LenB(TextLine)
' バイト数をみると行末のCrLfが消えている。
        Debug.Print TextLine       ' Print to the Immediate winodw.
    Loop
    Close fileNum    'Close file.

    Exit Sub

    ErrorHandler:' エラーのときはここに来る。
        MsgBox("読み込みエラーです")
        Close fileNum    'Close file.
End Sub

---------------------

バイト数をみると行末のCrLfが消えている。
これは、別掲記事の S-JIS判定には具合が悪い。
Line Input がCrLfをデータの区切りに使っているらしいことから、
仕方がないのだが、
CrLfを行末に残す選択も残してほしいものだ。
仕方ないので、読み取った文字列の最後に CrLf を付加することにした。

リスト-05
Public Sub test()        ' 最後に CrLf を付加する版
    Dim TextLine
    Dim FName As String
' ""は付けないこと。
'    FName = InputBox("ファイル名は?")
    FName = "E:\Test.txt"
    Debug.Print FName

    Dim fileNum As integer
    Dim SjStr As String

    fileNum = FreeFile ' 次に使用可能なファイル番号を取得する関数

    On Error Goto ErrorHandler

    Open FName For Input As fileNum 'Open File
' 存在しないと「ファイル名が不正です!」となる


    Do While Not EOF(fileNum) ' Loop until end of file.
        Line Input #fileNum, TextLine    'Read Line into variable.
'      ここは # 必要
        Debug.Print LenB(TextLine)
' バイト数をみると行末のCrLfが消えている。
        Debug.Print TextLine       ' Print to the Immediate winodw.
' 行末に CrLf を付加する
        SjStr = TextLine & ChrB(&HD) & ChrB(&HA)
        Debug.Print "&HD &HA を付加  " & LenB(SjStr)
        Debug.Print SjStr       ' Print to the Immediate winodw.

    Loop
    Close fileNum    'Close file.

    Exit Sub

    ErrorHandler:' エラーのときはここに来る。
        MsgBox("読み込みエラーです")
        Close fileNum    'Close file.
End Sub

---------------------

E:\Test.txt
 28
1234567890abcd
&HD &HAを付加  30
1234567890abcd?
となり、付加が確認できた。

---------------------
ここまでうまくいった。
とはいえ、List-5 が落ち着くまでには、
    SjStr = TextLine & &HD & &HA
    SjStr = TextLine & Hex(&HD) & Hex(&HA)
    SjStr = TextLine & Asc(&HD) & Asc(&HA)
などの失敗が、、、。

UTF-8ファイルでは、この読み取り方が使えないかもしれないが、
それはまたそのとき考えよう。


#VisualBasic
#VBA
#テキストエディター
#エディター
冷やかしの「いいね」は断ります!