みなさまは片付け得意でしょうか?
私は片付けが非常に苦手です。。。
自分の部屋も、気づいたらいつもごちゃごちゃになっていきます。。。
実生活もそうですが、パソコンの中も同じように、
気づいたらごちゃごちゃになって、目当てのファイルを探すのも一苦労です。。。
同じような経験をされている方もおられるのではないでしょうか。
今回はそんな方々向けに、家庭用・仕事用、どちらでも使えるような
『フォルダ一覧化マクロ』を作っていきます。
パソコン内を整理する、というよりも、
ごちゃごちゃのままでも目当てのファイルを見つけ出す!という思想です♪
一緒に作って作業効率アップをしていきましょう!
【本記事の目標】
1.フォルダ・ファイル操作の下準備
2.検索フォルダのフルパスをマクロから入力
その1をまだ読まれていない方は、過去の投稿もご確認ください。
下準備
一覧表になるExcelシートを準備
まずは、検索したいフォルダのリンクを入力する場所と、検索した結果を書きだす一覧表のシートを準備しておきましょう。
検索したいフォルダは1つ、
検索結果としてはとりあえず ファイル名、ファイルのフルパス、拡張子、更新日時 を入力できるようにしておこうと思いますので、下記のようなシートを作っておきます。
シート名は『検索結果一覧』にしています。
メインのモジュール・プロシージャを準備
次にコードを入力するためのモジュールとプロシージャを準備しておきましょう。
モジュールやプロシージャの準備方法については、下記記事をご確認ください。
プロシージャについては今後増えていくかもしれませんが、
ひとまずメインとなる部分として下記のようなモジュール・プロシージャを作っておきます。
ファイル操作のオブジェクト FileSystemObject を準備
Excel VBAでファイルやフォルダを操作する場合、FileSystemObject(FSOと略することが多いです)を使うと非常に便利です。
FileSystemObjectの具体的な内容や使い方は後ほど説明しますが、そもそもこれを使うためには準備が必要です。
またその準備についても、
- 参照機能を使用する場合
- 参照機能を使用しない場合
の2つがあります。
それぞれの準備方法は次の通りです。
参照機能を使用する場合
参照機能を使用する場合、VBAの画面で『ツール』⇒『参照設定(R)』から【Microsoft Scripting Runtime】にチェックを入れておく必要があります。
これを実施しておけば、プロシージャ内でFileSystemObjectを使用する場合、下記のように定義を宣言し変数をセットすれば、FileSystemObjectを使用できるようになります。
Option Explicit
Sub FolderSearchMain()
'フォルダ検索のメイン部分
'参照設定を使用する場合(fso1は任意に設定OK)
Dim fso1 As Scripting.FileSystemObject
Set fso1 = New Scripting.FileSystemObject
End Sub
参照機能を使用しない場合
参照機能を使用しない場合、上記のような参照設定は不要です。
代わりに、プロシージャ内で定義を宣言する場合の表現が若干異なり、下記のようになります。
Option Explicit
Sub FolderSearchMain()
'フォルダ検索のメイン部分
'参照設定を使用しない場合(fso2は任意に設定OK)
Dim fso2 As Object
Set fso2 = CreateObject("Scripting.FileSystemObject")
End Sub
このように変数をセットすれば、FileSystemObjectを使用できるようになります。
参照機能を使用する場合・しない場合の違いとメリット・デメリット
定義の違い
参照機能を使用する場合に『参照設定(R)』から【Microsoft Scripting Runtime】にチェックを入れましたが、これによって変数のデータ形式としてFileSystemObjectをそのまま設定できるようになります。
なので、参照機能を使用する場合は
Dim fso1 As Scripting.FileSystemObject
という形でfso1という変数を定義できるようになっています。
『参照設定(R)』から項目にチェックを入れることで、VBAの拡張機能を追加することができます。今回の【Microsoft Scripting Runtime】も拡張機能の1つです。
このように『参照設定(R)』の項目にチェックを入れることで、通常では使えない機能も使えるようになります。他にもたくさんの拡張機能があるので、調べてみると良いかもしれません。
これに対し、参照機能を使用しない場合、このような変数の定義ができないので、一旦
Dim fso2 As Object
という形で、fso2はオブジェクトの1つですよ、と定義し、
Set fso2 = CreateObject(“Scripting.FileSystemObject”)
ここでFileSystemObjectというオブジェクトを作って(Createして)fso2に入れましたよ、と書く必要があるのです。
変数の定義の部分については、多少表記に違いがあり意味合いとしても違うのですが、書いてあるコードとしてはどちらも2行だけなので、ほとんど差がないように見えます。
ただ、一番大きな違いは「参照機能を使えるか」という点です。
(参照機能を使用する場合・しない場合と言ってますしね)
参照機能とは
参照機能のいうのは、ExcelVBAに備わっている入力補助機能のことです。
例えば変数を定義するとき、
Dim A as
まで入力すると、下記のようにウィンドウが出てくると思います。
これが参照機能です。
一度、プロシージャに参照設定をする場合・しない場合の両方の変数の宣言をした状態(下記状態)で、
fso1.
fso2.
と入力してみて下さい。
Option Explicit
Sub FolderSearchMain()
'フォルダ検索のメイン部分
'参照設定を使用する場合(fso1は任意に設定OK)
Dim fso1 As Scripting.FileSystemObject
Set fso1 = New Scripting.FileSystemObject
'参照設定を使用しない場合(fso2は任意に設定OK)
Dim fso2 As Object
Set fso2 = CreateObject("Scripting.FileSystemObject")
fso1.
fso2.
End Sub
fso1. を入力したときは、下記のように入力補助画面が出てきたと思いますが、
fso2. を入力したときは出てこなくなったと思います。
この入力補助機能は、Excel VBA初心者には非常にありがたい機能です。
これを使えば入力内容の間違いによるエラーも防げますし、
そもそも、今書いているコードの後ろに、次にどんなコードを書くことができるのか
を知ることができるので、非常に勉強になります。
メリット・デメリット
・じゃあ参照機能を使用する場合だけ知ってたら良いじゃないか。
・参照機能を使用しない場合なんて無いんじゃないの?
と思われるかもしれませんが、参照機能を使う場合にもデメリットはあります。
それは『参照設定』での設定が必ず必要になる、という点です。
正直デメリットというほどではないですが、
『参照設定(R)』にデフォルトと異なる項目にチェックが入ったマクロを複数人で受け渡ししたり、そのファイルを見て解読して自分でマクロを作ろうとしたとき、『参照設定(R)』という存在を知らないと、モジュールやプロシージャだけを確認してもエラーの原因が分からなくて詰んでしまいます。
なので、
・参照機能を使用する場合は『参照設定』での設定が必ず必要になる
・他人からもらったマクロを解読するとき『参照設定』を確認する
ということさえ覚えておけば、
「参照機能を使用する場合」の方法でコードを書いていくのがオススメです。
参照機能を使用する場合 | 参照機能を使用しない場合 | |
メリット | コード入力時に入力補助機能が出てくる | 『参照設定』を設定せずに FileSystemObjectが使用可能 |
デメリット | 『参照設定』で 【Microsoft Scripting Runtime】の チェックが必要 | コード入力時に入力補助機能が出てこない |
下準備は以上で完了です。
ではメインの実行部分のコードを書いていきましょう!
検索したいフォルダのリンクを入力
フォルダのリンクを入力するマクロを作る
検索したいフォルダのリンクは、検索フォルダの欄(B1セル)に手入力してもいいのですが、せっかくなのでマクロから入力できるようにしておきましょう。
メインのモジュールとプロシージャを作ったところですが、さっそくもう1つモジュールとプロシージャを作りましょう。
ダイアログを表示してフォルダを選択
検索したいフォルダを選択するとき、普段のファイルを開くときと同じように、下記のようなダイアログが表示された方がイメージがしやすいかと思います。
このようなダイアログを表示する場合にオススメなのが FileDialog です。
FileDialogは非常に機能が多く、ファイル選択やフォルダ選択の際に色々な情報を取り出せるので、使いこなせると非常に便利です。
FileDialogはApplicationのオブジェクトです。
なので、実際に使用する場合は下記のような書き方になります。
Application.FileDialog(msoFileDialogFolderPicker).Show
上記はフォルダを選択するダイアログを表示します。
FileDialogの後ろのカッコ内を書き換えることで、フォルダの選択 or ファイルの選択 を切り替えることができます。
・フォルダを選択するダイアログ:msoFileDialogFolderPicker
・ファイルを選択するダイアログ:msoFileDialogFilePicker
また、上記は単純にダイアログを表示するだけです。
ダイアログを表示した場合は通常、
・フォルダを選択する
・キャンセルがクリックされる
のどちらかの動きがされます。
「フォルダを選択する」動きがされた場合、「Application.FileDialog(msoFileDialogFolderPicker).Show」これには『Ture』が返され、
「Application.FileDialog(msoFileDialogFolderPicker).SelectedItems」に選択したフォルダのフルパスが記録されます。
(※基本的に配列で記録されます)
逆に言うと、
「Application.FileDialog(msoFileDialogFolderPicker).Show」これに『Ture』が返されなかった場合は、「キャンセルがクリックされる」動きがされたことになります。
上記を踏まえてダイアログを表示してフォルダを選択するマクロは下記のようになります。
Option Explicit
Sub SearchFolderLinkInput()
'検索したいフォルダのリンクを入力するマクロ
'変数の定義
Dim FilePath1 As String '選択したフォルダのフルパスを入れる変数
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then 'フォルダが選択された場合に実行(キャンセルの場合は何もしない)
'1つのファイルのパスだけ入力したいので、SelectedItemsの(1)を指定
FilePath1 = .SelectedItems(1)
'検索結果一覧のシートのB1セルに選択したフォルダのフルパスを入力
ThisWorkbook.Sheets("検索結果一覧").Range("B1").Value = FilePath1
End If
End With
End Sub
あとはシートにボタンを作ってマクロを登録すれば、検索フォルダのリンクを入力するマクロの完成です。
(ボタンは、図形であれば何でも問題ないです。
図形を描いた後、図形で右クリック⇒マクロの登録 からマクロを選択したらOKです。)
次の記事では、選択したフォルダ内の直下のファイルやフォルダを検索するマクロを作っていきます。
次の記事へ
コメント