<概要>
今回は、指定パスのテキストファイルを読み込んで配列に格納する汎用プロシージャを紹介します。
読み込むテキストファイルはフルパスで指定しますが、テキストファイルの各行がカンマ「,」区切りやTab区切りの場合は、その区切りの数だけ列数の二次元配列を返します。データを二次元配列として取得することで、次に処理しやすい形式として扱うことが可能となります。
また、テキストファイルの文字エンコーディングはUTF-8、UTF-16、ShiftJISから選択も可能です。読み込むテキストファイルの形式に合わせて設定してください。
<用途>
テキストファイルを読み込む
<プロシージャ紹介>
Public Function InputText(FilePath As String, StringEncode As EnumStringEncode, [Delimiter As String = "",""], [NewLine As String = vbCrLf]) As Variant
名前: InputText /Functionプロシージャ
説明: テキストファイルを読み込んで二次元配列として返す
文字エンコーディングはUTF-8,UTF-16,ShiftJISから選択
'引数
FilePath ・・・テキストファイルのフルパス
StringEncode・・・文字エンコーディング
[Delimiter] ・・・区切り文字
[NewLine] ・・・改行文字(デフォルトでvbCrLf)
他vbLf,vbCrを設定可能
<実行例>
次のようなコードを用意します。
なおOneDriveの影響も考慮してConvOneDrivePath_LocalPathプロシージャを利用しています。
Public Sub TestInputText()
'フォルダパス指定
Dim Path As String: Path = ThisWorkbook.Path
Path = ConvOneDrivePath_LocalPath(Path)
'テキストファイル読込
Dim TextFile_Comma As Variant
Dim TextFile_Tab As Variant
TextFile_Comma = InputText(Path & "\" & "Test_Comma.txt", vbUTF8, ",")
TextFile_Tab = InputText(Path & "\" & "Test_Tab.txt", vbUTF8, Chr(9))
Stop 'ローカルウィンドウを確認すべし
End Sub
フォルダ内には「Test_Comma.txt」と「Test_Tab.txt」の2つのテキストファイルが用意されています。
2つのテキストファイルの中身は次のようになっています。「Test_Comma.txt」は各行の値がカンマ「,」で区切られており、「Test_Tab.txt」の場合はTabで区切られています。
Test_Comma.txtの中身
Test_Tab.txtの中身
先ほどのコードを実行あとに、ローカルウィンドウを確認すると変数TextFile_Comma、TextFile_Tabには二次元配列としてテキストファイルの中身が格納されているのが確認できます。
<技術解説>
InputTextプロシージャは第2引数で文字エンコーディングを選択できますが、コーディング中に入力候補がるようになっています。こちらはユーザー定義のEnum(EnumStringEncode)を引数の型として指定することで可能となるテクニックです。プロシージャの引数で複数の機能から選択させたい場合などで有効的です。
ユーザー定義のEnum(EnumStringEncode)
<サンプルファイル>
<コード>
'InputText ・・・元場所:IkiAddin.ModFile
'InputTextUTF ・・・元場所:IkiAddin.ModFile
'InputTextShiftJIS・・・元場所:IkiAddin.ModFile
'宣言セクション※※※※※※※※※※※※※※※※※※※※※※※※※※※
'-----------------------------------
'元場所:IkiAddin.ModFile.EnumStringEncode
Public Enum EnumStringEncode
vbUTF8
vbUTF16
vbShiftJIS
End Enum
'宣言セクション終了※※※※※※※※※※※※※※※※※※※※※※※※※※※
Public Function InputText(ByRef FilePath As String, _
ByRef StringEncode As EnumStringEncode, _
Optional ByRef Delimiter As String = ",", _
Optional ByRef NewLine As String = vbCrLf) _
As Variant
'テキストファイルを読み込んで二次元配列として返す
'文字エンコーディングはUTF-8,UTF-16,ShiftJISから選択
'20240105 リファクタリング
'参考
'https://www.softex-celware.com/post/inputtext
'引数
'FilePath ・・・テキストファイルのフルパス
'StringEncode・・・文字エンコーディング
'[Delimiter] ・・・区切り文字
'[NewLine] ・・・改行文字(デフォルトでvbCrLf)
' 他vbLf,vbCrを設定可能
'処理
Dim Text As String
Select Case StringEncode
Case vbUTF8
Text = InputTextUTF(FilePath, "utf-8")
Case vbUTF16
Text = InputTextUTF(FilePath, "utf-16")
Case vbShiftJIS
Text = InputTextShiftJIS(FilePath)
End Select
'二次元配列に変換
Dim ListLines As Variant: ListLines = Split(Text, NewLine) '改行で区切る
Dim I As Long
Dim J As Long
Dim N As Long: N = UBound(ListLines, 1) + 1
Dim M As Long
Dim Line As String
For I = 0 To UBound(ListLines, 1)
Line = ListLines(I)
If InStr(Line, Delimiter) > 0 Then
M = WorksheetFunction.Max(M, UBound(Split(Line, Delimiter), 1) + 1)
End If
Next
Dim Output As Variant: ReDim Output(1 To N, 1 To M)
Dim TmpSplit As Variant
For I = 0 To UBound(ListLines, 1)
Line = ListLines(I)
If InStr(Line, Delimiter) > 0 Then
TmpSplit = Split(Line, Delimiter)
For J = 0 To UBound(TmpSplit, 1)
Output(I + 1, J + 1) = TmpSplit(J)
Next
Else
Output(I + 1, 1) = Line
End If
Next
'出力
InputText = Output
End Function
Private Function InputTextUTF(ByRef FilePath As String, _
ByRef UTF As String) _
As String
'テキストファイルを読み込む
'テキストファイルの文字エンコーディングはUTF-8,UTF-16を対象とする
'20231218
'引数
'FilePath・・・テキストファイルのフルパス
'UTF ・・・文字エンコーディング
'処理
Dim stream As Object: Set stream = CreateObject("ADODB.Stream")
stream.Type = 2 '2:テキストファイル
stream.Charset = UTF ' 文字エンコーディングを指定
stream.Open
stream.LoadFromFile FilePath
Dim Output As String: Output = stream.ReadText
stream.Close
'出力
InputTextUTF = Output
End Function
Private Function InputTextShiftJIS(ByRef FilePath As String) As String
'テキストファイルを読み込む
'テキストファイルの文字エンコーディングはShiftJISを対象とする
'20231218
'引数
'FilePath・・・テキストファイルのフルパス
'処理
Dim TmpText As String
Dim Output As String: Output = ""
Dim FileNo As Long: FileNo = FreeFile
Open FilePath For Input As #FileNo
Do Until EOF(FileNo)
Line Input #FileNo, TmpText
Output = Output & TmpText & vbCrLf
Loop
Close #FileNo
'出力
InputTextShiftJIS = Output
End Function
Comments