Accessのデータをエクスポートする際に、同一名称のファイルが存在する場合に上書きされてしまうことがあります。
特にルーチン業務等の場合には同じ処理を繰り返すことも考えられますが、上書きされると困るケースは多々あるかと思います。
そこで、ファイルやフォルダの有無を確認し、条件に応じた処理ができるようにするため、Access VBAを活用してこれら機能を実装する方法を紹介します。
なお、フォルダの存在有無を調べる方法は、以下の記事でも紹介していますが今回はファイルとフォルダ両方を調べる方法を紹介していきます。
ファイルやフォルダの有無を調べる方法: Dir関数
Dir関数は、指定したパターンまたはファイル属性に一致するファイル、ディレクトリ、フォルダーの名前、またはドライブのボリューム ラベルを表す文字列を返します。
基本構文は次のとおりです。
Dir [ (pathname, [ attributes ] ) ]
pathname: 省略可能。ファイル名を指定する文字列式。ディレクトリ又はフォルダー、及びドライブを含めることができる。 pathname が見つからない場合は、長さ 0 の文字列 (“”) が返される。
attributes: 省略可能。ファイル属性を指定する定数又は数式 (合計によって指定)。 省略した場合は、pathname に一致する、属性のないファイルが返される。
ここで、pathnameはフルパスで指定することに注意が必要です。
次に、attributesに指定する値は、表1に示すとおりとなります。
定数 | 値 | 説明 |
vbNormal | 0 | (既定値) 属性のないファイル。 |
vbReadOnly | 1 | 属性のないファイルと読み取り専用のファイル。 |
vbHidden | 2 | 属性のないファイルと隠しファイル。 |
vbSystem | 4 | 属性のないファイルとシステム ファイル。 Macintosh では使用できません。 |
vbVolume | 8 | ボリューム ラベル。他の属性を指定した場合は、vbVolume は無視されます。 Macintosh では使用できません。 |
vbDirectory | 16 | 属性のないファイルとディレクトリまたはフォルダー。 |
vbAlias | 64 | 指定されたファイル名はエイリアスです。 Macintosh でのみ使用できます。 |
以上を踏まえて、次からサンプルコードを紹介します。
サンプルコード
今回作成するコードは、Cドライブに「TEST」フォルダを作成し、この中に「TEST.txt」ファイルがあるかの確認と、「SubTEST」フォルダがあるかの確認をする例とします。
具体的なコードは次のようになります。
Private Sub DirFunction() 'ファイル名又はフォルダ名を格納する変数 Dim FileName As String, cFileName As String Dim FolderName As String, cFolderName As String 'ファイル名の設定 FileName = "C:\TEST\TEST.txt" 'Dir関数でファイルの有無をチェック。 '該当ファイルがあればcFileNameにもファイル名が格納される。 cFileName = Dir(FileName) 'フォルダ名の設定 FolderName = "C:\TEST\SubTEST" 'Dir関数でフォルダの有無をチェック。 '該当フォルダがあればcFolderNameにもフォルダ名が格納される。(第2引数に「vbDirectory」を忘れずに!) cFolderName = Dir(FolderName, vbDirectory) 'ファイルの有無を確認 MsgBox "「 " & FileName & " 」ファイルの有無を確認します。" If Len(cFileName) = 0 Then '該当ファイルがないと文字数は「0」となる。 MsgBox "ファイルは存在しません。" Else MsgBox "「 " & cFileName & " 」は存在します。" End If 'フォルダの有無を確認 MsgBox "「 " & FolderName & " 」フォルダの有無を確認します。" If Len(cFolderName) = 0 Then '該当フォルダがないと文字数は「0」となる。 MsgBox "フォルダは存在しません。" Else MsgBox "「 " & cFolderName & " 」は存在します。" End If End Sub
それでは、各コードの意味合いを確認していきましょう。まずは、変数として調べたいファイルパス又はフォルダパスを格納する変数と、Dir関数の戻り値を格納する変数を用意します。
続いて、Dir関数により該当するファイルが存在すればファイル名を、該当するファイルがなければ「””」の文字列を返す処理をしています。
フォルダ有無の確認についても同様の処理をしていますが、Dir関数の第2引数に「vbDirectory」を設定している点に注意してください。これでフォルダのチェックとなります。
If文を用いて、「cFileName」変数と「cFolderName」変数に格納された値で条件分岐をしていますが、該当ファイル/フォルダがない場合に「””」、すなわち文字数としては「0」となるためLen関数を活用して、これを判定しています。
Len関数については、以下の記事で紹介していますので、ご参照ください。
このように、分岐処理によりファイル/フォルダの有無に応じた処理を実装することができます。
まとめ
今回は、ファイル/フォルダの有無を調べるための関数としてDir関数を紹介しました。ルーチン業務で定期的にファイルを出力する際に、上書き保存されない策として今回紹介したDir関数の活用方法は非常に有効な手段です。
是非、業務効率の改善を図るための参考にしていただければと思います。
スポンサーリンク
コメント