和風スパゲティのレシピ

日本語でコーディングするExcelVBA

FileSystemObject入門-参照設定と変数宣言

ファイル・フォルダ操作の便利ツール「FileSystemObject」を使うためには、
以下の2つの事前準備が必要になります。

  1. Microsoft Scripting Runtime を参照設定する
  2. FileSystemObjectをオブジェクト変数にSetする


この2つの設定方法を解説していきます。

◇ FileSystemObject入門シリーズ
【1】FileSystemObjectとは - Dir関数群との違い
【2】参照設定と変数宣言(本記事)
【3】ファイル一覧の取得
【4】すべての下層フォルダの取得
【5】FileSystemObjectって何が便利なの?

Microsoft Scripting Runtime の参照設定

FileSystemObject(以下FSOと略記します)はVBAの標準機能ではないため、
まずはライブラリの参照設定を行う必要があります。

拡張機能をダウンロードするようなものだと思ってください。


FSOが載っているライブラリの名前は「Microsoft Scripting Runtime」で、
以下の手順で参照設定を行うことができます。


1.VBEのツールバーより「ツール ⇒ 参照設定」を選択
ツール⇒参照設定


2.参照設定ウィンドウにて「Microsoft Scripting Runtime」を探す
Microsoft Scripting Runtimeを探す
※ アルファベット順です。真ん中のあたりにあります。


3.レ点チェックを入れて「OK」
Microsoft Scripting Runtimeにチェックを入れてOK


以上で参照設定が完了します。簡単ですね。


この参照設定はブックごとの設定になりますので、
FSOを使用するブックはすべてこの設定を行ってください。



慣れれば10秒かからず設定できると思いますが、
「Microsoft Scripting Runtime」を探すのがちょっと面倒です。


この対策として、
既に参照済みのブックを開いていると選択肢が最上部に移動する
という仕様を覚えておきましょう。


Scripting Runtimeを参照した別のブックを開いていると、
↓のように、レ点はないけどすぐそこにある状態になります。
別ブックのScripting Runtime参照がある場合

これなら2~3秒で設定が終わります。


特に「個人用マクロブック」など常に開くブックで参照しておくと、
常時この状態になってとても便利です。

FileSystemObjectサンプルコード集.xlsm」みたいなファイルを作り、
コピペ用コード 兼 参照設定の補助に使うのも良さそうですね。


またScripting RuntimeはFSO以外に「Dictionary」でも使うため、
もう開き直ってすべてのマクロブックで参照してしまうというのもアリです。


ファイル・フォルダ操作をよく行う方は、
参照設定を楽にする方法も考えてみてください。

FileSystemObjectのオブジェクト変数へのSet

基本形

FileSystemObjectは「便利ツール集」のようなもので、

If FSO.FileExists("~~\Book1.xlsx") Then

このような使い方をします。


イメージとしては、

WorksheetFunction.VLookup(~~)
WorksheetFunction.CountIf(~~)

このWorksheetFunctionと同じものと思って下さい。

「.」の後に使う関数(メソッド)名を書くことで動くのは一緒です。


ただし、FileSystemObjectは標準機能ではないため、
FSOという親オブジェクトは自分で変数宣言する必要があります。


その変数宣言がこちらになります。

' FileSystemObjectの変数Set部分
Dim FSO As New FileSystemObject

' 以降はFSO.から各機能を呼び出して使える

' 例:フォルダが無かったらフォルダを作成
If FSO.FolderExists("~~\~~\~~") = False Then
    FSO.CreateFolder "~~\~~\~~"
End If

変数宣言ということで、Newがある以外はおなじみのDimですね。


この

Dim FSO As New FileSystemObject

というコードを書くことで、
以降はFSO.からFileSystemObjectの各メソッドを使用できるようになります。



ちなみにこのコードは、ScriptingRuntimeの参照が終わっていれば、
NewからのFileSystemObject入力
このようにNew f まで打てばあとはTabキーで入力できます。

Newとfだけ覚えておけばOKですね。



なお、これは自分が宣言する変数ですので、

Dim X As New FileSystemObject

でももちろん動きます。


が、短縮するにしてもせめてFSにするなど、
FileSystemObjectだとわかる名前にしておきましょう。

宣言を楽にする方法

変数宣言は1行とはいえ、FSOを使う全プロシージャで宣言するのは面倒です。


この対策として、Public変数を使いまわすという方法があります。

' Public変数として宣言(Subの外で宣言)
Public FSO As New FileSystemObject

' サンプルマクロ1
Sub ファイルコピーを行うマクロ

    FSO.CopyFile コピー元ブック.FullName _ 
                        コピー先フォルダパス & "\" & コピー元ブック.Name
    ' ↑いきなり「FSO」と書き出してOK

End Sub

' サンプルマクロ2
Sub フォルダ作成を行うマクロ

    FSO.CreateFolder フォルダパス
    ' ↑別のSubプロシージャで使いまわしてもOK

End Sub

同じ変数「FSO」を2つのSubプロシージャで使っていますね。


このように、変数は「最初のSubより上」でも宣言することができます。


この宣言を行った場合は、

↓のどちらかの書き方をした場合は「そのモジュール内」、

Dim FSO As New FileSystemObject
Private FSO As New FileSystemObject


↓の書き方をした場合は「ブック内のすべてのプロシージャ

Public FSO As New FileSystemObject

で使いまわせる変数を宣言することができます。


前者を「モジュール(レベル)変数」、
後者を「パブリック変数」と呼びます。


今回のFSOの宣言はPublicを使った後者で行っていますので、
後はブック内どこでも「FSO」という変数を使えるようになる
ということになります。



普通の変数でモジュール変数やパブリック変数を使うのは危ないので、
もし使う場合は慎重に扱う必要があります。
(すべてのマクロの「i」を連動させると恐ろしいことになるのは想像できると思います)


ですがFSOは「.」後のメソッドを使うための変数でしかありませんので、
FileSystemObjectはすべてのマクロで同じ変数を使って問題ありません。


この方法なら宣言もだいぶ楽になると思います。
この書き方ができるというのは覚えておきましょう。


FileSystemObjectの参照設定と変数宣言をまとめると、

  • ツール ⇒ 参照設定 ⇒ Microsoft Scripting Runtimeにチェック
  • どこかのモジュールで Public FSO As New FileSystemObject

の2つだけをやればいいということですね。

その他の宣言方法

自分で使用する際は上記の書き方で十分ですが、
FileSystemObjectは以下の方法でも使用できます。


他の人のコードを読むときに必要かもしれませんので、
余裕があれば流し読みしてみてください。

Dim → Set+New の2行で宣言するコード

FileSystemObjectの変数を宣言する

Dim FSO As New FileSystemObject

こちらのコードは、

Dim FSO As FileSystemObject
Set FSO = New FileSystemObject

このように2行になっていることもあります。


これはとりあえず同じものと思っておいてOKです。


ざっくり説明すると、

  • 厳密には2行宣言の方が正しい書き方
  • 自作クラスを作る場合は違いを正確に知る必要がある
  • FileSystemObjectについては1行で問題ない

という感じです。


一応解説記事も貼っておきますが、「FSOは1行OK」と知っておけば十分です。
クラスモジュールに触るくらいになったらまた思い出してください。
www.limecode.jp


なお、この2行のうち「Set」はSubの外に書けませんので、

Public FSO As New FileSystemObject

この「Public変数の使いまわし」は1行バージョンでしか書けません。
 

CreateObject("Scripting.FileSystemObject")で宣言するコード

FileSystemObjectを使用しているマクロで、

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

こんなコードを見かけたことがあるかもしれません。


これでもFileSystemObjectの変数をSetすることができ、
この後のコードはまったく同じものを使うことができます。


冒頭でScriptingRunTimeの参照設定を、
「拡張機能をダウンロードするようなもの」と説明しました。


それに対してこのCreateObjectを使っているコードは、
拡張機能をその場でダウンロードするコード」みたいなものだと思ってください。

このコードを使った場合は「ScriptingRunTimeの参照設定」が不要になります。


しかしデメリットとして、
コードを書く段階ではVBAさんがFileSystemObjectの存在を認識できないため、

FileSystemObjectのメンバー候補

この選択肢が出なくなります。



さてこのメリットデメリットを踏まえどちらのコードを採用するかですが、
これからFSOを勉強する方は絶対に参照設定を行ってください。


なぜなら「選択肢が出せることがFSOのメリット」と言っても過言ではないからです。


ざっくり説明すると、

  • FSOがDir系列に比べて優れているのはファイルやフォルダを「オブジェクトとして扱える」こと
  • 「オブジェクトとして扱う」ことと「.から候補を選べる」ことは密接な関係がある

という感じです。


このFSOの特長「オブジェクトで扱う」については以下で詳しく解説しています。

なぜDirではなくFSOを使うのか」を知っておきたい方は、
是非こちらの記事をご覧ください。
www.limecode.jp


最後に用語の定義にも触れておきます。

この2つは「参照設定を事前にやるか、実行してからやるか」の違いということで、

  • VBE上(ツール⇒参照設定)で設定することを「事前バインディング」、
  • コード上(CreateObject)で設定することを「遅延(実行時)バインディング」

と呼び分けます。

余裕があれば覚えてみてください。



以上でFileSystemObjectの参照設定と変数宣言の解説を終わります。


まとめると、

  • ツール⇒参照設定⇒Microsoft Scripting Runtimeにレ点
  • どこかのモジュールでPublic FSO As New FileSystemObject

の2つだけをやればいいということでしたね


最初は少しハードルが高く感じるかもしれませんが、慣れれば簡単な作業です。

FileSystemObjectの勉強ついでに、頑張って覚えてしまってください。

◇ FileSystemObject入門シリーズ
【1】FileSystemObjectとは - Dir関数群との違い
【2】参照設定と変数宣言(本記事)
【3】ファイル一覧の取得
【4】すべての下層フォルダの取得
【5】FileSystemObjectって何が便利なの?

おまけ:CreateObjectの本当のメリット

先ほどCreateObjectのメリットを「参照設定をしなくて済む」と説明しましたが、
これは自分で書く上ではメリットにはなりませんでした。


ではCreateObject(遅延バインディング)の本当のメリットは何かというと、
コードをコピペするだけで動くこと」です。

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

この宣言を使って書いたコードは、参照設定を知らなくても動かすことができます。


よって、

  • FileSystemObjectを知らない人にコードだけを渡す
  • 中身を見なくてもCallするだけで使える汎用関数を作る

ようなときは、こちらの書き方をする意味があります。


つまり「配布」や「公開」に向いた書き方ということですね。

WEB上のコードにこっちの書き方が多いのは、この理由が大きいかもしれません。



なお、前述の通りScriptingRuntimeの参照設定はブックごとの設定ですので、
参照設定をして保存したブックはだれかに渡しても参照設定されたままです。

ここでいう「配布」とは、ソースコードを配布するという意味ですね。


マクロブックを配布する場合は参照設定版で問題ありませんのでご安心ください。