指定フォルダ配下のファイル名を保存するテーブルを自動生成する
この記事では「指定フォルダ配下のファイル名を保存するためのテーブルを自動生成する」ために利用可能な MakeBookNameTable というユーザー定義関数について紹介します。 この情報が読者のお役に立てば幸いです。
解決できること
Microsoft Access の中で通常テーブルを作成する方法としては通常
- 既存のテーブルに対し何かしらの 参照クエリ操作 を行い最終的に クエリの種類(U) > テーブル作成(K) で新たなテーブルを作成する
- クエリデザインビューを SQLビュー にし、SQL言語による記述でテーブルを作成する
- Access 「作成」->「テーブル」で現れる デザインビュー でテーブルを作成する
- 別の Access ファイルから同じテーブルをインポートする
といった方法がありますが、
- の方法は Access を起動直後の一番最初の状態では参照可能なテーブルがないので、この状態では参照クエリ操作の定義ができない
- の方法は別途SQL言語を覚える必要がある
- の方法はそれなりに手間がかかるので毎回これを行うのは精神衛生上好ましくない
- の方法は必要なテーブルがどの Access ファイルにあるのか探す必要がある
といった難点があります。一方ここで紹介する MakeBookNameTable をマクロの中で呼び出すと簡単に「指定フォルダ配下のファイル名を保存するためのテーブル」を自動生成できます。
読んでほしい方
こうした Microsoft Access VBA を使ったアプリケーションをこれから作ろうと思っている方、今まで VBA によるアプリケーションを作ってきたが、そのツールを第三者に提供する際に、フォルダの保存パス名等の利用者個人に紐づいた環境差分をVBAのプログラムの中にじかに書くのに抵抗がある方。
MakeBookNameTable 関数 の紹介
説明
指定フォルダの フルパス名 、ファイル名 、ファイル作成日時 を格納するための以下のようなテーブルを作成します。
参照オブジェクト
この関数を利用するためにはこの関数の実行前に データベースツール > Visual Basic > ツール > 参照設定 の中で
- Microsoft Office 16.0 Access Database engine
にチェックを入れる必要があります。
利用例
Access のマクロ定義例えば “M0000_Call_MakeBookNameTable” の中で のように
If MakeBookNameTable("FileNamesList")>0 Then
メッセージボックス ("FileNamesList" の作成に失敗しました。,はい,なし)
If 文の最後
のように MakeBookNameTableを “FileNamesList” のようなパラメータを付けて呼び出します。ここに “FileNamesList” は作成されるテーブルの名前です。 この “M0000_Call_MakeBookNameTable” のでデザインビューを閉じて、この ”M0000_Call_MakeBookNameTable” マクロをダブルクリックすると、このマクロが実行されこの中で MakeBookNameTable が実行されると、 のように左側のナビゲーションウインドウの一番上に、今まで存在しなかった “FileNamesList” というテーブルが作成されたことがわかります。この”FileNamesList” は 「開く(O)」 で見ると のようになっており、「デザインビュー(D)」で見ると のように表示され、”FileNamesList” が期待どおりに自動生成されていることがわかります。
引数
|
属性 |
意味 |
テーブル名 |
文字型 |
作成するテーブルの名前を””で囲んだ文字列で関数のパラメータとして指定します。 |
戻り値
VBAコード
Function MakeBookNameTable(table_name As String) As Integer
Const C_SUCCESS As Integer = 0
Const C_FAILURE As Integer = 1
' 新しいADO接続を作成する
Dim conn As Object
Set conn = CreateObject("ADODB.Connection")
conn.Open CurrentProject.Connection
Dim dataAccessObject As Object
Dim tableDefinition As Variant
On Error GoTo exitWithFailure
Set dataAccessObject = CurrentDb
' table_nameが既に存在する場合は削除する
For Each tableDefinition In dataAccessObject.TableDefs
If (tableDefinition.Name = table_name) Then
DoCmd.DeleteObject acTable, tableDefinition.Name
Exit For
End If
Next
' 新しいtable_nameを作成する
conn.Execute "CREATE TABLE " & table_name & " (PathName TEXT, BookName TEXT, BookDateTime DATETIME)"
' ADOオブジェクトをクリーンアップし、接続を閉じる
conn.Close
Set conn = Nothing
dataAccessObject.Close
Set dataAccessObject = Nothing
' ナビゲーションウィンドウを更新する
Application.RefreshDatabaseWindow
MakeBookNameTable = C_SUCCESS
Exit Function
exitWithFailure:
' エラー時のクリーンアップ
conn.Close
Set conn = Nothing
dataAccessObject.Close
Set dataAccessObject = Nothing
' ナビゲーションウィンドウを更新する
Application.RefreshDatabaseWindow
MakeBookNameTable = C_FAILURE
End Function
VBAコードの簡単な説明
行番号 |
説明 |
1 |
関数名と関数の戻り値の型(Integer:整数型)、入力パラメータの名前、型(String:文字列型)を定義しています。 |
3-4 |
このプログラムの中で利用する定数C_SUCCESS(0:成功)、C_FAILURE(1:失敗)を定義しています。ここでは38行目でこの関数の戻り値が C_SUCCESS(0:成功)であるごとが明確にわかるようなコーディングの仕方になります。 |
6-11 |
この関数の中で利用される ADO(注1) を用いたオブジェクト conn と dataAccessObject の定義をしています。 |
15 |
この関数の実行中にエラーが発生したときの例外処理として、exitWithFailure にジャンプします。 |
17 |
対象データオブジェクトが今開いている Access ファイルそのものであることを定義しています。 |
19-25 |
対象データオブジェクトの中に、入力パラメータで指定した名称と同じテーブルがあるか確認し、もしあればそのテーブルを削除します。 |
27-28 |
conn ヘ SQL 構文を発行してデータテーブルのフィールド名とその属性のペアでフィールドを定義しています。このフィールド名の型指定は次のようになっております。
|
30-34 |
この関数の中で使用したオブジェクトを閉じ、(メモリ)を開放します。 |
36-37 |
作成したテーブルをナビゲーションウインドウの中で表示します。 |
38-39 |
この関数の戻り値に C_SUCCESS(0:成功) を設定して関数を終わります。 |
42-46 |
この関数の中で使用したオブジェクトを閉じ、(メモリ)を開放します。 |
48-49 |
ナビゲーションウインドウをリフレッシュします。 |
50-51 |
この関数の戻り値に C_FAILURE (1:失敗) を設定して関数を終わります。 |
まとめ
この記事では「指定フォルダ配下のファイル名を保存するためのテーブルを自動生成する」ために利用可能な MakeBookNameTable というユーザー定義関数について紹介しました。 この情報が読者のお役に立てば幸いです。