Last Updated on 2024年6月1日
Excel VBAでファイルを保存する際、単純なコードだけでは不十分です。実務ではユーザーが遭遇する可能性のある問題を先回りして解決することが求められます。この記事では、そのための具体的なコード例と共に、注意点や工夫を紹介します。
(Initial Post Date:2024年6月1日)
ファイル保存の基本
基本コード
まず、ファイルを保存する基本的なサンプルコードを2種類示します。
①上書き保存
|
1 2 |
'上書き保存 ThisWorkbook.Save |
②名前を付けて保存
|
1 2 |
'名前を付けて保存 ThisWorkbook.SaveAs Filename:="C:\保存先\ファイル名.xlsm" 'マクロ有ブック |
Filename:= の説明
「:=」は、VBAで引数に値を渡すための演算子です。「Filename:=」と記述することで、SaveAs メソッドの Filename 引数に値を指定しています。この演算子は、引数の順序に関係なく指定できるため、コードの可読性が向上します。
ここは悩まずにサラッと読み飛ばしてください! ふ~~ん! て感じでいいです!
名前を付けて保存する 2つの方法
名前を付けてファイル保存するには、主に2つの方法があります。
- 指定フォルダに保存
- ダイアログで指定して保存
次に、それぞれの方法について詳細を説明します。
指定フォルダに保存
あらかじめ保存フォルダを指定して、ファイルを保存する簡単なサンプルコードを紹介します。
開いたファイルを指定したフォルダに保存する
|
1 2 |
'開いたファイルを指定したフォルダに保存する ActiveWorkbook.SaveAs Filename:="C:\Users\保存先ファイル名.xlsx" |
ダイアログで指定して保存
ダイアログを使ってフォルダを選択し、ユーザーに保存先フォルダを選んでもらうことで柔軟性を持たせます。

参照設定の追加
ダイアログを使用するためには、参照設定を行う必要があります。以下の手順に従って、参照設定を行ってください。
- ExcelのVBAエディタを開く
- 参照設定を開く
- 必要なライブラリを選択
以下のコードを使用します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Dim dialog As FileDialog 'フォルダ選択ダイアログオブジェクトを宣言 Dim folderPath As String '選択されたフォルダのパスを格納する変数 ' 指定したファイルを開く Workbooks.Open "C:\Users\〇〇〇\開きたいファイル名.xlsx" ' フォルダ選択ダイアログを表示 Set dialog = Application.FileDialog(msoFileDialogFolderPicker) If dialog.Show = -1 Then ' ダイアログでフォルダが選択された場合 saveFolderPath = dialog.SelectedItems(1) Else 'フォーマットファイルを保存せずに閉じる ActiveWorkbook.Close False MsgBox "キャンセルされました。", vbInformation, "終了" Exit Sub End If '選択したフォルダにファイルを保存 ActiveWorkbook.SaveAs folderPath & "\" & "保存ファイル名.xlsx" |
実務で考慮すべき点とその対応
実務では、以下のような問題や要望が予測されます。
- ファイルの存在確認: フォーマットファイルが存在しない場合にどうするか?
- 既存ファイルの上書き: 保存するファイルが既に存在する場合の対応。
- 月別フォルダの作成: 月ごとにフォルダを作成して保存したい。
- エラーハンドリング: 保存時に発生するエラーを適切に処理する。
これらの点を踏まえて、実用サンプルとして、帳票フォーマットを使用して毎日帳票を出力するツールを作成するための具体的なコードを紹介します。
(ダイアログで保存するコード)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
Sub SaveWorkbook() Dim dialog As FileDialog 'フォルダ選択ダイアログオブジェクトを宣言 Dim formatFileFullPath As String 'フォーマットファイルのフルパスを格納 Dim saveFolderPath As String '選択された保存先フォルダのパスを格納 Dim saveFileName As String '保存するファイル名を格納 Dim saveFileFullPath As String '保存するファイルフルパスを格納 Dim yearMonth As String 'フォルダ名に付加する年月 Dim yearMonthDay As String 'ファイル名に付加する年月日 エラーが発生したら、エラー処理へ飛ぶ On Error GoTo EXE_SaveError ' 自動的に表示されるExcelの確認メッセージを非表示にする Application.DisplayAlerts = False '--- フォーマットファイルを開く ------------------------------------------------ formatFileFullPath = "C:\Users\\帳票\帳票フォーマット.xlsx" ' フォーマットファイルの存在確認 If Dir(formatFileFullPath) = "" Then 'ファイルがなければメッセージを表示して処理を終わる MsgBox "フォーマットファイルが見つかりません。", vbCritical, "エラー" Exit Sub End If ' フォーマットファイルを開く Workbooks.Open formatFileFullPath '--- 保存先フォルダの指定 ------------------------------------------------- ' フォルダ選択ダイアログを表示 Set dialog = Application.FileDialog(msoFileDialogFolderPicker) If dialog.Show = -1 Then ' ダイアログでフォルダが選択された場合 saveFolderPath = dialog.SelectedItems(1) Else 'フォーマットファイルを保存せずに閉じる ActiveWorkbook.Close False MsgBox "キャンセルされました。", vbInformation, "終了" Exit Sub End If ' --- 処理月のフォルダを作成 ----------------------------------------------- yearMonth = Format(Date, "yyyymm") '今日の年月を格納 saveFolderPath = saveFolderPath & "\" & yearMonth '保存フォルダパスを格納 'フォルダの存在確認と作成 If Dir(saveFolderPath, vbDirectory) = "" Then 'フォルダがなければ作成する MkDir saveFolderPath End If ' --- 処理日を付加したファイル名を作成して保存 ----------------------------- yearMonthDay = Format(Date, "yyyymmdd") '今日の日付を格納 '保存するファイルのフルパスを格納 saveFileFullPath = saveFolderPath & "\" & "帳票_" & yearMonthDay & " .xlsx" ' ファイルの存在確認と上書き確認メッセージの表示 If Dir(saveFileFullPath) <> "" Then '上書き保存確認 If MsgBox("ファイルが存在します。上書きしますか?", vbYesNo, "確認") = vbNo Then '「No」を選択された場合は処理終了 Exit Sub End If End If 'ファイルを保存 ActiveWorkbook.SaveAs fileName:=saveFileFullPath 'ファイルを閉じる ActiveWorkbook.Close ' MsgBox "ファイルが正常に保存されました。", vbInformation, "終了" ' 自動的に表示されるExcelの確認メッセージを表示に戻す Application.DisplayAlerts = True Exit Sub ' エラーラベルはここに書く。ラベル名の後にはコロン「:」をつける EXE_SaveError: MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "エラー" ' 自動的に表示されるExcelの確認メッセージを表示に戻す Application.DisplayAlerts = True End Sub |
コードの解説
ファイルの存在確認:
|
1 2 3 4 5 6 7 |
formatFileFullPath = "C:\Users\\帳票\帳票フォーマット.xlsx" ' フォーマットファイルの存在確認 If Dir(formatFileFullPath) = "" Then 'ファイルがなければメッセージを表示して処理を終わる MsgBox "フォーマットファイルが見つかりません。", vbCritical, "エラー" Exit Sub End If |
指定されたフォーマットファイルが存在するかを確認し、存在しない場合はエラーメッセージを表示して Exit Sub で処理を中断します。
フォルダの存在確認と作成:
|
1 2 3 4 5 6 7 8 |
yearMonth = Format(Date, "yyyymm") '今日の年月を格納 saveFolderPath = saveFolderPath & "\" & yearMonth '保存フォルダパスを格納 'フォルダの存在確認と作成 If Dir(saveFolderPath, vbDirectory) = "" Then 'フォルダがなければ作成する MkDir saveFolderPath End If |
Dir(saveFolderPath,vbDirectory) = “” :Dir関数は指定されたパスのディレクトリの存在を確認します。vbDirectoryはディレクトリを示す定数です。この関数が空文字を返す場合、そのディレクトリは存在しません。MkDir saveFolderPath:MkDirステートメントは指定されたパスに新しいディレクトリを作成します。
日付フォルダの作成:
|
1 2 3 4 5 6 7 8 |
yearMonth = Format(Date, "yyyymm") '今日の年月を格納 saveFolderPath = saveFolderPath & "\" & yearMonth '保存フォルダパスを格納 'フォルダの存在確認と作成 If Dir(saveFolderPath, vbDirectory) = "" Then 'フォルダがなければ作成する MkDir saveFolderPath End If |
今日の日付を使用して今月のフォルダの存在を確認します。フォルダが存在しない場合はMkDirステートメントで作成します。
上書き確認:
|
1 2 3 4 5 6 7 8 |
' ファイルの存在確認と上書き確認メッセージの表示 If Dir(saveFileFullPath) <> "" Then '上書き保存確認 If MsgBox("ファイルが存在します。上書きしますか?", vbYesNo, "確認") = vbNo Then '「No」を選択された場合は処理終了 Exit Sub End If End If |
既存のファイルがある場合、上書きするかどうかをユーザーに確認します。MsgBox関数を使ってユーザーに上書きの確認メッセージを表示し、Noが選択された場合は処理を終了します。
エラーハンドリング:
エラーハンドリングは、プログラムが実行中に発生するエラーを適切に処理するための方法です。VBAでは、エラーハンドリングを使用して予期しないエラーが発生した場合に、プログラムがクラッシュせずに適切な処理を行うことができます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
'エラーが発生したら、エラー処理へ飛ぶ On Error GoTo EXE_SaveError ・ <実行処理を記述> ・ ThisWorkbook.SaveAs Filename:=dateFolder & fileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled MsgBox "ファイルが正常に保存されました。", vbInformation Exit Sub ' エラーラベルはここに書く。ラベル名の後にはコロン「:」をつける EXE_SaveError: MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "エラー" ' 自動的に表示されるExcelの確認メッセージを表示に戻す Application.DisplayAlerts = True |
- On Error GoTo エラーラベル名: エラーが発生した際に指定したエラーラベルにジャンプします。
- Err.Description: エラーの詳細情報を取得します。
エラーラベルの名前は自由に設定できますが、わかりやすい名前をつけることをお勧めします。例えば、EXE_SaveError や ErrorHandler などです。
まとめ
単純な保存コードに加えて、実務で必要な機能を予測して実装することで、ユーザーにとって使いやすいVBAツールを提供できます。これにより、入門者から中級者へとスキルアップが期待できます。
おわりに
この記事で紹介した方法に、さらに追加機能を実装することで、信頼性の高いVBAコードを作成できます。バックアップ機能やログ機能などは別の機会にご紹介しますね。


コメント