MkDirステートメントって使っていますか?MkDirステートメントはフォルダを作成する場合に使います。
VBAでブックを作成し、処理を行って保存することはよくあるかと思います。そんなときに、ブックを保存するためのフォルダも作らなければならないことも多いですよね。
そこでこの記事では、
- MkDirでフォルダを作成する方法
- ブックに名前をつけて保存する方法
- FileSystemObjectの使い方
- フォルダを作成する際の注意点
- 複数の階層のフォルダを作成する方法
<
など基本的な内容から、応用的な内容についても解説していきます。
今回はフォルダを作成する方法とファイルに名前を付けて保存する方法について、使い方をわかりやすく解説します!
MkDirでフォルダを作成する方法
フォルダを作成するには、MkDirステートメントを使います。
MkDirステートメントは以下のように記述します。
MkDir pathname
pathnameには、作成するフォルダのパスを指定します。
サンプルコードで確認しましょう。
Sub macro1() MkDir ("test") End Sub
このサンプルコードを実行すると、Excelのオプションで指定しているカレントフォルダにtestというフォルダが作られます。
セルの文字列をもとにフォルダを作成
Excelシートのセルに記入したフォルダ名を取得して、フォルダを作成するコードをご紹介します。ちなみに、Excelシートのセル”A1”には”test”と記述しています。
Excelシート:
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
実行結果:
拡張子を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
実行結果:
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
実行結果:
複数の階層のフォルダを作成する方法
フォルダを作成する際に注意しなければならないのが、絶対パスで指定する場合にその親フォルダ自体が存在しない場合です。その場合は存在するフォルダやドライブまでさかのぼって、必要となる複数の階層のフォルダを作成する必要があります。
複数階層のフォルダを作成するには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:2017 9」を作成するために、まず文字列”C:”、”2017″、”09″を配列arrに格納しています。
これをForループで繰り返すと、フォルダパスが”C:2017″、”C:2017 9″となりますので、その都度フォルダが存在するか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:2017 9", 0&) If cdex = 0 Then MsgBox "作成しました" ElseIf cdex = 183 Then MsgBox "存在しています" Else MsgBox "作成できませんでした" End If End Sub
SHCreateDirectoryExはフォルダの作成に成功すると0を返します。
フォルダがすでに存在していると183を返します。
まとめ
ここでは、フォルダを作成する方法とブックに名前を付けて保存する方法について説明しました。フォルダを作成するには、MkDirステートメントを使用します。
また、ブックに名前を付けて保存するには、SaveAsメソッドを使用します。どちらも使いこなすことができるように、この記事を何度も参考にして下さいね!