Excel VBA File Utility
ナビゲーションに移動
検索に移動
Excel VBA File Utility
FileUtil.cls
Option Explicit
Private Const INVALID_FILENO As Integer = -1
' 処理対象のファイル名を保持
Private m_Filename As String
' 処理中のファイル番号を保持
Private m_FileNo As Integer
'
' 初期化
'
Private Sub Class_Initialize()
Call setFileNo(INVALID_FILENO)
End Sub
'
' 終了処理
'
Private Sub Class_Terminate()
Call closeFile
End Sub
'
' ファイルが開かれているか
'
' @return 開かれていれば True
'
Public Function isOpen() As Boolean
isOpen = (getFileNo > 0)
End Function
'
' ファイルを開く
'
' @param fileName
' @param mode
' @return 成功した場合True
'
Public Function openFile(fileName As String, mode As FileMode) As Boolean
On Error GoTo errHandler
openFile = True
Call setFilename(fileName)
Call setFileNo(FreeFile)
Select Case mode
Case FileMode.InputMode
Open getFilename For Input As getFileNo
Case FileMode.OutputMode
Open getFilename For Output As getFileNo
Case FileMode.AppendMode
Open getFilename For Append As getFileNo
Case Else
openFile = False
End Select
Exit Function
errHandler:
openFile = False
End Function
'
' ファイルから1行読込む
'
' @param line 読み込んだ行を格納
' @return データがこれ以上ない場合False
'
Public Function readLine(ByRef line As String) As Boolean
Dim ret As Boolean
ret = Not isEOF()
If ret Then
Line Input #getFileNo(), line
End If
readLine = ret
End Function
'
' ファイルがEOFに達しているか
'
' @return ファイルがEOFに達している場合True
'
Public Function isEOF() As Boolean
isEOF = EOF(getFileNo())
End Function
'
' 出力(改行しない)
'
' @param str 出力内容
'
Public Sub print_(str As String)
Print #getFileNo(), str;
End Sub
'
' 1行出力
'
' @param str 出力内容
'
Public Sub println(str As String)
Print #getFileNo(), str
End Sub
'
' ファイルを閉じる
'
Public Sub closeFile()
Close getFileNo()
End Sub
'
' ファイル名の設定
'
' @param newFileName
'
'
Private Sub setFilename(newFileName As String)
m_Filename = newFileName
End Sub
'
' ファイル名の取得
'
' @param ファイル名
'
Public Function getFilename() As String
getFilename = m_Filename
End Function
'
' ファイルNoの設定
'
' @param ファイルNo
'
Private Sub setFileNo(newFileNo As Integer)
m_FileNo = newFileNo
End Sub
'
' ファイルNoの取得
'
' @return ファイルNo
'
Public Function getFileNo() As Integer
getFileNo = m_FileNo
End Function
標準モジュールに
'----------------
'ファイルモード
'----------------
Public Enum FileMode
InputMode = &H1&
OutputMode = &H2&
AppendMode = &H3&
End Enum
UTF-8 に対応
Option Explicit
'********************************************
'
'
' ファイルユーティリティクラス
' File関連のオブジェクト(ADODB.Stream)をラップ
'
'
' @see https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/stream-object-ado
'
'
'********************************************
Private Const INVALID_FILENO As Integer = -1
Private stream As Object
Private Const adTypeText = 2
Private Const adModeRead = 1
Private Const admodewrite = 2
Private Const adModeReadWrite = 3
Private Const adStateClosed = 0
Private Const adReadLine = -2
Private Const adCR = 13
Private Const adSaveCreateOverWrite = 2
' 処理対象のファイル名を保持
Private m_Filename As String
' 処理中のファイル番号を保持
Private m_FileNo As Integer
Private m_FileMode As FileMode
'
' 初期化
'
Private Sub Class_Initialize()
Set stream = CreateObject("ADODB.Stream")
'Call setFileNo(INVALID_FILENO)
End Sub
'
' 終了処理
'
Private Sub Class_Terminate()
Call closeFile
Set stream = Nothing
End Sub
'
' ファイルが開かれているか
'
Public Function isOpen() As Boolean
' https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/state-property-ado?view=sql-server-ver15
'isOpen = (getFileNo > 0)
isOpen = (stream.State <> adStateClosed)
End Function
'
' ファイルを開く
'
Public Function openFile(fileName As String, mode As FileMode) As Boolean
On Error GoTo errHandler
Dim isAppend As Boolean
isAppend = False
openFile = True
stream.Charset = CHAR_SET
stream.Type = adTypeText
'https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/lineseparator-property-ado
stream.LineSeparator = adCR
Call setFilename(fileName)
'Call setFileNo(FreeFile)
m_FileMode = mode
Select Case mode
Case FileMode.InputMode
'Open getFilename For Input As getFileNo
stream.mode = adModeReadWrite
stream.Open
stream.LoadFromFile fileName
Case FileMode.OutputMode
'Open getFilename For Output As getFileNo
stream.mode = adModeReadWrite
stream.Position = 0
stream.Open
Case FileMode.AppendMode
'Open getFilename For Append As getFileNo
stream.mode = adModeReadWrite
'stream.SetEOS = True
stream.Open
Case Else
openFile = False
End Select
Exit Function
errHandler:
openFile = False
Debug.Print Err.Number & ":" & Err.Description
End Function
'
' ファイルから1行読込む
'
Public Function readLine(ByRef line As String) As Boolean
Dim ret As Boolean
ret = Not isEOF()
If ret Then
'Line Input #getFileNo(), line
line = stream.ReadText(adReadLine)
End If
readLine = ret
End Function
'
' ファイルがEOFに達しているか
'
Public Function isEOF() As Boolean
'isEOF = EOF(getFileNo())
isEOF = stream.EOS
End Function
'
' 1行出力
'
Public Sub println(str As String)
'Print #getFileNo(), str
stream.writeText str
End Sub
'
' ファイルを閉じる
'
Public Sub closeFile()
'Close getFileNo()
If isOpen() Then
Select Case m_FileMode
Case FileMode.InputMode
Case FileMode.OutputMode
Call stream.SaveToFile(m_Filename, adSaveCreateOverWrite)
Case FileMode.AppendMode
Call stream.SaveToFile(m_Filename, adSaveCreateOverWrite)
Case Else
End Select
stream.Close
End If
End Sub
'
' ファイル名の設定
'
Private Sub setFilename(newVal As String)
m_Filename = newVal
End Sub
'
' ファイル名の取得
'
Public Function getFilename() As String
getFilename = m_Filename
End Function
'
' ファイルNoの設定
'
Private Sub setFileNo(newVal As Integer)
m_FileNo = newVal
End Sub
'
' ファイルNoの取得
'
Public Function getFileNo() As Integer
getFileNo = m_FileNo
End Function
© 2006 矢木浩人