【VBA入門】MkDirでフォルダを作成し、ブックを保存する方法

MkDirステートメントって使っていますか?MkDirステートメントはフォルダを作成する場合に使います。

VBAでブックを作成し、処理を行って保存することはよくあるかと思います。そんなときに、ブックを保存するためのフォルダも作らなければならないことも多いですよね。

そこでこの記事では、

  • MkDirでフォルダを作成する方法
  • <

  • ブックに名前をつけて保存する方法
  • FileSystemObjectの使い方
  • フォルダを作成する際の注意点
  • 複数の階層のフォルダを作成する方法

など基本的な内容から、応用的な内容についても解説していきます。

今回はフォルダを作成する方法とファイルに名前を付けて保存する方法について、使い方をわかりやすく解説します!

目次

MkDirでフォルダを作成する方法

フォルダを作成するには、MkDirステートメントを使います。

MkDirステートメントは以下のように記述します。

MkDir pathname

pathnameには、作成するフォルダのパスを指定します。

サンプルコードで確認しましょう。

Sub macro1()
    MkDir ("test")
End Sub

このサンプルコードを実行すると、Excelのオプションで指定しているカレントフォルダにtestというフォルダが作られます。

セルの文字列をもとにフォルダを作成

Excelシートのセルに記入したフォルダ名を取得して、フォルダを作成するコードをご紹介します。ちなみに、Excelシートのセル”A1”には”test”と記述しています。

Excelシート:
MkDir01

Sub macro2()
    MkDir (Range("A1").Value)
End Sub

このサンプルコードを実行すると、Excelのオプションで指定しているカレントフォルダにtestというフォルダが作られます。

ブックに名前をつけて保存する方法

ブックを保存するためのフォルダの作り方がわかりましたので、これからはブックを保存する方法について解説していきます。

名前を付けて保存するには、WorkbookオブジェクトのSaveAsメソッドを使用します。

SaveAsメソッドは以下のように記述します。

Workbookオブジェクト名.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)

引数FileNameは保存するブックの名前をパスで指定します。

引数にはその他にも、ファイル形式を指定するFileFormat、パスワードを設定するPassword、読み取り専用を指定するReadOnlyRecommendedなど多くの種類があります。

詳細は公式サイトを参照してください。

それではSaveAsメソッドの使い方について、自身を別名で新規保存するサンプルコードで確認しましょう。

Sub macro3()
    Dim mybk As Workbook
    Set mybk = ThisWorkbook
    
    mybk.SaveAs ("test.xlsm")
End Sub

ダイアログを開いて保存

ダイアログを開いて保存するには、ApplicationオブジェクトのGetSaveAsFilenameメソッドを使います。

GetSetSaveAsFilenameメソッドは指定したファイル名を返します。ダイアログでキャンセルした場合には、Falseが返ってきます。

サンプルコードで確認しましょう。

Sub macro4()
    Dim safn As String
    safn = Application.GetSaveAsFilename
    
    If safn <> "False" Then
        ActiveWorkbook.SaveAs (safn)
    Else
        MsgBox "キャンセルされました"
    End If
End Sub

実行結果:
MkDir03

拡張子をCSVで指定して保存

拡張子をCSVで指定して保存するには、SaveAsメソッドの第2引数のFileFormatをxlCSVで指定します。

サンプルコードで確認しましょう。

Sub macro5()
    ActiveWorkbook.SaveAs "test.csv", xlCSV
End Sub

その他の拡張子で保存したい場合は、公式サイトを参考にしてください。

保存して閉じる方法

ブックを保存した後に閉じたい場合があります。

ブックを閉じるには、Closeメソッドを使用します。

サンプルコードで確認しましょう。

Sub macro6()
    Application.DisplayAlerts = False '確認メッセージを表示しない
    ActiveWorkbook.SaveAs ("test.xlsx")
    
    If ActiveWorkbook.Saved Then '保存の確認
        ActiveWorkbook.Close
    Else
        MsgBox "保存されていません"
        Exit Sub
    End If
    
    Application.DisplayAlerts = True '設定を元に戻す
End Sub

このサンプルコードでは、SaveAsメソッドを使ってブックを保存したあと、Closeメソッドでブックを閉じています。ブックを閉じる際に、変更を保存するか確認メッセージが表示されますが、これを表示しないように設定しています。

また、ブックを閉じる前にWorkbookオブジェクトのSavedプロパティを使って、保存されたのを確認してからブックを閉じています。

FileSystemObjectの使い方

もう1つ新しいフォルダを作成する方法があります。それは、FileSystemObjectオブジェクトのCreateFolderメソッドを使う方法です。

CreateFolderメソッドは以下のように記述します。

FileSystemObject.CreateFolder(foldername)

引数foldernameは作成するフォルダのパスを指定します。

CreateFolderメソッドはフォルダの作成に成功すると、そのフォルダのパスを文字列で返します。

サンプルコードで確認しましょう。

Sub macro7()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    fso.CreateFolder ("test")
End Sub

このサンプルコードを実行すると、Excelのオプションで指定しているカレントフォルダにtestというフォルダが作られます。

フォルダを作成する際の注意点

MkDirステートメントやCreateFolderメソッドでフォルダを作成する際に、すでにフォルダが存在している場合はエラーが発生します。フォルダの存在をチェックする方法にはDir関数を使う方法とFolderExistsメソッドを使う方法があります。

Dirでフォルダの存在をチェックする方法

Dir関数は第2引数でvbDirectoryを指定すると、第1引数で指定したパスのフォルダが存在しない場合は空文字を返します。

これを使ってフォルダの存在チェックをする方法は以下のとおりです。

Sub macro8()
    If Dir("test", vbDirectory) = "" Then
        MkDir ("test")
    Else
        MsgBox "すでに存在します"
    End If
End Sub

実行結果:
MkDir02

Dir関数の使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

FolderExistsでフォルダの存在をチェックする方法

FileSystemObjectオブジェクトを使う場合は、FolderExistsメソッドでフォルダの存在をチェックすることができます。

FolderExistsメソッドは引数にフォルダのパスを指定し、フォルダが存在する場合はTrueを返します。

これを使ってフォルダの存在チェックをする方法は以下のとおりです。

Sub macro9()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    If Not fso.FolderExists("test") Then
        fso.CreateFolder ("test")
    Else
        MsgBox "すでに存在します"
    End If
End Sub

実行結果:
MkDir02

複数の階層のフォルダを作成する方法

フォルダを作成する際に注意しなければならないのが、絶対パスで指定する場合にその親フォルダ自体が存在しない場合です。その場合は存在するフォルダやドライブまでさかのぼって、必要となる複数の階層のフォルダを作成する必要があります。

複数階層のフォルダを作成するにはMkDirを使う方法とWindows APIのSHCreateDirectoryExを使用する方法があります。

MkDirで複数階層のフォルダを作成

MkDirステートメントは、複数の階層を1回で作成することはできません。

階層を追って1階層ずつ作成する必要があります。

階層を追って1階層ずつ作成する例をご紹介します。

Sub macro10()
    Dim arr(3) As String
    arr(0) = "C:"
    arr(1) = "2017"
    arr(2) = "09"
    
    Dim str As String, i As Integer
    str = arr(0)
    For i = 1 To UBound(arr)
        str = str & "" & arr(i)
        If Dir(str, vbDirectory) = "" Then
            MkDir str
        End If
    Next i
End Sub

このサンプルコードでは、フォルダ「C:20179」を作成するために、まず文字列”C:”、”2017″、”09″を配列arrに格納しています。

これをForループで繰り返すと、フォルダパスが”C:2017″、”C:20179″となりますので、その都度フォルダが存在するかDir関数を使って確認しています。

フォルダが存在しなければ、MkDirステートメントを使ってフォルダを作成しています。

SHCreateDirectoryExを使う方法

Windows APIのSHCreateDirectoryExでは、複数の階層を1回で作成することができます。

以下を参考にしてみてください。

Private Declare Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" ( _
                                                                  ByVal hwnd As Long, _
                                                                  ByVal pszPath As String, _
                                                                  ByVal psa As Long) As Long

Sub macro11()
    Dim cdex As Long
    cdex = SHCreateDirectoryEx(0&, "C:20179", 0&)
    If cdex = 0 Then
        MsgBox "作成しました"
    ElseIf cdex = 183 Then
        MsgBox "存在しています"
    Else
        MsgBox "作成できませんでした"
    End If
End Sub

SHCreateDirectoryExはフォルダの作成に成功すると0を返します。

フォルダがすでに存在していると183を返します。

まとめ

ここでは、フォルダを作成する方法とブックに名前を付けて保存する方法について説明しました。フォルダを作成するには、MkDirステートメントを使用します。

また、ブックに名前を付けて保存するには、SaveAsメソッドを使用します。どちらも使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次