lisz-works

プログラミングと興味を貴方に

VBA ファイルクラスに入力も足してみた

【スポンサーリンク】

Excel ロゴ

先日投稿した、VBAのファイルを扱うためのクラスに、入力処理を足してみました!

www.lisz-works.com

「書くんじゃなくて読込みもしたいんだが」

という方、ご覧下さいませ!

ファイル管理クラス

ファイルの読込みを追加したので、晴れて

「ファイル出力用クラス」から「ファイル管理クラス」へグレードアップです!

コチラがソースの全文です。

前回との差分は、「readFile関数」くらいですね。

Option Explicit

Const COPEN_TYPE_NONE = 1000
Const COPEN_TYPE_INPUT = 1001
Const COPEN_TYPE_OUTPUT = 1002
Const COPEN_TYPE_APPEND = 1003

Public OPEN_TYPE_NONE As Integer
Public OPEN_TYPE_INPUT As Integer
Public OPEN_TYPE_OUTPUT As Integer
Public OPEN_TYPE_APPEND As Integer

Public fileName As String           ' ファイル名
Public openType As Integer          ' ファイルオープンタイプ
Public isInitialized As Boolean     ' 初期化完了フラグ
Public fileNo As Integer

' コンストラクタ
Private Sub Class_Initialize()
    OPEN_TYPE_NONE = COPEN_TYPE_NONE
    OPEN_TYPE_INPUT = COPEN_TYPE_INPUT
    OPEN_TYPE_OUTPUT = COPEN_TYPE_OUTPUT
    OPEN_TYPE_APPEND = COPEN_TYPE_APPEND
End Sub


' 初期化処理
Public Sub Initialize(fname As String, openType As Integer, fileNo As Integer)
    fileName = fname
    isInitialized = True
    Me.fileNo = fileNo
    
    Select Case openType
    Case COPEN_TYPE_INPUT
        Open fileName For Input As #Me.fileNo
        Me.openType = COPEN_TYPE_INPUT
    Case COPEN_TYPE_OUTPUT
        Open fileName For Output As #Me.fileNo
        Me.openType = COPEN_TYPE_OUTPUT
    Case COPEN_TYPE_APPEND
        Open fileName For Append As #Me.fileNo
        Me.openType = COPEN_TYPE_APPEND
    Case Else
        isInitialized = False
        Me.openType = COPEN_TYPE_NONE
    End Select
End Sub

' 書き込み処理
Public Sub writeFile(text As String)
    If Me.openType <> COPEN_TYPE_OUTPUT And Me.openType <> COPEN_TYPE_APPEND Then
        Exit Sub
    End If
    Print #Me.fileNo, text
End Sub

' 読み込み処理
Function readFile()
    If Me.openType <> COPEN_TYPE_INPUT Then
        Exit Function
    End If
    If EOF(Me.fileNo) Then  ' EOF検知
        readFile = "[EOF]"
        Exit Function
    End If
    
    Dim buf As String
    Line Input #Me.fileNo, buf
    readFile = buf
End Function


' デストラクタ
' NothingのSet時に発生する
Private Sub Class_Terminate()
    If isInitialized Then
        Close #Me.fileNo
    End If
End Sub

クラスの使い方

それでは使い方について書いていきます。

「生成と初期化」、「出力」、「終了処理」についての詳細は、コチラをご覧ください!

www.lisz-works.com

読込みの方法

まずは「生成と初期化」を行います。

このとき、Initializeのファイルオープンタイプは、「OPEN_TYPE_INPUT」としてください。

' 生成と初期化
Dim file As FileManager
Set file = New FileManager
Call file.Initialize("入力ファイル.txt", file.OPEN_TYPE_INPUT, 1)

readFile関数」をコールして、読込みを行います。

Dim str As String
str = file.readFile

これで1行読み込まれます。

読込イメージ

例えば、入力ファイルの内容が

AAA
BBB
CCC

のとき、readFileを3回実行すると

Debug.Print (file.readFile)
Debug.Print (file.readFile)
Debug.Print (file.readFile)

--- 出力 ---
AAA
BBB
CCC

となります。

最終行以上読込んだ場合

readFileは、ファイルの終わり*1をチェックしています。

現在はファイルの終端で実行した場合、「[EOF]」という文字列を返すようにしてます。

なのでこのようにすれば、ファイルを全て読込むことができます。

' 生成と初期化
Dim file As FileManager
Set file = New FileManager
Call file.Initialize("file.txt", file.OPEN_TYPE_INPUT, 1)

Dim str As String
Do While True
    str = file.readFile
    If str = "[EOF]" Then
        Exit Do
    End If
    Debug.Print str
Loop

これで読み込んだファイルの内容が、全て出力されますよ!

参考ページ

コチラのページを参考にさせて頂きました!

ありがとうございます!

Office TANAKA - Excel VBA講座:ファイルの操作[テキストファイルを操作する]

Office TANAKA - Excel VBA関数[EOF関数]

あとがき

これでファイル入出力が、少し楽になるかと思います。

ファイルの入力も出力も、サクサク作っちゃいましょう!

*1:EOF