【VBA】Dir関数

プログラミング 雑記

仕事ではWindowsを使う

こんにちはぶらたんです。

僕は、自宅ではほとんどMacを使っています。いちおうWindows機も持ってはいますが、ゲーム以外ほとんど使わない状態です。

しかし、仕事ではWindowsを使用しているおり、Windowsで動くソフト・ツールを作ることがあります。

今回はエクセルに搭載されているVBAのDir関数について書いていきたいと思います。

まあ、ほとんど僕の備忘録になってますが。

Dir関数とは?

dir関数を使おうとした図
dir関数を使おうとした図

Microsoftのページから抜粋。

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

引数は最大で2つ取り、どちらも省略可能なようです(それってどういう場合だ?)。
また、戻り値は文字列型を返すみたいですね。

  • PathName
    ファイル名、ディレクトリ名など。
  • Attributes
    PathNameに指定したものの属性
  • 戻り値
    引数にマッチするものが有る場合、そのフルパスを返す。
    指定したものが存在しない場合は長さ0の文字列を返す。

動作確認

ちょうどいま仕事で作りたい処理があります。

  1. 開いているファイルのフォルダの下にtempフォルダを作りたい
  2. tempフォルダの中に指定したファイルをコピーしたい
  3. 2でコピーしてきたファイルを使って、プログラムで処理を行い結果出力する
  4. 3でできた結果ファイルを指定した保存場所に指定した名前で保存したい
  5. 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

動作確認

実行させてみます。

実行後
実行後

上手く動いたようです
(ファイルが存在する場合もやってみましたが、大丈夫そう)