Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
「VBA100本ノック」に対する私の回答と解説のページです。
100本ノックの出題リストはこちらから
excel-ubara.com
出題:Excel終了とテキストファイル出力
#VBA100本ノック 32本目
開かれているブック全てを上書き保存して、Excelアプリも終了させてください。
履歴として、保存したブックのパスをテキストファィルに出力してください。
テキストファイルはマクロブックと同一フォルダに以下の名称で出力(SJIS)してください。
log_yyyymmddhhmmss.txt

◇ 出題ページはこちら
ソースコード
Option Explicit ' 100本ノック032:Excel終了とテキストファイル出力 Sub すべてのExcelファイルを上書き保存して閉じる() ' 読取専用ブックや未保存ブックが混じっていたら実行しない Dim ブック As Workbook For Each ブック In Workbooks If ブック.ReadOnly Then ブック.Activate MsgBox "このブックが読取専用のためこの処理は実行できません。" Exit Sub End If If ブック.Path = "" Then ブック.Activate MsgBox "このブックが未保存のためこの処理は実行できません。" Exit Sub End If Next ThisWorkbook.Save ' ログファイルを作成して書き込み先にセット Dim ログファイル名 As String ログファイル名 = "log_" & Format(Now(), "yyyymmddhhmmss") & ".txt" Open ThisWorkbook.Path & "\" & ログファイル名 For Output As #1 ' すべてのブックを保存して閉じる On Error GoTo ブック保存エラー For Each ブック In Workbooks ブック.Save Print #1, ブック.FullName ' 途中でエラーになる可能性を踏まえてブックは都度閉じていく If Not ブック Is ThisWorkbook Then ブック.Close Next On Error GoTo 0 ' ログファイルを閉じてExcelアプリケーションを終了 Close #1 Application.Quit Exit Sub ブック保存エラー: MsgBox "このブックの保存時にエラーが発生したため処理を中断します。" & vbLf _ & "ここまでで保存して終了できたブックはログで確認して下さい。" End Sub
解説
ブックを保存して閉じていき、最後にExcelも閉じる問題でした。
ログファイルはS-JIS形式でいいということなので、
FileSystemObjectやADODBを使わずともOpenメソッドで作成できます。
メインの処理は特に解説することはないと思いますが、
エラー処理についてはいろいろと考える必要があると思います。
今回は「開始前に読取専用や未保存ブックをチェック」し、
あとは処理中のエラーに対してはそこで停止する仕様にしています。
Application.Quitはかなりリスキーな処理ですので、
なるべく丁寧にエラー処理を行っておきましょう。