指定フォルダ内のファイル情報を配列格納「fileNameF」の解説
前回の「指定フォルダ内のファイル一覧(ファイル名)を取得「fileName」」では、フォルダ内のファイル名取得の制御方法について解説しましたが、今回は、ファイル情報を配列へ格納する方法について、説明していきます。
こちらは、ファイル名だけでなくフォルダ名やファイルのフルパス名などを取得したい場合に非常に便利な機能ですので、是非使ってみてください。
指定フォルダ内のファイル情報を配列格納するサブルーチン
Function fileNameF(Optional pathName As String = "myPath") As Variant()
If pathName = "myPath" Then: pathName = ActiveWorkbook.Path 'フォルダパス
'FileSystemObjectインスタンスを生成
Set objSFO = CreateObject("Scripting.FileSystemObject")
With objSFO.GetFolder(pathName & "\")
'要素数セット
Dim fileValue() As Variant
If .Files.Count > 0 Then
ReDim fileValue(.Files.Count - 1, 3)
Else
ReDim fileValue(.Files.Count, 3)
End If
i = 0
For Each objFile In .Files
fileValue(i, 0) = objFile.Name 'ファイル名
fileValue(i, 1) = pathName & "\" & objFile.Name 'ファイルフルパス名
fileValue(i, 2) = pathName 'フォルダパス名
fileValue(i, 3) = Mid(pathName, InStrRev(pathName, "\") + 1) 'フォルダ名
i = i + 1
Next
End With
Set objSFO = Nothing
fileNameF = fileValue()
End Function
指定フォルダ内のファイル情報を配列格納するマクロ
Sub sample()
Dim pathName As String
Dim fileData As Variant
pathName = ThisWorkbook.Path & "\file"
fileData = fileNameF(pathName)
r = 2
For i = 0 To UBound(fileData)
Cells(r, 1) = fileData(i, 0)
Cells(r, 2) = fileData(i, 1)
Cells(r, 3) = fileData(i, 2)
Cells(r, 4) = fileData(i, 3)
r = r + 1
Next
End Sub
実行結果
こちらの引数は以下の1つです。
引数名 | データ型 | 内容 | 値の事例 | 初期値 | 省略 |
---|---|---|---|---|---|
pathName | String | 取得するフォルダパス文字列 | "C:\Users\vba-ie\Desktop\vba-ie\file\" | ● |
引数は任意項目となります。
「pathName」には、ファイル名を抽出するフォルダのパスを入力します。
初期値は実行ファイルと同じフォルダ内のパスになります。
If pathName = "myPath" Then: pathName = ActiveWorkbook.Path 'フォルダパス
こちらでは、パス名の初期値を設定しています。
引数を指定している場合は、そちらが利用されます。
Set objSFO = CreateObject("Scripting.FileSystemObject")
フォルダを操作にするには、「FileSystemObjectオブジェクト」を利用します。
こちらではインスタンスを作成しています。
With objSFO.GetFolder(pathName & "\")
(省略)
End With
こちらでは、「Withステートメント」を利用してコードの省略化を行っています。同じオブジェクトを何度も記述する場合に非常に便利ですので、是非活用しましょう。
'要素数セット
Dim fileValue() As Variant
If .Files.Count > 0 Then
ReDim fileValue(.Files.Count - 1, 3)
Else
ReDim fileValue(.Files.Count, 3)
End If
こちらでは、配列の要素数を設定しています。
ファイル数は変動するため、一旦「Dimステートメント」で配列を宣言し、「ReDimステートメント」にファイル数の分だけ要素数に設定します。
ただし、こちらでは「Countプロパティ」で数を取得していますが、配列は0からですので、実際には1つ多く要素数が設定されてしまいます。
「正規表現で抽出したいデータを取得「regValue」」では、データ取得後に要素数を1減らす対応で行いましたが、こちらでは「IF~Thenステートメント」で対応していきます。
また、ファイル情報は複数あるので、多次元配列となっています。
i = 0
For Each objFile In .Files
fileValue(i, 0) = objFile.Name 'ファイル名
fileValue(i, 1) = pathName & "\" & objFile.Name 'ファイルフルパス名
fileValue(i, 2) = pathName 'フォルダパス名
fileValue(i, 3) = Mid(pathName, InStrRev(pathName, "\") + 1) 'フォルダ名
i = i + 1
Next
こちらは、ファイル情報を各配列へ格納する処理となります。
配列は4次元配列で、それぞれに「ファイル名」「ファイルフルパス名」「フォルダパス名」「フォルダ名」が格納されます。
フォルダ名抽出名には「InStrRev」関数を利用して抽出しています。
抽出方法は「1階層上の親ディレクトリパスを取得「ParentDirName」」で解説していますので、こちらをご確認ください。
ここまでがサブルーチンの解説ですが、実際の使い方について見ていきましょう。
pathName = ThisWorkbook.Path & "\file"
fileData = fileNameF(pathName)
r = 2
For i = 0 To UBound(fileData)
Cells(r, 1) = fileData(i, 0)
Cells(r, 2) = fileData(i, 1)
Cells(r, 3) = fileData(i, 2)
Cells(r, 4) = fileData(i, 3)
r = r + 1
Next
ざっと説明すると、まず取得するフォルダを指定しpathName変数に代入します。
こちらではフォルダの情報を取得するために「fileNameFサブルーチン」へ引数として渡し、fileData配列変数にファイル情報が格納されます。
後はどういう使い方をするかは自由ですが、こちらでは、A~D列にそれぞれの情報を入力しています。
このように配列データは自由に取り出しができますので、非常に便利ですね。
次の記事: VBAでIE操作に役立つ指定フォルダ内(サブフォルダ含む)のファイル情報を配列格納 >>
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。