goo blog サービス終了のお知らせ 

パソコンカレッジ スタッフのひとりごと

パソコンスクールのスタッフが、
初心者から上級者まで役立つ情報をお伝えします。

任意のフォルダ内のファイルをすべて取得する方法(Excel2002以降)

2010-07-29 09:01:30 | ExcelVBA
今日は、クライアントさんからの質問を取り上げます。

その質問とは、
「あるフォルダの中にあるファイル名を全部取得したいのですが、
エクセルで、そんな事は出来ますか?」
というものです。

エクセルの上で動作しているVBAというプログラミング言語は、なかなか立派なものです。

エクセル特有の操作はもちろん、エクセルに関係ないような機能もカバーしています。

今回のような、いわゆるファイル操作に関しても、ちゃんと対応しているのです。


例として、パス(ファイルやフォルダのコンピュータ内での住所のこと)を
Iドライブの「ワード資料」というフォルダということにして、そのフォルダ内のファイル一覧を取得してみます。

ちなみに、上記のパスは、「I:\ワード資料」 と書きます。


それでは、さっそく、VBAでコーディングしてみましょう。


エクセルを起動したら、Altキーを押しながらF11キーを押します。
すると、Visual Basic Editorが起動します。

コードを記述するモジュールが必要なので、「挿入」→「標準モジュール」とクリックします。






これで、用意ができました。

おっと、大事なことを忘れていました。
今回のように、ファイル操作を扱うときは、「ファイルシステムオブジェクト」を使うと便利です。

ところが、この機能は、初期設定では使用できるようになっていません。

ですから、まず、この機能を使えるようにすることが必要なのです。

具体的には、次のようにします。

「ツール」→「参照設定」とクリックします。





参照設定ダイアログボックスが表示されたら、一覧を下にスクロールして、「Microsoft Scripting Runtime」に
チェックを入れてください。

そして、OKボタンを押します。

これで、「ファイルシステムオブジェクト」を使用する準備ができました。

この作業が大切ですので、忘れずにお願いします。






それでは、コードを記述しましょう。


---------------------------------------------------


Sub ファイルの取得()
    'サブルーチンを使って、
    '指定したフォルダの中のファイル名を取得
    
    Dim MyPath As String
    
    '変数に、フォルダのパスを代入
    MyPath = "I:\ワード資料"
    
  'サブルーチンの呼び出し
    GetFiles MyPath
    
End Sub

Private Sub GetFiles(FolderPath As String)
    '引数付のサブルーチン
    '引数は、フォルダーのパス
    Dim FSO As New FileSystemObject
    Dim Files As Files
    Dim File As File
    
    'まず、フォルダのパスをA列1行目に書く
    Range("A1").Value = FolderPath
    
    '引数で指定されたフォルダの中のファイル一覧を取得
    Set Files = FSO.GetFolder(FolderPath).Files
    
    'ファイル一覧から順次ファイル名を取得し、A列に書き出す
    For Each File In Files
        Range("A65536").End(xlUp).Offset(1).Value = File.Name
    Next
    
End Sub



---------------------------------------------------

画像も載せておきます。






今回は、サブルーチンを使用してみました。

プログラムの中で、別のプログラムを呼び出すのです。

subで始まるプロシージャが2つあることにお気づきでしょうか。

ひとつのプロシージャがとても長くなってしまうことがあります。

そんなときは、処理のまとまりごとにプロシージャを作成して、それを呼び出します。

そのほうが、分かりやすいし、使い回しがきくものです。ここら辺の感覚は、コードを書いていくと自然と身に付きます。

今回のサブルーチンは、引数(パラメータ)を持っています。

慣れてくると、大変便利な記述法ですよ。

つまり、パスを引数として与えてあげれば、とにかく、そのパスの中のファイル一覧を取得できるのです。

融通がきくんですよ。

書き方としては、プロシージャ名のあとに半角スペースを入れて、パラメータを書きます。シンプルですね。

今回は、引数に "I:\ワード資料" というパスを指定していますが、
この部分を自分のパソコンの任意のパスに変更すれば、それだけで、そのパスのファイル一覧を取得することができます。


処理の内容としては、繰り返し処理で、ファイルシステムオブジェクトを使って取得したファイル群を
ひとつずつ取り出して、ファイル名をA列に書き込んでいるのです。



それでは、エクセルに切り替えて、実行してみましょう。

Altキーを押しながらF8キーを押します。

マクロダイアログボックスが表示されます。

実行ボタンを押してみます。




実行すると、シートのA列に、ファイル名が表示されます。

エクセルでも、こんなことができるんですよ。





もし、指定したパスにあるファイルのうち、エクセルファイルだけを取得したければ、

ファイル名の拡張子が、.xls  という条件を追加すればよいでしょう。

(エクセル2007ファイルも取得したければ、.xlsx も条件に入れてください)


さて、次回は、取得したエクセルファイルを逐一開いて、ある処理をするというケースを取り上げます。
お楽しみに。



だい

コメント (4)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« バックアップしたメールの復... | トップ | 過去のお勧め記事 »
最新の画像もっと見る

4 コメント

コメント日が  古い順  |   新しい順
できるんですね! (あんじ)
2010-07-30 00:13:09
以前仕事でフォルダ内のファイル名をエクセルに書き出したい~と思ったことがあったのですが、
やっぱりできるんですね~!
そのときはひたすらコピペした気がします;;
返信する
こんばんは。ご無沙汰致しております。 (うつらうつら)
2010-07-30 00:20:06
ファイルシステムオブジェクトとFor Eachを使って…となると、かなり高等な事ができますよね。

VBスクリプトやJスクリプトでテキストに吐かせて使っていた事もあります。

この方法だと、テキストをエクセルに取り込む必要がないので、便利ですね(^^)
返信する
あんじさんへ (dai)
2010-08-03 12:39:09
コメントありがとうございます。

今後も、役に立つ情報をご提供できればと思っています。

これからもよろしくお願い申し上げます。
返信する
うつらうつらさんへ (dai)
2010-08-03 12:41:31
さすが、やり手ですね。

できるということがすばらしいですね。

これからもよろしくお願い申し上げます。

返信する

コメントを投稿

ExcelVBA」カテゴリの最新記事