こんにちは、Ryoです。
テキストファイル(形式UTF-8)からデータを読み込む際にファイルの読み込み位置を指定したいようなケースではSeekステートメントの利用、またはADO(ActiveX Data Objects)を利用することで対応できますので、今回はその内容について書いていきます。
1.サンプル概要
簡単な文字列(半角英数字)を記入したテキストファイル「Sample1」(形式:UTF-8)を用意し、Seekステートメントを利用してファイルの5文字目(5バイト目)からデータを読み込んでメッセージボックスで表示します。

実行結果は以下の通りとなります。

半角英数字であれば問題ないのですが、UTF-8形式で且つSeekステートメントを利用する際に日本語などの全角文字が入力されている場合は下のように文字化けが発生します。

文字化けの対処としてはファイル形式をANSIにすれば解決しますが、UTF-8形式で読み込みたい場合はADO(ActiveX Data Objects)の利用で対応できます。ADOを利用してテキストファイル「Sample2.txt」の5文字目から読み込んでメッセージボックスに表示します。

実行結果は以下の通りとなります。

以上がサンプル概要です。
2.サンプルコード
◆Seekステートメントの利用
Sub Sample1()
'※Seekステートメントの利用
'※テキストファイル形式:UTF-8
Dim buf As String
Dim num As Integer
'ファイル番号を取得
num = FreeFile
'Sample1.txtファイルを入力モードで開く
Open ThisWorkbook.Path & "\Sample1.txt" For Input As #num
'読み込み開始位置を5バイト目に設定する
Seek #num, 5
'変数bufにデータを読み込む
Input #num, buf
'ファイルを閉じる
Close #num
'メッセージボックスで読み込んだデータを表示
MsgBox "読み込みデータ : " & buf
End Sub
構文:Seek[#]filenumber,position
Seekステートメントはデータの読み込みや書込み位置をバイト数で指定できるもので、指定範囲は1~2,147,483,647になります。
サンプルコードでは「Sample1.txt」の5バイト目を開始位置に指定し、Inputステートメントでデータを変数bufに読み込んでいます。
◆参考:ANSI形式
ちなみにサンプル概要で触れた全角文字併記のテキストファイル「Sample2」をANSI形式で保存し、そのテキストファイルの5文字目から読み込んで表示する場合は Seek #num, 9のように9バイト目を指定すればOKです。(全角文字=2バイトなので先頭4文字は2×4=8バイト)

Sub Sample3()
Dim buf As String
Dim num As Integer
num = FreeFile
Open ThisWorkbook.Path & "\Sample3.txt" For Input As #num
Seek #num, 9
Input #num, buf
Close #num
MsgBox "読み込みデータ : " & buf
End Sub
実行結果は以下になりますので、ご参考までに。

◆ADO(ActiveX Data Objects)の利用
Sub Sample2()
'※ADO(ActiveX Data Objects)の利用
'※テキストファイル形式:UTF-8
Dim buf, Target As String
Dim smpLen As Long
'対象のテキストファイルパスを指定
Target = ThisWorkbook.Path & "\Sample2.txt"
'ADODB.Streamオブジェクト生成
With CreateObject("ADODB.Stream")
'取り扱う文字コードを指定
.Charset = "UTF-8"
'Streamオブジェクトを開く
.Open
'対象ファイルをStreamに読み込み
.LoadFromFile Target
'変数bufへ全てのデータを格納
buf = .ReadText
'Streamを閉じる
.Close
'変数bufの文字列数を把握
smpLen = Len(buf)
'5文字目から最後までを抽出
buf = Mid(buf, 5, smpLen)
'メッセージボックスにて表示
MsgBox "読み込みデータ : " & buf
End With
End Sub
テキストファイル形式UTF-8の場合で全角文字含めて読み込む際はADO(ActiveX Data Objects)を利用します。ADO自体の詳細は割愛しますが、Microsoftが提供しているソフトウェアパッケージです。
内容はサンプルコード内のコメントに記述した通りですが、CreateObject(”ADODB.Stream”)で使用できる状態にして.Charsetで文字コードを指定します。
.OpenでStreamオブジェクトを開き、.LoadFromFile Targetで対象ファイルをStreamに読み込んでbuf=.ReadTextで変数bufにすべてのデータを格納し、.Closeで閉じます。
後はLen関数で文字列数を把握し、Mid関数を利用して抽出したい文字位置を指定しています。ここでは5文字目から最後までをメッセージボックスで表示させます。
3.まとめ
VBAでテキストファイルを扱うことは多々ありますので、今回のようなテキストファイルとの連携に関する内容は知っておくと便利です。
用途にもよりますが通常であればUTF-8形式のファイルを扱う場合はADO(ActiveX Data Objects)を利用した方が便利で簡単に処理出来るかと思いますので、機会があればぜひご活用くださいませ。
以上、テキストファイルの指定位置からデータを読み込む方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo

