和風スパゲティのレシピ

日本語でコーディングするExcelVBA

32本目:Excel終了とテキストファイル出力

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はかなりリスキーな処理ですので、
なるべく丁寧にエラー処理を行っておきましょう。