やろまい

国立院卒の理系君。仕事でマクロ(VBA)の開発請負をやってます。金融と投資の事も。引用はご自由に。

【VBAメモ】FSOで扱うオブジェクトが多いので整理してみた

FSO(FileSystemObject)はファイルやフォルダを扱うための便利なオブジェクトです。

 

時々使っているのですが、参考サイトのコピペで済ませていたので、一度整理して理解することにしました。

 

FSOはフォルダ内のファイル一覧(orフォルダ一覧)を取得するのに便利です。

このマクロを確認したところ、

  • FSOで使用されるオブジェクトが3つ
  • コレクションが1つ

使用されていて、これが理解の妨げになっていることが分かりました。

 

今回は、FSOのマクロでどのようなオブジェクト+コレクションが使われているのかを整理したいと思います。

 

こんな人に向けた記事です。

  • FSOについて知りたい
  • FSOのオブジェクトがよくわからない
  • ファイル一覧を取得する方法が知りたい

 

フォルダ内のファイル一覧を取得するマクロ

はじめにサンプルプログラムを紹介します。

プログラムはTipsfoundさんのVBA ファイルの一覧を取得の記事を参考にしています。

Sub getFilesName()

  Dim fso As FileSystemObject
  Set fso = New FileSystemObject 'ファイルシステムオブジェクトの生成

  Dim objFolder As Folder
  Set objFolder = fso.GetFolder("C:\") 'フォルダオブジェクトを取得

  Dim objFile As file
  For Each objFile In objFolder.Files 'objFolder.Files:ファイルコレクション
    Debug.Print (objFile.Name) ' ファイル名の表示
  Next

  Set fso = Nothing

End Sub

実行するとCフォルダ直下のファイル一覧が、イミディエイトウィンドウに表示されます。

※実行にはMicrosoft Scripting Runtimeライブラリにチェックが必要

 

オブジェクトを分かりやすくするため、fso以外のオブジェクト変数はobj〜という名前にしています。

 

使用したオブジェクト+コレクション

使用したオブジェクトは次の3つです。

  1. fso:ファイルシステムオブジェクト
  2. objFolder:フォルダオブジェクト
  3. objFile:ファイルオブジェクト

 

それぞれ次の箇所でオブジェクトを取得しています。

  1. Set fso = New FileSystemObject
  2. Set objFolder = fso.GetFolder("C:\")
  3. For Each objFile In objFolder.Files

 

1. 2.は簡単なのですが、3.が少々分かりにくいと思います。

 ポイントはinの後のobjFolder.Filesであり、その中のFilesプロパティです。

 

Filesプロパティとは

Filesプロパティは

フォルダオブジェクト.Files

の形で使用します。

 

Filesプロパティはフォルダ内のすべてのファイルをコレクションとして返します。

 

コレクションは色々なものを集めたものです。

f:id:hamahiro881477:20201123093828p:plain

つまりobjFolder.Filesは、objFolder内の全ファイルの集まりです。

 

このコレクションからFor Eachで1つずつファイルを取り出しています。

For Each objFile In objFolder.Files

※1つずつobjFileに格納される

 

ここまでできれば、あとはobjFile.Nameとしてファイル名を取得すれば目的が達成できます。

 

FSOのオブジェクトは分かりにくいところがありますが、この3つのオブジェクトとコレクションを覚えておけば理解は容易いと思います。