テキストファイルのリーダーやライターで必要になる
「ファイル名を入力して、ファイルを開いて読み取る」を
試してみる。
従来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
#テキストエディター
#エディター
冷やかしの「いいね」は断ります!