【VBA】Dir関数
仕事ではWindowsを使う
こんにちはぶらたんです。
僕は、自宅ではほとんどMacを使っています。いちおうWindows機も持ってはいますが、ゲーム以外ほとんど使わない状態です。
しかし、仕事ではWindowsを使用しているおり、Windowsで動くソフト・ツールを作ることがあります。
今回はエクセルに搭載されているVBAのDir関数について書いていきたいと思います。
まあ、ほとんど僕の備忘録になってますが。
Dir関数とは?
Microsoftのページから抜粋。
指定したパターンまたはファイル属性に一致するファイル、ディレクトリ、フォルダーの名前、またはドライブのボリューム ラベルを表す String を返します。
Dir 関数 (Visual Basic for Applications)
Office VBA reference topic
引数は最大で2つ取り、どちらも省略可能なようです(それってどういう場合だ?)。
また、戻り値は文字列型を返すみたいですね。
- PathName
ファイル名、ディレクトリ名など。 - Attributes
PathNameに指定したものの属性 - 戻り値
引数にマッチするものが有る場合、そのフルパスを返す。
指定したものが存在しない場合は長さ0の文字列を返す。
動作確認
ちょうどいま仕事で作りたい処理があります。
- 開いているファイルのフォルダの下にtempフォルダを作りたい
- tempフォルダの中に指定したファイルをコピーしたい
- 2でコピーしてきたファイルを使って、プログラムで処理を行い結果出力する
- 3でできた結果ファイルを指定した保存場所に指定した名前で保存したい
- tempフォルダを削除する
とまあ、こんな感じの処理を作りたいです。
ここでは、
- 1.のフォルダがあるか調べる
- 2のファイルが本当に存在するか調べる
- 2のコピー先にファイルがあるかどうかを調べる
ためにDir関数を使いたいと思います。
サクッと作ってみた
超適当コードですが。
Sub test()
Dim target As String
Dim src As String
Dim srccopy As String
target = ThisWorkbook.Path & "¥temp"
' tempフォルダがないなら作成
If Dir(target, vbDirectory) = "" Then
MkDir target
MsgBox target & "がないので作りました"
End If
' コピー元ファイルをtempにコピーする
src = Cells(1, 1)
srccopy = target & "¥a.txt"
' ファイルが存在しないなら処理しない
If Dir(src) <> "" Then
' コピー元に同じ名前のファイルがあるなら先に消す
If Dir(srccopy) <> "" Then
Kill srccopy
End If
FileCopy src, srccopy
MsgBox src & "を" & srccopy & "にコピーしました!"
Else
MsgBox "コピーするファイルがありません"
End If
End Sub
※このコードは3〜5の処理は入ってません。
フォルダがあるか調べる
If Dir(target, vbDirectory) = "" Then
これで開いているエクセルファイル(C:¥blatan¥test.xlsmとします)の下にtempフォルダがあるか調べています。
空文字が返ってくる=存在しないと言うことになるので、その際はフォルダを作成します。
コピー元ファイルがあるかどうか調べる
コピー元ファイルは…A1セルにあるファイル名をコピーします。
こんな感じで設定。
c:¥blatan¥test.txt
コピーする際、ファイルがなければ意味がないのでチェックします。
' ファイルが存在しないなら処理しない
If Dir(src) <> "" Then
こんなかんじ。ここでは第2引数は省略してます。
こちらも先ほどと同様に、空文字が返ればファイルが存在しないので、そうではない場合に処理するとします。
コピー先ファイルがあるかどうか調べる
同じような処理ですが、コピー先に同名のファイルがあるか調べます。
FileCopyに上書き機能があるかどうか知りませんが、面倒なのであったら先に削除します。
' コピー元に同じ名前のファイルがあるなら先に消す
If Dir(srccopy) <> "" Then
Kill srccopy
End If
動作確認
実行させてみます。
上手く動いたようです
(ファイルが存在する場合もやってみましたが、大丈夫そう)