FileAttr関数:ファイルシステムの深淵を覗くための技術的考察
VBA(Visual Basic for Applications)におけるファイル操作は、業務自動化の根幹を成す要素です。通常、OpenステートメントやInput/Output関数を使用してファイルを開き、読み書きを行う際、私たちは「そのファイルがどのような状態にあるのか」を正確に把握する必要があります。ここで登場するのがFileAttr関数です。
FileAttr関数は、Openステートメントで開かれたファイル番号に対して、その属性や状態を問い合わせるための組み込み関数です。一見すると地味な関数ですが、堅牢なファイル処理システムを構築する上では欠かせない、プロフェッショナルが好んで使用するツールの一つです。本稿では、この関数の仕様、戻り値の解釈、そして実務における応用テクニックについて、徹底的に解説します。
FileAttr関数の基本仕様と戻り値の構造
FileAttr関数の書式は極めてシンプルです。
FileAttr(filenumber, returntype)
ここで、filenumberにはOpenステートメントで使用したファイル番号を指定します。重要なのは第二引数のreturntypeです。この引数に指定する値によって、関数が返す情報が決定されます。
returntypeに「1」を指定した場合、そのファイルが「どのように開かれているか(ファイルモード)」が返されます。戻り値の詳細は以下の通りです。
・1: Inputモード(読み込み専用)
・2: Outputモード(書き込み専用・新規作成)
・4: Randomモード(ランダムアクセス)
・8: Appendモード(追記モード)
・32: Binaryモード(バイナリモード)
一方で、returntypeに「2」を指定した場合、OSレベルでのファイルハンドル番号が返されます。これは、Windows APIを直接呼び出して高度なファイル制御を行う際に不可欠な情報となります。
詳細解説:なぜFileAttrが必要なのか
多くの初心者は、Openステートメントでファイルを指定する際、単に「エラーが発生しなければ良い」と考えがちです。しかし、実際の業務環境では、複数のプロセスが同一ファイルにアクセスする可能性や、ネットワークドライブの不安定さなど、不確定要素が常に存在します。
例えば、ある特定の処理ルーチンが「Appendモードで開かれていること」を前提としている場合、誤ってInputモードで開かれたファイル番号を渡してしまうと、書き込み時にランタイムエラーが発生します。このような事態を未然に防ぐため、処理の入り口でFileAttrを用いてファイルモードを検証するガード節を設けることは、非常に優れたプログラミングプラクティスです。
また、Windows APIとの連携において、returntype 2が返すファイルハンドルは極めて重要です。VBAの標準機能では実現できない、ファイルの排他制御(ロック)や、高度なファイル情報取得を行う際、OS側の管理番号であるハンドルが必要になるケースが多々あります。この時、VBA管理下のファイル番号から、OSのハンドルを逆引きできるFileAttr関数の存在価値が最大限に発揮されます。
実務に耐えうるサンプルコードの実装
以下に、FileAttr関数を活用した、堅牢なファイル書き込みチェックのサンプルコードを提示します。このコードは、ファイルが意図したモードで開かれているかを動的に判定し、安全性を確保する設計となっています。
Sub SafeFileWriteDemo()
Dim fNum As Integer
Dim filePath As String
Dim currentMode As Integer
filePath = ThisWorkbook.Path & "\test_log.txt"
fNum = FreeFile
' ファイルを追記モードで開く
Open filePath For Append As #fNum
' FileAttr関数を使用してモードを検証
currentMode = FileAttr(fNum, 1)
' 期待されるモード(8: Append)と合致するか確認
If currentMode = 8 Then
Print #fNum, "ログ出力時刻: " & Now
Debug.Print "正常に書き込みました。"
Else
MsgBox "エラー: 予期せぬファイルモードです。モード値: " & currentMode
End If
' ファイルハンドル(OSレベル)の取得例
Dim osHandle As Long
osHandle = FileAttr(fNum, 2)
Debug.Print "OSファイルハンドル: " & osHandle
Close #fNum
End Sub
このサンプルでは、単にファイルを操作するだけでなく、実行直前にファイルの状態を検査しています。これにより、予期せぬ引数の混入や、関数の呼び出し順序の誤りによる致命的なエラーを回避しています。
プロフェッショナルな実務アドバイス
FileAttrを使用する上で、エンジニアが意識すべき点は「エラーハンドリングとの併用」です。FileAttrはあくまで「現在開かれているファイル番号」に対して有効な関数です。もし、ファイルが閉じられている(Close済み)状態でFileAttrを呼び出すと、実行時エラー52「ファイル名または番号が不正です」が発生します。
実務においては、以下のような設計を推奨します。
1. ファイルを開く前には必ずFreeFile関数を使用して、使用可能な番号を動的に割り当てる。
2. FileAttrを呼び出す前に、そのファイル番号が現在アクティブであることを管理するフラグや、エラーハンドラ(On Error GoTo)を適切に配置する。
3. Windows APIを併用する場合、ハンドルが「無効なハンドル(INVALID_HANDLE_VALUE)」を返していないかを必ずチェックする。
また、大規模なシステム開発においては、ファイル操作をクラスモジュール化し、そのクラス内で「現在のファイル状態(モード)」をプロパティとして保持させる手法が推奨されます。FileAttrは、そのクラスの状態をOSの真実と同期させるための強力な同期ツールとして機能します。
まとめ:VBAにおけるファイル管理の要石
FileAttr関数は、単なる状態取得関数ではありません。それは、VBAという抽象度の高い言語と、Windows OSという低レイヤーの実装の橋渡しをする重要なインターフェースです。
プロのエンジニアは、コードの「正常系」だけでなく、いかにして「異常系」を検知し、安全にプロセスを終了させるかに心血を注ぎます。ファイル処理において、現在開かれているファイルがどのような性質を持っているのかを即座に判定できるFileAttr関数の活用は、アプリケーションの信頼性を劇的に向上させます。
「VBAは簡易的なツールを作るためのもの」という認識は捨ててください。適切な関数を適切に使いこなすことで、VBAは非常に堅牢で、かつ拡張性の高い業務システムを実現するエンジンへと進化します。本稿で紹介したFileAttr関数の知見を、あなたの次なる開発プロジェクトにおける標準的な実装パターンとして組み込んでいただければ幸いです。ファイルというOSの資産を、より安全に、より正確に制御する技術を磨き上げてください。
