フォルダに格納されているファイル名を取得しテーブルに書き出す【Access】

こんにちはmasalifeです。

今回はAccessで「フォルダに格納されているファイル名を取得しテーブルに書き出す」方法を紹介します。

紹介する内容を整理すると次のとおりとなります。

クリックで拡大表示

DAO(Data Access Object)という耳慣れない機能を使った方法を紹介しますが、DAOについてよく分からなくても、

【目次1:【必須設定】DAOを使用するために参照設定を行う】と【目次2: VBAコード】をそのままやっていただければ機能が作成できますので安心してください。

・DAO(Data Access Object)

・Dir関数

・Do…Loopステートメント(Whileキーワード)

【必須設定】DAOを使用するために参照設定を行う

AccessでDAOを使用するためにはVBE画面で参照設定を行う必要があります。

【ツール】→【参照設定】をクリックします。


「Microsoft Office 16.0 Access database engine Object Library」にチェックを付し、【OK】をクリックします。

これでAccessでDAOの使用ができるようになりました。

VBAコード

次のコードをボタン等のイベントに設定してください。

VBAコードを考える

変数宣言

5 Dim db As DAO.Databaseはデータベースに接続するためのオブジェクトを扱う変数dbを宣言しています。

6 Dim Table01 As DAO.Recordsetはレコードセットオブジェクトを扱う変数Table01を宣言しています。

*ファイル名を追加するテーブルタイプのレコードセットオブジェクト作成して使用しています。

データベースを開く:CurrentDbメソッド

CurrentDbメソッドは、現在Microsoft Accessウインドウで開いているデータベースを表すDatabase型のオブジェクト変数を返します。

データベース名が分からなくても開いているデータベースに接続できるため便利です。

現在開いているデータベースを変数dbで参照することができます。

テーブルタイプのRecordsetオブジェクトを作成する:Database.OpenRecordset メソッド

Database.OpenRecordsetメソッドを使用して、テーブルタイプのRecordsetオブジェクトを作成しています。

レコードの取得元(パラメーターName)にはファイル名を書き出すテーブル(T_ファイル取得)を指定しています。

Database.OpenRecordsetの概要は次のとおりです。

※以下、learn.microsoft.comより引用


【構文】

.OpenRecordset (NameTypeOptionsLockEdit)

式の部分にはDatabaseオブジェクトを表す変数を指定します。

【パラメーター】

名前必須かどうかデータ型説明
Name必須文字列型 (String型)新しい Recordset のレコードの取得元です。 テーブル名、クエリ名、またはレコードを返す SQL ステートメントを指定できます。 Microsoft Access データベース エンジンのデータベースに含まれるテーブル タイプの Recordset オブジェクトの場合は、テーブル名でのみ指定できます。
Type省略可能Variant開く Recordset の型を示す RecordsetTypeEnum 定数。
: タイプを指定せずに Recordset を Microsoft Access ワークスペースで開くと、可能な場合は OpenRecordset はテーブルタイプの Recordset を作成します。
Options省略可能Variant新しい Recordset の特性を指定する RecordsetOptionEnum 定数の組み合わせ。
LockEdit 省略可能VariantRecordset のロックを決定する LockTypeEnum 定数。

変数に値を代入する:フォルダのパス・フォルダ内のファイル名

11 MyPath = “C:\Users\nakam\Desktop\ファイル名取得\”はファイル名を取得したいフォルダのパスを変数MyPathに代入しています。

12 MyName = Dir(MyPath, vbNormal)は11で指定したフォルダ内のすべてのファイル名を文字列で取得し、変数MyNameに代入しています。

*属性のないファイルを取得するため、引数attributesはvbNormalを指定します。(省略してもOK)

Dir関数の概要は次のとおりです。

※以下、support.microsoft.comより引用


【Dir関数】

指定したパターン、ファイル属性、またはドライブのボリューム ラベルに一致する、ファイル、ディレクトリ、フォルダーの名前を表す文字列を返します。

【構文】

Dir[(pathname [, attributes)]

【引数】

引数説明
pathname 省略可能。 ファイル名を指定する文字列式には、ディレクトリかフォルダー、およびドライブを指定できます。 引数 pathname が見つからない場合は、長さ 0 の文字列 (“”) が返されます。
attributes省略可能。 定数または数値式を列挙してファイル属性を指定します。 省略すると、引数 pathname と一致し、属性を持たないファイルが返されます。

attributesの設定値】

定数説明
vbNormal  0  (既定値) 属性のないファイルを指定します。
vbReadOnly1属性のないファイルと読み取り専用ファイルを指定します。
vbHidden2属性のないファイルと隠しファイルを指定します。
VbSystem4属性のないファイルとシステム ファイルを指定します。 Macintosh では使用できません。
vbVolume8
ボリューム ラベルを指定します。その他の属性が指定されている場合 、vbVolume は 無視されます。 Macintosh では使用できません。
vbDirectory16属性のないファイルと、ディレクトリまたはフォルダを指定します。
vbAlias64指定ファイル名はエイリアスです。 Macintosh でのみ使用できます。

取得したファイル名をテーブルに書き出す

取得したファイル名をテーブルに書き出すメインのコードになります。

このコードを理解するためには、Dir関数の次の2つのポイントとDo…Loopステートメント(Whileキーワード)を押さえなければいけません。

(1) 引数pathnameと一致した最初のファイル名を返し、一致するファイル名がなくなったら長さ0の文字列(“”)を返す。

(2) 引数pathnameと一致するファイル名をさらに取得するには引数なしで再度呼び出す。

「ある条件を満たしている間」(条件式がTrueの間)は繰り返し処理を実行する。

【構文】

Do (While) 条件式

 繰り返し実行する処理

Loop

Dir関数の2つ目のポイント、「引数pathnameと一致するファイル名をさらに取得するには引数なしで再度呼び出す」の補足として、次のコードでDir関数の戻り値を代入した変数MyNameの値の変化を見てみます。

変数MyNameの値をMsgboxで表示していて、このコードを実行するとMsgboxで表示される値が次のように変化します。

クリックで拡大表示

MyName = Dir( )が実行されるごとにMyNameの値が変わっていき、これがDir関数の2つ目のポイント 「引数pathnameと一致するファイル名をさらに取得するには引数なしで再度呼び出す」の意味となります。

※( )とすることで引数なし

ファイル名がなくなるとDir関数は長さ0の文字列(“”)を返すので、4回目のMyNameの値は長さ0の文字列(“”)が表示されています。(1つ目のポイント)


すなわち、このコードは変数MyNameの値が””でない間はテーブル(T_ファイル取得)のファイル名フィールドに変数MyNameの値を追加して更新してくださいよ

となっていることが読み解けます。

開いたデータベースとレコードセットを閉じる:Closeメソッド

Closeメソッドを使って開いたデータベースとレコードセットを閉じています。

さいごに

実行するたび、テーブルにファイル名が書き出されてしまいますので、削除クエリを使ってテーブルを初期化しておくといいかもしれません。

最後まで読んでいただきありがとうございました。