may the VBA be with you

Excel VBAとか業務自動化とか

フォルダ作成マクロ ができるまで

はじめに

フォルダをいっぺんにたくさん作りたい時ってありますよね。

・・・よね?


右クリック→新規作成→フォルダーで作って名前変えて、とやればできるけど、いくつもやるのはめんどくさい。

そこでマクロの出番となります。

クリアすべきポイント

  1. 任意のフォルダを1つ作る
  2. 1を繰り返していっぱい作る

こんなところでしょうか。

任意のフォルダを1つ作る

vba フォルダ作成」辺りで検索すると、

  MkDir ("[フォルダのパス]")

でできることがわかります。

Sub test()
  MkDir ("C:¥VBAtest")
End Sub

CドライブにVBAtestフォルダを作り、そこに色々作ることにしましょう。

イメージ

f:id:vba-belle-equipe:20160314202703p:plain
こんな感じでセルに入力して実行 → C:¥VBAtestの中にa,b,c,d,eのフォルダができると、いいんじゃなかろうか。

パスを取得

今回はMkDirにフォルダのパスを次々渡していけばいいわけなので、パスを文字列として表示できるようにします。

いつものようにfor文を使って

Sub test()
  Dim i As Long
  Dim maxRow As Long
  Dim rootPath As String, fldPath As String
  rootPath = Range("A1")
  maxRow = Cells(Rows.Count, 1).End(xlUp).Row
  For i = 3 To maxRow
    fldPath = rootPath & "¥" & Cells(i, 1)
    Debug.Print fldPath
  Next
End Sub

で、

C:\VBAtest\a
C:\VBAtest\b
C:\VBAtest\c
C:\VBAtest\d
C:\VBAtest\e

イミディエイトウィンドウにパスが表示されます。

「VBAtest」と各サブフォルダの間に「¥」を入れるのを忘れると、面白いので、そこだけ注意。

慣れててもそういうことはよくあるので、一度「Debug.Print」が吉です。

いっぱい作る

Sub makeFolders()
  Dim i As Long
  Dim maxRow As Long
  Dim rootPath As String, fldPath As String
  rootPath = Range("A1")
  maxRow = Cells(Rows.Count, 1).End(xlUp).Row
  For i = 3 To maxRow
    fldPath = rootPath & "¥" & Cells(i, 1)
    MkDir fldPath
  Next
End Sub
  • Debug.Print を MkDir にして
  • それっぽい名前に変えれば

完成です。(名前は別にtestのままでもよい)

ローカル ディスク(C:)
 └VBAtest
  └a
    └b
    └c
    └d
    └e

できたできた。

アンコール

もう一回やるとどうなるでしょう

怒られる

パス名が無効です

無効って・・・さっきはできたじゃん。

まあ、エラーの意味はよくわからんけど、原因はなんとなくわかりますね。

さっき作ったフォルダを消してから実行すれば、大丈夫なようです。

つまり、フォルダが既にある場合に「パス名が無効」と言われると。

改良しよう

vba フォルダが存在するか確認」辺りで検索すると

  Dir("[フォルダのパス]", vbDirectory)

で確認できることがわかります。

Sub makeFolders()
  Dim i As Long
  Dim maxRow As Long
  Dim rootPath As String, fldPath As String
  rootPath = Range("A1")
  maxRow = Cells(Rows.Count, 1).End(xlUp).Row
  For i = 3 To maxRow
    fldPath = rootPath & "¥" & Cells(i, 1)
    If Dir(fldPath, vbDirectory) = "" Then
      MkDir fldPath
    End If
  Next
End Sub

こんなもんでしょうか。

まとめ

これだけの記述でこれだけのことができるなんて、なかなかお得ですね。

ただ、せっかくセルに作りたいフォルダを入力しても、一旦VBEに移って「実行」するのは冷めますな。


その辺りを考えるのは、また、別の話...