VBA(Visual Basic for Applications)を使用してファイルシステムの操作を行う際に重要な役割を果たすのがFileSystemObjectオブジェクトです。
この記事では、FileSystemObjectの基本的な機能や使い方に焦点を当てつつ、事前バインディングと実行時バインディングの選択においてもどのように利用されるかを解説します。
FileSystemObject オブジェクト
FileSystemObjectは、VBAでファイルシステムにアクセスするためのオブジェクトです。このオブジェクトは、ファイルやフォルダに対する様々な操作を実行できる便利なツールとして利用されます。
主に、ファイルの作成、削除、コピー、移動、フォルダの作成、削除などの操作を行う際に使用されます。
オブジェクトの型指定には主に事前バインディング(Early Binding)と実行時バインディング(Late Binding)の2つのアプローチがあります。
FileSystemObjectオブジェクトの操作
FileSystemObjectオブジェクトを使う場合、インスタンスを生成する必要があります。
生成方法は2つ。
- 事前バイディング(Early Binding)
- 実行時バイディング(Late Binding)
CSVファイルの最終行を調べる方法を例で、上記の違いを説明します。
このcsvファイルの最終行は「11」です。
事前バイディング・Microsoft Scripting Runtimeの参照設定
事前バインディングは、VBAでオブジェクトを使用する際に型が宣言時に解決されるアプローチです。
事前バインディングのメリット
- パフォーマンス向上
コンパイラが型を事前に解決するため、実行時のパフォーマンスが向上します。実行時に型の解決が行われないため、処理が高速になります。 - インテリセンスと補完
コード入力時にエディタがオブジェクトのメソッドやプロパティを補完できます。これにより、タイプミスを防ぎながら開発することができます。 - コンパイルエラーの検出
コンパイル時に型の不一致やメソッドの誤使用などのエラーが検出されるため、品質管理が向上します。
事前バインディングのデメリット
- ライブラリの変更に弱い
利用するライブラリやオブジェクトモデルに対する参照が必要であり、ライブラリの変更が発生するとコードの修正が必要となります。 - ファイルサイズ増加
参照設定によりライブラリがプロジェクトに組み込まれるため、ファイルサイズが増加します。 - 柔軟性の低下
型が事前に決まるため、柔軟性が低く、実行時に型を変更することが難しいです。
事前バインディングの例
New Scripting.FileSystemObject
(1)Microsoft Scripting Runtimeの参照設定を行います。
VBE>[ツール]>[参照設定]を選択します。
「Microsoft Scripting Runtime」にチェックを入れます。
(2)標準モジュールにコードを入力します。
Sub sample() Dim fso As New Scripting.FileSystemObject Dim fPath As String: fPath = "F:\sample\test1.csv" Debug.Print fso.OpenTextFile(fPath, 8).Line End Sub
実行結果です。
実行時バイディング
実行時バインディングは、VBAでオブジェクトを使用する際に型が実行時に解決されるアプローチです参照設定は必要ない方法です。
実行時バイディングのメリット
- 柔軟性
参照設定が不要で、ライブラリのバージョンに依存しないため、柔軟性が高まります。異なる環境で実行する際に、ライブラリの互換性の心配が少ないです。 - ライブラリの変更に強い
ライブラリの変更が容易で、新しいバージョンのライブラリを使用する際に変更が少なくて済みます。 - ファイルサイズの削減
ライブラリが実行時に解決されるため、プロジェクトのファイルサイズが減少します。
実行時バイディングのデメリット
- 実行時エラーの可能性
インテリセンスが制限され、オブジェクトのメソッドやプロパティが誤って使用される可能性が増します。これにより、実行時エラーが発生する可能性があります。 - パフォーマンス低下
実行時に型の解決が行われるため、事前バインディングに比べて実行時のパフォーマンスが低下することがあります。 - コードの可読性低下
型が宣言時にはっきりしないため、コードの可読性が低下します。他の開発者がコードを理解しやすくなるとは限りません。
実行時バイディングの例
CreateObject("Scripting.FileSystemObject")
こちらの方法では、自動メンバーが表示されません。
作成したマクロを自分以外の人が使う場合、参照設定する必要のない実行時バイディングの方が手間がかかりません。
Sub sample2() Dim fso As Object Dim fPath As String: fPath = "F:\sample\test1.csv" Set fso = CreateObject("Scripting.FileSystemObject") Debug.Print fso.OpenTextFile(fPath, 8).Line End Sub
実行結果です。
まとめ
VBAにおいて、オブジェクト型指定の方法として事前バインディング(Early Binding)と実行時バインディング(Late Binding)の2つがあります。
事前バインディングは開発プロセスの効率向上やエラーの早期発見に寄与しますが、ライブラリの変更に弱いというデメリットがあります。プロジェクトの要件や保守性、開発効率などを考慮して、事前バインディングか実行時バインディングかを選択する必要があります。
実行時バインディングは柔軟性があり、ライブラリの変更に強い一方で、パフォーマンスの低下や実行時エラーのリスクがあるため、プロジェクトの要件や開発スタイルによって選択されるべきです。