【Access VBA】指定フォルダ配下のファイル名を自動取得する

【Access VBA】指定フォルダ配下のファイル名を自動取得する

指定フォルダ配下のファイル名を自動取得する

この記事では「指定フォルダ配下のファイル名を自動取得する」ために利用可能な GetBookNameList というユーザー定義関数について紹介します。

この情報が読者のお役に立てば幸いです。

 

解決できること

Microsoft Access の中でここで紹介する

GetBookNameList

をマクロの中で呼び出すと%USERPROFILE% を含めたフルパスファイル名ファイル作成日時 を簡単に取得できます。

ここに %USERPROFILE% は Windows であらかじめ定義されている環境変数で Windows 10 搭載 PCを使っている利用者のデフォルトのフォルダパスを表しています。この環境変数については必要に応じて以下の記事を参照下さい。

【Windows業務効率化】バッチファイルの基本テクニックを知ろう

 

読んでほしい方

こうした Microsoft Access VBA を使ったアプリケーションをこれから作ろうと思っている方、今まで VBA によるアプリケーションを作ってきたが、そのツールを第三者に提供する際に、フォルダの保存パス名等の利用者個人に紐づいた環境差分をVBAのプログラムの中にじかに書くのに抵抗がある方。

 

GetBookNameList関数 の紹介

説明

 “FileNamesList” テーブルの中に %USERPROFILE% からの相対パスで指定したフォルダ配下に存在する全てのファイルの フルパス名ファイル名ファイル作成日時 を取得します。

 

参照オブジェクト

この関数を利用するためにはこの関数の実行前に

データベースツール > Visual Basic > ツール > 参照設定

【Access VBA】指定フォルダ配下のファイル名を自動取得する

 

の中で

  • Microsoft Office 16.0 Access Database engine
  • Microsoft ActiveX Data Objects 6.1 Library

にチェックを入れる必要があります。

利用例

本ツールの利用前にまず

【Access VBA】指定フォルダ配下のファイル名を保存するテーブルを自動生成する

で紹介した MakeBookNameTable  を使い “FileNamesList” テーブルを作成します。

次に Access のマクロ定義例えば “M0020_Call_GetBookNameList_FileNameList” のように


If GetBookNameList("Downloads","FileNamesList")>0 Then
  メッセージボックス ("Downloads" フォルダからのファイル名の取得に失敗しました。,はい,なし)
If 文の最後

のように GetBookNameListを “Downloads“、,”FileNamesList” といったパラメータを付けて呼び出します。ここに “Downloads” はファイル名を取得したい指定フォルダの %USERPROFILE% からの相対パス名、 “FileNamesList” はファイルの フルパス名ファイル名ファイル作成日時 を格納するテーブルの名前です。

この “M0020_Call_GetBookNameList_FileNameList” のでデザインビューを閉じて、この ”M0020_Call_GetBookNameList_FileNameList” マクロをダブルクリックすると、このマクロが実行されこの中で  GetBookNameListが実行されたあと、この”FileNamesList” を 「開く(O)」 で見ると

【Access VBA】指定フォルダ配下のファイル名を自動取得する

のように  “FileNamesList”  テーブルの中に指定フォルダに保存されている、ファイルの名前と、その作成日が格納されていることがわかります。

引数

属性 意味
フォルダ名の絶対パス名 文字型 ファイル名の取得をしたいフォルダ名の絶対パス名
テーブル名 文字型 作成するテーブルの名前を””で囲んだ文字列で関数のパラメータとして指定します。

戻り値

意味
0 正常終了
1 異常終了

 

 

VBAコード


Function GetBookNameList(target_folder_name As String, output_table_name As String) As Integer

  Const C_SUCCESS As Integer = 0
  Const C_FAILURE As Integer = 1

  Dim fileSystemObject As Object
  Dim fileObject       As Object

  Dim pathName         As String
  Dim bookName         As String

  Dim startPosition    As Integer

  Dim adodbConnestion  As New ADODB.Connection
  Dim recordSet        As New ADODB.recordSet

  Dim userProfile As String

  userProfile = Environ("UserProfile") & "\"

  On Error GoTo exitWithFailure

  Set fileSystemObject = CreateObject("Scripting.FileSystemObject")
  Set adodbConnestion = CurrentProject.Connection

  recordSet.Open output_table_name, adodbConnestion, adOpenDynamic, adLockOptimistic

  'ファイル名取得処理
  For Each fileObject In fileSystemObject.GetFolder(userProfile & target_folder_name).Files

    startPosition = InStrRev(fileObject.Path, "\") + 1

    pathName = Left(fileObject.Path, startPosition - 1)
    bookName = Right(fileObject.Path, Len(fileObject.Path) - startPosition + 1)

    Debug.Print bookName

    'テーブルにパスとファイル名を追加
    recordSet.AddNew
    recordSet("PathName") = pathName
    recordSet("BookName") = bookName
    recordSet("BookDateTime") = FileDateTime(pathName & bookName)
    recordSet.Update

  Next

  recordSet.Close

  Set fileSystemObject = Nothing
  Set adodbConnestion = Nothing
  GetBookNameList = C_SUCCESS
Exit Function

exitWithFailure:
  Set fileSystemObject = Nothing
  Set adodbConnestion = Nothing
  GetBookNameList = C_FAILURE
End Function

 

VBAコードの簡単な説明

行番号 説明
1 関数名と関数の戻り値の型(Integer:整数型)、入力パラメータの名前、型(String:文字列型)を定義しています。
3-4 このプログラムの中で利用する定数C_SUCCESS(0:成功)、C_FAILURE(1:失敗)を定義しています。ここでは54行目でこの関数の戻り値が C_SUCCESS(0:成功)であるごとが明確にわかるようなコーディングの仕方になります。
6-7

この関数の中で利用される FileSystemObject(注1)を用いたオブジェクト   fileSystemObjectfileObject の定義をしています。

9-12

この関数の中で利用される変数  pathName、bookName、 startPosition の定義をしています。

14-15

ADOの関数の中で利用される ADO(注1) を用いたオブジェクト  adodbConnestionrecordSet の定義をします。

17-19 Environ 関数を利用して利用者の %USERPROFILE% に相当する絶対パス名 userProfileを取得します。
21 この関数の実行中にエラーが発生したときの例外処理として、exitWithFailure にジャンプします。
23-24 ファイルシステムにアクセスするための fileSystemObject、adodbConnestion を定義し、対象データオブジェクトが今開いている Access ファイルそのものであることを定義しています。  
26 入力パラメータとして指定された出力用テーブルを書き込み可能テーブルとしてオープンします。
29-45 入力パラメータとして指定された対象フォルダ配下に存在するファイル名を一つづつ読み込み、その絶対パス名(=入力された対象フォルダパス名)、ファイル名、ファイル作成日を出力用テーブルに書き込みます。
47

出力用テーブルをクローズします。

49-50 この関数の中で使用したオブジェクトを(メモリ)開放します。
51-52 この関数の戻り値に C_SUCCESS(0:成功) を設定して関数を終わります。
54-56 この関数の中で使用したオブジェクトを(メモリ)開放します。
57-58 この関数の戻り値に C_FAILURE (1:失敗) を設定して関数を終わります。

(注1) ADO (ActiveX Data Objects) : DAOの後継としてMicrosoftが仕様策定した統一的方法でデータベースを操作、参照するためのソフトウェア部品のパッケージおよびその呼び出し規約(API)。ActiveXコントロールとして様々なソフトウェアやプログラミング言語から共通の方法で簡単にデータベースにアクセスでき、また表計算ソフトのワークシートやCSVファイルなどを含む様々な形式のデータに同じ手順でアクセスすることができる。

(注2) FileSystemObject: WSH(Windows Scripting Hosts)の一部として Windows のファイル操作を行うオブジェクト。

まとめ

この記事では「指定フォルダ配下のファイル名を自動取得する」ために利用可能な GetBookNameList というユーザー定義関数について紹介しました。この情報が読者のお役に立てば幸いです。