こんにちは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コード
次のコードをボタン等のイベントに設定してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Private Sub btnファイル名取得_Click() Dim MyPath As String Dim MyName As String Dim db As DAO.Database Dim Table01 As DAO.Recordset Set db = CurrentDb() Set Table01 = db.OpenRecordset("T_ファイル取得") MyPath = "C:\Users\nakam\Desktop\ファイル名取得\" MyName = Dir(MyPath, vbNormal) Do While MyName <> "" Table01.AddNew Table01![ファイル名] = MyName Table01.Update MyName = Dir() Loop Table01.Close db.Close MsgBox "ファイル名を取得しました!!" End Sub |
VBAコードを考える
変数宣言
3 4 5 6 |
Dim MyPath As String Dim MyName As String Dim db As DAO.Database Dim Table01 As DAO.Recordset |
5 Dim db As DAO.Databaseはデータベースに接続するためのオブジェクトを扱う変数dbを宣言しています。
6 Dim Table01 As DAO.Recordsetはレコードセットオブジェクトを扱う変数Table01を宣言しています。
*ファイル名を追加するテーブルタイプのレコードセットオブジェクト作成して使用しています。
データベースを開く:CurrentDbメソッド
8 |
Set db = CurrentDb() |
CurrentDbメソッドは、現在Microsoft Accessウインドウで開いているデータベースを表すDatabase型のオブジェクト変数を返します。
データベース名が分からなくても開いているデータベースに接続できるため便利です。
現在開いているデータベースを変数dbで参照することができます。
テーブルタイプのRecordsetオブジェクトを作成する:Database.OpenRecordset メソッド
9 |
Set Table01 = db.OpenRecordset("T_ファイル取得") |
Database.OpenRecordsetメソッドを使用して、テーブルタイプのRecordsetオブジェクトを作成しています。
レコードの取得元(パラメーターName)にはファイル名を書き出すテーブル(T_ファイル取得)を指定しています。
Database.OpenRecordsetの概要は次のとおりです。
※以下、learn.microsoft.comより引用
【構文】
式.OpenRecordset (Name、Type、Options、LockEdit)
式の部分にはDatabaseオブジェクトを表す変数を指定します。
【パラメーター】
名前 | 必須かどうか | データ型 | 説明 |
Name | 必須 | 文字列型 (String型) | 新しい Recordset のレコードの取得元です。 テーブル名、クエリ名、またはレコードを返す SQL ステートメントを指定できます。 Microsoft Access データベース エンジンのデータベースに含まれるテーブル タイプの Recordset オブジェクトの場合は、テーブル名でのみ指定できます。 |
Type | 省略可能 | Variant | 開く Recordset の型を示す RecordsetTypeEnum 定数。 注: タイプを指定せずに Recordset を Microsoft Access ワークスペースで開くと、可能な場合は OpenRecordset はテーブルタイプの Recordset を作成します。 |
Options | 省略可能 | Variant | 新しい Recordset の特性を指定する RecordsetOptionEnum 定数の組み合わせ。 |
LockEdit | 省略可能 | Variant | Recordset のロックを決定する LockTypeEnum 定数。 |
変数に値を代入する:フォルダのパス・フォルダ内のファイル名
11 12 |
MyPath = "C:\Users\nakam\Desktop\ファイル名取得\" MyName = Dir(MyPath, vbNormal) |
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 | (既定値) 属性のないファイルを指定します。 |
vbReadOnly | 1 | 属性のないファイルと読み取り専用ファイルを指定します。 |
vbHidden | 2 | 属性のないファイルと隠しファイルを指定します。 |
VbSystem | 4 | 属性のないファイルとシステム ファイルを指定します。 Macintosh では使用できません。 |
vbVolume | 8 | ボリューム ラベルを指定します。その他の属性が指定されている場合 、vbVolume は 無視されます。 Macintosh では使用できません。 |
vbDirectory | 16 | 属性のないファイルと、ディレクトリまたはフォルダを指定します。 |
vbAlias | 64 | 指定ファイル名はエイリアスです。 Macintosh でのみ使用できます。 |
取得したファイル名をテーブルに書き出す
14 15 16 17 18 19 |
Do While MyName <> "" Table01.AddNew Table01![ファイル名] = MyName Table01.Update MyName = Dir() Loop |
取得したファイル名をテーブルに書き出すメインのコードになります。
このコードを理解するためには、Dir関数の次の2つのポイントとDo…Loopステートメント(Whileキーワード)を押さえなければいけません。
(1) 引数pathnameと一致した最初のファイル名を返し、一致するファイル名がなくなったら長さ0の文字列(“”)を返す。
(2) 引数pathnameと一致するファイル名をさらに取得するには引数なしで再度呼び出す。
「ある条件を満たしている間」(条件式がTrueの間)は繰り返し処理を実行する。
【構文】
Do (While) 条件式
繰り返し実行する処理
Loop
Dir関数の2つ目のポイント、「引数pathnameと一致するファイル名をさらに取得するには引数なしで再度呼び出す」の補足として、次のコードでDir関数の戻り値を代入した変数MyNameの値の変化を見てみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Private Sub btnファイル名取得_Click() Dim MyPath As String Dim MyName As String Dim db As DAO.Database Dim Table01 As DAO.Recordset Set db = CurrentDb() Set Table01 = db.OpenRecordset("T_ファイル取得") MyPath = "C:\Users\nakam\Desktop\ファイル名取得\" MyName = Dir(MyPath, vbNormal) MsgBox MyName MyName = Dir() MsgBox MyName MyName = Dir() MsgBox MyName MyName = Dir() MsgBox MyName End Sub |
変数MyNameの値をMsgboxで表示していて、このコードを実行するとMsgboxで表示される値が次のように変化します。
MyName = Dir( )が実行されるごとにMyNameの値が変わっていき、これがDir関数の2つ目のポイント 「引数pathnameと一致するファイル名をさらに取得するには引数なしで再度呼び出す」の意味となります。
※( )とすることで引数なし
ファイル名がなくなるとDir関数は長さ0の文字列(“”)を返すので、4回目のMyNameの値は長さ0の文字列(“”)が表示されています。(1つ目のポイント)
14 15 16 17 18 19 |
Do While MyName <> "" Table01.AddNew Table01![ファイル名] = MyName Table01.Update MyName = Dir() Loop |
すなわち、このコードは変数MyNameの値が””でない間はテーブル(T_ファイル取得)のファイル名フィールドに変数MyNameの値を追加して更新してくださいよ
となっていることが読み解けます。
開いたデータベースとレコードセットを閉じる:Closeメソッド
21 22 |
Table01.Close db.Close |
Closeメソッドを使って開いたデータベースとレコードセットを閉じています。
さいごに
実行するたび、テーブルにファイル名が書き出されてしまいますので、削除クエリを使ってテーブルを初期化しておくといいかもしれません。
最後まで読んでいただきありがとうございました。