Excel VBAによるドキュメント作成者情報の取得と管理の技術的深掘り
Excel VBAを用いたシステム開発において、ファイルそのもののメタデータ(プロパティ)を操作・取得するニーズは非常に高いものです。特に「誰がこのファイルを作成したのか」「最終更新者は誰か」といった情報は、監査ログの作成や、共有ファイルにおける責任所在の明確化、さらにはドキュメントの自動整理といった実務運用において不可欠な要素となります。
本稿では、Excelの組み込みドキュメントプロパティ(BuiltinDocumentProperties)を活用し、ファイル作成者を取得する技術的な手法について、その仕組みから実装の勘所までを詳細に解説します。
組み込みドキュメントプロパティの概念と仕組み
Excelファイルには、ファイルそのものに付随する「プロパティ」という情報が格納されています。これは、セルに入力されたデータとは異なり、WindowsのファイルシステムやOfficeアプリケーションが独自に管理しているメタデータです。
VBAからこれらの情報にアクセスするために利用するのが「BuiltinDocumentProperties」コレクションです。これはWorkbookオブジェクトのプロパティとして提供されており、作成者(Author)、作成日時(Creation date)、最終更新者(Last author)など、Officeが標準で保持している情報をインデックスまたは名称で指定して取得できます。
この機能の最大の利点は、外部ライブラリを一切必要とせず、標準のExcelオブジェクトモデルのみで完結することです。これにより、配布先環境の依存関係を気にすることなく、堅牢なツール開発が可能となります。
GetObjectによる外部ファイル情報の非開示取得
通常、ファイルの情報にアクセスするには、そのブックを開く必要があります。しかし、業務システムにおいては「ファイルを開かずに情報を取得したい」という要件が頻繁に発生します。例えば、膨大なファイル群の中から特定の作成者が作成したファイルだけをリストアップしたい場合、一つずつ開いて閉じるという処理は、パフォーマンス面でもリソース面でも非効率です。
このような場合に有効なのが「GetObject」関数です。GetObject関数を使用すると、ブックをExcelアプリケーション上で完全に開くことなく、そのプロパティ情報のみにアクセスすることが可能です。これにより、画面のちらつきを抑え、処理速度を飛躍的に向上させることができます。
具体的には、GetObject関数の引数にフルパスを指定することで、そのファイルに対する「ドキュメントオブジェクト」をメモリ上に生成します。このオブジェクトに対してBuiltinDocumentPropertiesを呼び出すことで、ファイルを開かずにメタデータを抽出できるのです。
サンプルコード:ファイルを開かずに作成者を取得する実装
以下に、指定したフォルダ内の全Excelファイルから、開くことなく作成者と最終更新者を取得する実用的なサンプルコードを提示します。
Sub GetFileAuthorWithoutOpening()
Dim fso As Object
Dim folder As Object
Dim file As Object
Dim folderPath As String
Dim targetFile As Object
Dim docProps As Object
' 調査対象のフォルダパス
folderPath = "C:\SampleData"
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(folderPath)
' 結果出力用のシートを準備
Cells.Clear
Range("A1:C1").Value = Array("ファイル名", "作成者", "最終更新者")
Dim rowIdx As Long
rowIdx = 2
For Each file In folder.Files
' Excelファイルのみを対象とする
If LCase(fso.GetExtensionName(file.Path)) Like "xls*" Then
' GetObjectを使用してファイルを開かずに情報を取得
Set targetFile = GetObject(file.Path)
' BuiltinDocumentPropertiesから情報を抽出
' インデックス指定でも可能だが、名前指定が可読性が高く推奨
On Error Resume Next ' プロパティが存在しない場合の対策
Dim author As String
Dim lastAuthor As String
author = targetFile.BuiltinDocumentProperties("Author").Value
lastAuthor = targetFile.BuiltinDocumentProperties("Last Author").Value
On Error GoTo 0
Cells(rowIdx, 1).Value = file.Name
Cells(rowIdx, 2).Value = author
Cells(rowIdx, 3).Value = lastAuthor
' オブジェクトを解放(メモリリーク防止)
Set targetFile = Nothing
rowIdx = rowIdx + 1
End If
Next file
MsgBox "情報取得が完了しました。", vbInformation
End Sub
実務における注意点とベストプラクティス
この技術を実務で活用する際には、いくつかの重要な注意点があります。
1. エラーハンドリングの重要性
プロパティは、ファイルの保存環境や作成プロセスによっては「空」であったり、そもそもプロパティ自体が設定されていないケースがあります。そのため、上記のサンプルコードでも示している通り、「On Error Resume Next」を使用して、プロパティ取得時のエラーを回避する設計が必須です。
2. メモリリークへの配慮
GetObject関数を使用すると、バックグラウンドで一時的なインスタンスが生成されます。ループ処理の中でこれを繰り返す場合、適切に「Set targetFile = Nothing」を実行しないと、メモリが解放されず、大量のファイルを処理する際にExcelがフリーズする原因となります。
3. セキュリティ設定
GetObjectを用いたメタデータ取得は、マクロのセキュリティ設定やファイルの保護状態によってはアクセスが拒否されることがあります。特に、パスワード保護されたファイルや、読み取り専用で開く必要があるファイルに対しては、個別の挙動確認が必要です。
4. データの信頼性
BuiltinDocumentPropertiesの「作成者」は、Windows OSのユーザー名やOfficeのユーザー設定から自動的に付与されるものです。つまり、PCを共有している場合や、プロパティが手動で書き換えられた場合には、必ずしも「実際に作業を行った人物」とは一致しないという限界があることを理解しておくべきです。
技術的な洞察:なぜBuiltinDocumentPropertiesを使うべきか
多くの初心者は、ファイル情報を取得する際に「ファイルシステムオブジェクト(FSO)」を多用しがちです。確かにFSOを使えばファイルの作成日時や更新日時は取得できますが、肝心の「作成者」や「最終更新者」といったOffice独自のメタデータにはアクセスできません。
BuiltinDocumentPropertiesは、Excelの内部構造に深く食い込んだプロパティであり、この情報を活用することで、単なるファイル管理を超えた「ドキュメントライフサイクル管理」が可能になります。例えば、特定のプロジェクト管理者が作成したドキュメントだけを自動でアーカイブする、あるいは、誰が最後に更新したかを確認して承認フローを回すといった高度な自動化が、極めて短いコードで実現できるのです。
まとめ:効率的なドキュメント管理の実現に向けて
Excel VBAにおけるドキュメントプロパティの制御は、一見すると地味な機能に思えるかもしれません。しかし、GetObjectと組み合わせることで、ファイルを開くという重い処理を回避しつつ、ファイル管理に必要なキー情報を高速に抽出できる強力な武器へと変貌します。
エンジニアとして重要なのは、単に「コードが動くこと」だけではありません。処理のパフォーマンス、メモリ管理、そして予期せぬエラーに対する耐性を考慮した設計を行うことです。本稿で解説した手法は、大規模なファイルサーバー内の整理、監査対応、社内システムの自動化において、即戦力となる技術です。
ぜひ、日々の業務改善やツール開発において、このドキュメントプロパティ操作を積極的に活用してください。適切な設計と実装を行うことで、あなたの開発するVBAツールは、よりプロフェッショナルで信頼性の高いものへと進化するはずです。
